Ähnlichkeit zwischen zwei Wörtern

14

Ich suche eine Python-Bibliothek, mit der ich die Ähnlichkeit zwischen zwei Wörtern oder Sätzen erkennen kann.

Ich werde eine Audio-zu-Text-Konvertierung durchführen, die zu einem englischen Wörterbuch oder einem anderen Wort als einem Wörterbuch führt (dies kann ein Name für eine Person oder eine Firma sein).

Beispiel:

1) Text in Audio-Ergebnis: Danke, dass Sie America Expansion angerufen haben, wird mit American Express verglichen .

Beide Sätze sind irgendwie ähnlich, aber nicht gleich.

Es sieht so aus, als müsste ich untersuchen, wie viele Zeichen sie gemeinsam haben. Irgendwelche Ideen werden großartig sein. Sieht nach einer Funktion aus, die der Google-Suche "Meinten Sie" ähnelt.

Gogasca
quelle

Antworten:

13

Der nächstgelegene wäre, wie Jan in seiner Antwort erwähnt hat, die Entfernung nach Levenstein (im Volksmund auch als Bearbeitungsentfernung bezeichnet).

In der Informationstheorie und der Informatik ist der Levenshtein-Abstand eine String-Metrik zur Messung der Differenz zwischen zwei Sequenzen. Informell ausgedrückt ist der Abstand zwischen zwei Wörtern in Levenshtein die minimale Anzahl von Einzelzeichenänderungen (dh Einfügungen, Löschungen oder Ersetzungen), die erforderlich sind, um ein Wort in das andere zu ändern.

Es ist eine sehr häufig verwendete Metrik zur Identifizierung ähnlicher Wörter. Nltk hat bereits eine Implementierung für die Bearbeitungsdistanzmetrik, die folgendermaßen aufgerufen werden kann:

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

Der obige Code würde zurückkehren 1, da sich nur ein Buchstabe zwischen den beiden Wörtern unterscheidet.

Dawny33
quelle
1
Lavenshtiens Entfernung ist der schlechteste Algorithmus, den Sie verwenden können, wenn NLP das ist, was Sie vorhaben. Wenn zwei Synonyme einen unterschiedlichen Zeichensatz haben, ist die Leistung von LD in diesen Fällen sehr schlecht.
Es ist eine Falle
9

Abgesehen von sehr guten Antworten können Sie SequenceMatcher in einer anderen Python-Bibliothek ausprobieren.

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

Betrachten Sie nun den folgenden Code:

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

Jetzt können Sie den d-Wert vergleichen, um die Ähnlichkeit zu bewerten.

SVK
quelle
1
Wenn Sie der Meinung sind, dass seq.ratio () langsam ist, können Sie seq.quick_ratio ()
Nabin,
7

Wenn Ihr Wörterbuch nicht zu groß ist, ist es ein gängiger Ansatz, die Levenshtein-Distanz zu ermitteln, die im Grunde zählt, wie viele Änderungen Sie vornehmen müssen, um von einem Wort zum anderen zu gelangen. Änderungen umfassen das Ändern eines Zeichens, das Entfernen eines Zeichens oder das Hinzufügen eines Zeichens. Ein Beispiel aus Wikipedia :

lev (Kätzchen, sitzend) = 3

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

Hier sind einige Python-Werkzeuge für Wikibooks.

Der Algorithmus zur Berechnung dieser Abstände ist jedoch nicht billig. Wenn Sie dies in großem Maßstab tun müssen, gibt es Möglichkeiten, die Kosinusähnlichkeit für Bi-Gramm-Vektoren zu verwenden, die viel schneller und einfacher zu verteilen sind, wenn Sie Übereinstimmungen für viele Wörter gleichzeitig finden müssen. Sie sind jedoch nur eine Annäherung an diese Entfernung.

Jan van der Vegt
quelle
(+1) für den Lev. Entfernungsmetrik. nltk wird mit einer vorgefertigten Implementierung geliefert. Cosine Ähnlichkeit ist kein gutes Maß für die String-Ähnlichkeit IMHO :)
Dawny33
Ich bin damit einverstanden, dass es viel schlimmer ist als die Levenshtein-Distanz, aber wenn Sie eine Fuzzy-Übereinstimmung zwischen zwei Millionen-Datensätzen benötigen, kann dies aufgrund einiger Tricks und Matrixmultiplikation in angemessener Zeit geschehen
Jan van der Vegt
1
@ Dawny33 da würde ich nicht zustimmen. Nicht nur, dass die Kosinusähnlichkeit bei mir sehr schnell funktioniert hat, sondern auch, da das richtige n-Gramm verwendet wurde, sehr genau.
Mohit Motwani
3

Eine alte und bekannte Vergleichstechnik ist der Soundex- Algorithmus. Die Idee ist, nicht die Wörter selbst zu vergleichen, sondern nur ungefähre Angaben darüber, wie sie ausgesprochen werden. Inwieweit dies die Qualität der Ergebnisse tatsächlich verbessert, weiß ich nicht.

Es fühlt sich jedoch etwas seltsam an, Soundex auf Ergebnisse einer Spracherkennung anzuwenden. Sie werfen zuerst Informationen darüber weg, wie die Wörter ausgesprochen werden, und versuchen dann, sie erneut hinzuzufügen. Es wäre besser, diese beiden Phasen zu kombinieren.

Daher erwarte ich, dass die neueste Technologie in diesem Bereich dies tut und eine Form der adaptiven Klassifizierung ist, z. B. basierend auf neuronalen Netzen. Google gibt aktuelle Forschungsergebnisse zur Spracherkennung mit neuronalen Netzen zurück .

reinierpost
quelle