Detectar palabras que suenan similares en Rubí
Pregunta
Soy consciente de SOUNDEX y (doble) Metaphone, pero estos no me dejan prueba para la similitud de las palabras como un todo - por ejemplo sonidos "Hola" muy similares a "adiós", pero ambos de estos métodos los marcará como completamente diferente.
¿Hay bibliotecas en Ruby, o cualquier método que conocemos, que son capaces de determinar la similitud entre dos palabras? (Ya sea un booleano es / no es similar, o numérica 40% similar)
editar: puntos extra si hay un método fácil de 'caída de' un dialecto o idioma diferente
Solución
creo que estás describiendo distancia levenshtein. Y sí, hay joyas para eso. Si usted está en Ruby puro ir a por el tesoro de texto.
$ gem install text
Los documentos tienen más detalles, pero aquí está el quid de la cuestión:
Text::Levenshtein.distance('test', 'test') # => 0
Text::Levenshtein.distance('test', 'tent') # => 1
Si estás bien con extensiones nativas ...
$ gem install levenshtein
uso Es es similar. el rendimiento es de es muy bueno. (Maneja ~ 1000 correcciones de ortografía por minuto en mis sistemas.)
Si lo que necesita saber qué tan similares son dos palabras, el uso de distancia sobre la longitud de la palabra.
Si quieres una prueba de similitud simple, considerar algo como esto:
No probado, pero sencillo:
String.module_eval do
def similar?(other, threshold=2)
distance = Text::Levenshtein.distance(self, other)
distance <= threshold
end
end
Otros consejos
En primer lugar, podría preprocesar las palabras que utilizan una base de datos de sinónimos, que convertirá las palabras de significado similar a la misma palabra. Hay varias bases de datos de tesauro por ahí, por desgracia no pude encontrar uno libre decente para Inglés ( http: / /www.gutenberg.org/etext/3202 es el que me encontré, pero esto no quiere mostrar qué relaciones tienen las palabras específicas (como similares; opuesto; significado alternativo; etc.), por lo que todas las palabras en la misma línea tiene algunos relación, pero usted no sabe lo que es relación)
Pero por ejemplo para Hungría hay una buena base de datos de diccionario de sinónimos libre, pero usted no tiene soundex / metaphone de textos húngaro ...
Si usted tiene la base de datos escribiendo un programa que procesa previamente los textos no es demasiado difícil (en última instancia, es una simple búsqueda en reemplazar, pero puede que desee para preprocesar la base de datos de tesauro usando simplex o methaphone también)