Question

Je suis au courant de SOUNDEX et (double) Metaphone, mais ceux-ci ne me laisse pas tester la similitude des mots dans son ensemble - par exemple « Salut » semble très similaire à « Bye », mais ces deux méthodes les marqueront comme tout à fait différent.

Y a-t-il des bibliothèques Ruby, ou les méthodes que vous connaissez, qui sont capables de déterminer la similitude entre deux mots? (Soit une valeur booléenne est / sont pas similaires, ou 40% numérique similaire)

modifier points bonus supplémentaires s'il y a une méthode facile à « goutte dans » un autre dialecte ou langue

Était-ce utile?

La solution

Je pense que vous décrivez la distance de levenshtein. Et oui, il y a des pierres précieuses pour cela. Si vous êtes en Ruby pur aller pour le petit bijou de texte.

$ gem install text

Les docs ont plus de détails, mais voici l'essentiel de celui-ci:

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

Si vous êtes ok avec des extensions natives ...

$ gem install levenshtein

Son utilisation est similaire . Il est la performance est très bonne. (Il gère ~ 1000 corrections d'orthographe par minute sur mes systèmes.)

Si vous avez besoin de savoir comment deux mots similaires sont, utilisez la distance sur la longueur de mot.

Si vous voulez un simple test de similarité, pensez à quelque chose comme ceci:

Non testé, mais tout droit:

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

Autres conseils

Vous pouvez d'abord prétraiter les mots en utilisant une base de données de thésaurus, qui convertit les mots ayant un sens similaire au même mot. Il existe différentes bases de données de thésaurus là-bas, malheureusement je ne pouvais pas trouver un gratuit décent pour l'anglais ( http: / /www.gutenberg.org/etext/3202 est celui que je trouve, mais cela ne montre pas quelles relations les mots spécifiques ont (comme similaires, en face, ce qui signifie autre, etc.), de sorte que tous les mots sur la même ligne ont certains relation, mais vous ne saurez pas ce que la relation est)

Mais par exemple pour le hongrois il y a une bonne base de données de thésaurus libre, mais vous n'avez pas soundex / metaphone pour les textes hongrois ...

Si vous avez la base de données écrit un programme qui prétraite les textes ne sont pas trop dur (en fin de compte, il est une simple recherche-remplacement, mais vous voudrez peut-être prétraiter la base de données de thésaurus à l'aide simplex ou methaphone trop)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top