Pergunta

entrada:frase 1, frase 2

saída:valor de similaridade semântica (entre 0 e 1), ou a probabilidade de essas duas frases estarem falando sobre a mesma coisa

Foi útil?

Solução


Você pode querer verificar este artigo:

Similaridade de frases com base em redes semânticas e estatísticas de corpus (PDF)

Eu implementei o algoritmo descrito.Nosso contexto era muito geral (efetivamente quaisquer duas frases em inglês) e descobrimos que a abordagem adotada era muito lenta e os resultados, embora promissores, não eram bons o suficiente (ou provavelmente seriam assim sem um esforço extra considerável).

Você não fornece muito contexto, então não posso necessariamente recomendar isso, mas a leitura do artigo pode ser útil para você entender como resolver o problema.

Cumprimentos,

Matt.

Outras dicas

Há uma resposta curta e uma longa para isso.

A resposta curta:

Use o Pacote Perl WordNet::Similarity.Se Perl não for sua linguagem preferida, verifique o Página do projeto WordNet em Princeton, ou pesquise no Google uma biblioteca wrapper.

A resposta longa:

Determinar a semelhança de palavras é uma questão complicada e as pesquisas ainda são muito intensas nessa área.Para calcular a similaridade, você precisa de uma representação apropriada do significado de uma palavra.Mas o que seria uma representação do significado de, digamos, “cadeira”?Na verdade, o que é o significado exato de 'cadeira'?Se você pensar muito sobre isso, isso irá distorcer sua mente, você ficará um pouco louco e, finalmente, seguirá uma carreira de pesquisa em Filosofia ou Lingüística Computacional para encontrar a verdade™.Tanto filósofos como linguistas tentaram encontrar uma resposta durante literalmente milhares de anos, e não há fim à vista.

Portanto, se você estiver interessado em explorar esse problema um pouco mais a fundo, recomendo fortemente a leitura do Capítulo 20.7 em Processamento de fala e linguagem por Jurafsky e Martin, alguns dos quais estão disponíveis através Google Livros.Ele fornece uma visão geral muito boa do estado da arte dos métodos de distribuição, que usam estatísticas de coocorrência de palavras para definir uma medida de similaridade de palavras.No entanto, não é provável que você encontre bibliotecas implementando isso.

Você pode querer verificar o WordNet projeto na Universidade de Princeton.Uma abordagem possível para isso seria primeiro executar cada frase em uma lista de palavras irrelevantes (para remover palavras "comuns", como "a", "to", "the", etc.). cada frase, você poderia calcular a "semelhança" semântica entre cada uma das palavras da outra frase usando uma medida de distância baseada no WordNet.A medida de distância poderia ser algo como:o número de arcos que você precisa passar no WordNet para ir da palavra1 à palavra2.

Desculpe, isso é de alto nível.Obviamente nunca tentei isso.Apenas um pensamento rápido.

Eu examinaria a indexação semântica latente para isso.Acredito que você pode criar algo semelhante a um índice de pesquisa de espaço vetorial, mas com termos semanticamente relacionados mais próximos, ou seja,tendo um ângulo menor entre eles.Se eu aprender mais postarei aqui.

Para quem está começando agora, sugiro dar uma olhada em SEMILAR - http://www.semanticsimilarity.org/ .Eles implementam muitos métodos de pesquisa modernos para calcular semelhanças de palavras e frases.Está escrito em Java.

A API SEMILAR vem com vários métodos de similaridade baseados em Wordnet, Análise Semântica Latente (LSA), Alocação de Dirichlet Latente (LDA), BLEU, Meteor, Informação Mútua Pontual (PMI), métodos baseados em dependência, métodos otimizados baseados em Atribuição Quadrática, etc.E os métodos de similaridade funcionam em diferentes granularidades – palavra a palavra, frase a frase ou textos maiores.

Desculpe desenterrar uma pergunta de 6 anos, mas como acabei de encontrar este post hoje, responderei caso alguém esteja procurando por algo semelhante.

cortical.io desenvolveu um processo para calcular a semelhança semântica de duas expressões e elas possuem um demonstração disso em seu site.Eles oferecem um API gratuita que fornece acesso à funcionalidade, para que você possa usá-lo em seu próprio aplicativo sem precisar implementar o algoritmo sozinho.

Uma solução simples é usar o produto escalar de vetores de n-gramas de caracteres.Isso é robusto em relação às alterações de pedido (o que muitas métricas de distância de edição não são) e captura muitos problemas relacionados à lematização.Também evita o problema completo da IA ​​​​de compreensão semântica total.

Para calcular o vetor n-grama, basta escolher um valor de n (digamos, 3) e transformar cada sequência de 3 palavras na frase em um vetor.Normalize o vetor para comprimento unitário e, em seguida, calcule o produto escalar de diferentes vetores para detectar similaridade.

Esta abordagem foi descrita emJ.Mitchell e M.Lapata, “Composição em Modelos Distribucionais de Semântica”, Ciência Cognitiva, vol.34, não.8, pp.1388–1429, novembro.2010., DOI 10.1111/j.1551-6709.2010.01106.x

Eu daria uma olhada nas técnicas estatísticas que levam em consideração a probabilidade de cada palavra aparecer em uma frase.Isto permitirá que você dê menos importância a palavras populares como 'e', ​​'ou', 'o' e dê mais importância a palavras que aparecem com menos regularidade e que são, portanto, um melhor fator de discriminação.Por exemplo, se você tiver duas frases:

1) O algoritmo Smith-Waterman fornece uma medida de similaridade entre duas strings.2) Revisamos o algoritmo Smith-Waterman e descobrimos que ele é bom o suficiente para o nosso projeto.

O fato de as duas frases compartilharem as palavras "smith-waterman" e as palavras "algoritmos" (que não são tão comuns como 'e', ​​'ou', etc.), permitirá que você diga que as duas frases podem de fato estar falando sobre o mesmo assunto.

Resumindo, sugiro que você dê uma olhada em:1) Medidas de similaridade de strings;2) Métodos estatísticos;

Espero que isto ajude.

Tentar SimService, que fornece um serviço para calcular as n principais palavras semelhantes e a similaridade de frases.

Isso requer que seu algoritmo realmente saiba do que você está falando.Isso pode ser feito de forma rudimentar, apenas comparando palavras e procurando sinônimos, etc., mas qualquer tipo de resultado preciso exigiria alguma forma de inteligência.

Dê uma olhada http://mkusner.github.io/publications/WMD.pdf Este artigo descreve um algoritmo chamado distância do Word Mover que tenta descobrir similaridade semântica.Ele se baseia nas pontuações de similaridade ditadas pelo word2vec.Integrar isso com GoogleNews-vectors-negative300 produz resultados desejáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top