Pergunta

Estou ciente do SoundEx e (duplo) metaphone, mas estes não me permitem testar a semelhança de palavras como um todo - por exemplo "oi" soa muito semelhante a "tchau", mas esses dois métodos os marcarão tão completamente diferente.

Existem bibliotecas em Ruby, ou quaisquer métodos que você conhece, que são capazes de determinar a semelhança entre duas palavras? (Ou um booleano é/não é semelhante, ou 40% numéricos semelhantes)

editar: Pontos de bônus extras se houver um método fácil de 'cair' um dialeto ou idioma diferente!

Foi útil?

Solução

Eu acho que você está descrevendo a distância de Levenshtein. E sim, existem jóias para isso. Se você gosta de rubi puro, vá para a jóia de texto.

$ gem install text

Os documentos Tenha mais detalhes, mas aqui está o ponto crucial:

Text::Levenshtein.distance('test', 'test')    # => 0
Text::Levenshtein.distance('test', 'tent')    # => 1

Se você está bem com extensões nativas ...

$ gem install levenshtein

Seu uso é semelhante. Seu desempenho é muito bom. (Ele lida com ~ 1000 correções de ortografia por minuto em meus sistemas.)

Se você precisar saber como duas palavras são semelhantes, use a distância sobre o comprimento das palavras.

Se você deseja um teste de similaridade simples, considere algo assim:

Não testado, mas direto:

String.module_eval do
   def similar?(other, threshold=2)
    distance = Text::Levenshtein.distance(self, other)
    distance <= threshold
  end
end

Outras dicas

Você pode primeiro pré -processar as palavras usando um banco de dados de Thesaurus, que converterá palavras com significado semelhante à mesma palavra. Existem vários bancos de dados de thesaurus por aí, infelizmente não consegui encontrar um livre decente para o inglês ( http://www.gutenberg.org/etext/3202 é o que eu encontrei, mas isso não mostra quais relações as palavras específicas têm (como similar; oposto; significado alternativo; etc.), então todas as palavras na mesma linha têm algum relação, mas você não saberá qual é essa relação)

Mas, por exemplo, para húngaro, há um bom banco de dados de sinônimos gratuitos, mas você não tem SoundEx/Metaphone para textos húngaros ...

Se você tem o banco de dados escrevendo um programa que pré-processos, os textos não são muito difíceis (em última análise, é um substituto simples, mas você pode querer pré-processar o banco de dados do sinônimo usando simplex ou metafone também)

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