Similitude entre deux mots

15

Je recherche une bibliothèque Python qui m'aide à identifier la similitude entre deux mots ou phrases.

Je ferai une conversion audio en texte qui se traduira par un dictionnaire anglais ou des mots non-dictionnaire (cela pourrait être un nom de personne ou d'entreprise) Après cela, je dois le comparer à un ou plusieurs mots connus.

Exemple:

1) Résultat texte en audio: Merci d'avoir appelé America Expansion sera comparé à American Express .

Les deux phrases sont en quelque sorte similaires mais pas identiques.

On dirait que j'ai peut-être besoin de voir combien de caractères ils partagent. Toutes les idées seront géniales. On dirait une fonctionnalité telle que la recherche Google "vouliez-vous dire"

gogasca
la source

Réponses:

14

Le plus proche serait comme Jan l'a mentionné dans sa réponse, la distance de Levenstein (aussi appelée populairement la distance d'édition).

En théorie de l'information et en informatique, la distance de Levenshtein est une métrique de chaîne pour mesurer la différence entre deux séquences. De manière informelle, la distance Levenshtein entre deux mots est le nombre minimum de modifications à un seul caractère (c.-à-d. Insertions, suppressions ou substitutions) nécessaires pour changer un mot en l'autre.

Il s'agit d'une métrique très couramment utilisée pour identifier des mots similaires. Nltk a déjà une implémentation pour la métrique de distance d'édition, qui peut être invoquée de la manière suivante:

import nltk
nltk.edit_distance("humpty", "dumpty")

Le code ci-dessus reviendrait 1, car une seule lettre est différente entre les deux mots.

Dawny33
la source
1
La distance de Lavenshtien est le pire algorithme que vous pouvez utiliser si la PNL est ce que vous avez l'intention de faire. Si 2 synonymes ont un jeu de caractères différent, LD fonctionnera très mal dans ces cas.
C'est un piège le
8

En dehors de très bonnes réponses ici, vous pouvez essayer SequenceMatcher dans la bibliothèque python difflib.

https://docs.python.org/2/library/difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

Considérez maintenant le code ci-dessous:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

Vous pouvez maintenant comparer la valeur d pour évaluer la similitude.

SVK
la source
1
Si vous pensez que seq.ratio () est lent, vous pouvez utiliser seq.quick_ratio ()
Nabin
6

Si votre dictionnaire n'est pas trop grand, une approche courante consiste à prendre la distance Levenshtein, qui compte essentiellement le nombre de changements que vous devez apporter pour passer d'un mot à un autre. Les changements incluent la modification d'un personnage, la suppression d'un personnage ou l'ajout d'un personnage. Un exemple de Wikipedia :

lev (chaton, assis) = 3

  • k itten -> s itten
  • sitt e n -> sitt i n
  • sittin -> sittin g

Voici quelques implémentations Python sur Wikibooks.

Cependant, l'algorithme pour calculer ces distances n'est pas bon marché. Si vous devez le faire à grande échelle, il existe des moyens d'utiliser la similitude en cosinus sur des vecteurs bi-gramme qui sont beaucoup plus rapides et faciles à distribuer si vous avez besoin de trouver des correspondances pour beaucoup de mots à la fois. Ils ne sont cependant qu'une approximation de cette distance.

Jan van der Vegt
la source
(+1) pour le Lev. distance métrique. nltk est livré avec une implémentation prête à l'emploi. La similitude de cosinus n'est pas une bonne mesure de similitude de chaîne à
mon humble avis
Je suis d'accord que c'est bien pire que la distance de Levenshtein mais si vous avez besoin d'une correspondance floue entre 2 jeux de données de millions, cela peut en fait le faire dans un délai raisonnable en raison de la nécessité de quelques astuces et d'une multiplication de matrice
Jan van der Vegt
1
@ Dawny33, je ne suis pas d'accord. Non seulement la similitude du cosinus a fonctionné très rapidement pour moi, mais aussi très précisément étant donné que le bon n-gramme a été utilisé.
Mohit Motwani
3

L' algorithme Soundex est une technique de comparaison ancienne et bien connue . L'idée est de comparer non pas les mots eux-mêmes mais des approximations de leur prononciation. Dans quelle mesure cela améliore réellement la qualité des résultats, je ne sais pas.

Cependant, il semble un peu étrange d'appliquer quelque chose comme Soundex aux résultats d'un moteur de reconnaissance vocale. D'abord, vous jetez des informations sur la façon dont les mots sont prononcés, puis vous essayez de les ajouter à nouveau. Il serait préférable de combiner ces deux phases.

Par conséquent, je m'attends à ce que la technologie de pointe dans ce domaine le fasse et soit une forme de classification adaptative, par exemple basée sur des réseaux de neurones. Google renvoie des recherches récentes sur la reconnaissance vocale avec les réseaux de neurones .

reinierpost
la source