Detectar palavras de som semelhante em rubi
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!
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)