Laut Gensim Word2Vec kann ich das word2vec-Modell im Gensim-Paket verwenden, um die Ähnlichkeit zwischen zwei Wörtern zu berechnen.
z.B
trained_model.similarity('woman', 'man')
0.73723527
Das word2vec-Modell kann jedoch die Satzähnlichkeit nicht vorhersagen. Ich finde das LSI-Modell mit Satzähnlichkeit in Gensim heraus, aber das scheint nicht mit dem word2vec-Modell kombiniert zu werden. Die Länge des Korpus jedes Satzes, den ich habe, ist nicht sehr lang (kürzer als 10 Wörter). Gibt es also einfache Möglichkeiten, um das Ziel zu erreichen?
Antworten:
Dies ist eigentlich ein ziemlich herausforderndes Problem, das Sie fragen. Das Berechnen der Satzähnlichkeit erfordert das Erstellen eines grammatikalischen Modells des Satzes, das Verstehen äquivalenter Strukturen (z. B. "er ging gestern zum Laden" und "gestern ging er zum Laden") und das Finden von Ähnlichkeit nicht nur in den Pronomen und Verben, sondern auch in der Eigennamen, Auffinden statistischer Koexistenz / Beziehungen in vielen realen Textbeispielen usw.
Das Einfachste, was Sie versuchen könnten - obwohl ich nicht weiß, wie gut dies funktionieren würde und es Ihnen sicherlich nicht die optimalen Ergebnisse bringen würde - wäre, zuerst alle "Stopp" -Wörter (Wörter wie "das", "ein" zu entfernen "usw., die dem Satz nicht viel Bedeutung verleihen) und dann word2vec für die Wörter in beiden Sätzen ausführen, die Vektoren in dem einen Satz summieren, die Vektoren im anderen Satz aufsummieren und dann den Unterschied zwischen finden die Summen. Wenn Sie sie zusammenfassen, anstatt einen wortweisen Unterschied zu machen, unterliegen Sie zumindest nicht der Wortreihenfolge. Davon abgesehen wird dies in vielerlei Hinsicht scheitern und ist keineswegs eine gute Lösung (obwohl gute Lösungen für dieses Problem fast immer ein gewisses Maß an NLP, maschinellem Lernen und anderer Klugheit erfordern).
Die kurze Antwort lautet also: Nein, es gibt keine einfache Möglichkeit, dies zu tun (zumindest nicht, um es gut zu machen).
quelle
Da Sie gensim verwenden, sollten Sie wahrscheinlich die doc2vec-Implementierung verwenden. doc2vec ist eine Erweiterung von word2vec auf Phrasen-, Satz- und Dokumentebene. Es ist eine ziemlich einfache Erweiterung, die hier beschrieben wird
http://cs.stanford.edu/~quocle/paragraph_vector.pdf
Gensim ist nett, weil es intuitiv, schnell und flexibel ist. Was großartig ist, ist, dass Sie die vorab trainierten Worteinbettungen von der offiziellen word2vec-Seite abrufen können und die syn0-Ebene des Doc2Vec-Modells von gensim freigelegt wird, sodass Sie die Worteinbettungen mit diesen hochwertigen Vektoren erstellen können!
GoogleNews-vectors-negative300.bin.gz (wie in Google Code verlinkt )
Ich denke, Gensim ist definitiv das einfachste (und für mich bisher beste) Werkzeug, um einen Satz in einen Vektorraum einzubetten.
Es gibt andere Satz-zu-Vektor-Techniken als die oben in Le & Mikolovs Artikel vorgeschlagene. Socher und Manning aus Stanford sind sicherlich zwei der bekanntesten Forscher auf diesem Gebiet. Ihre Arbeit basiert auf dem Prinzip der Komposition - die Semantik des Satzes stammt aus:
Sie haben einige solcher Modelle vorgeschlagen (die immer komplexer werden), um mithilfe der Komposition Kompositionen auf Satzebene zu erstellen.
2011 - Entfaltung eines rekursiven Autoencoders (sehr vergleichsweise einfach. Bei Interesse hier beginnen)
2012 - Matrix-Vektor-Neuronales Netzwerk
2013 - neuronales Tensornetzwerk
2015 - Baum LSTM
Seine Papiere sind alle auf socher.org erhältlich. Einige dieser Modelle sind verfügbar, aber ich würde trotzdem gensims doc2vec empfehlen. Zum einen ist die URAE 2011 nicht besonders leistungsstark. Darüber hinaus ist es mit Gewichten ausgestattet, die zum Paraphrasieren von Nachrichtendaten geeignet sind. Mit dem von ihm bereitgestellten Code können Sie das Netzwerk nicht neu trainieren. Sie können auch nicht in verschiedene Wortvektoren tauschen, sodass Sie bei den Einbettungen von Turian vor Word2vec aus dem Jahr 2011 nicht weiterkommen. Diese Vektoren befinden sich sicherlich nicht auf der Ebene von word2vec oder GloVe.
Ich habe noch nicht mit dem Tree LSTM gearbeitet, aber es scheint sehr vielversprechend!
tl; dr Ja, benutze gensims doc2vec. Es gibt aber auch andere Methoden!
quelle
Wenn Sie word2vec verwenden, müssen Sie den Durchschnittsvektor für alle Wörter in jedem Satz / Dokument berechnen und die Kosinusähnlichkeit zwischen Vektoren verwenden:
Ähnlichkeit berechnen:
quelle
Sie können den Distanzalgorithmus von Word Mover verwenden. Hier ist eine einfache Beschreibung über Massenvernichtungswaffen .
Ps: Wenn beim Importieren der Pyemd- Bibliothek ein Fehler auftritt , können Sie ihn mit dem folgenden Befehl installieren:
quelle
Sobald Sie die Summe der beiden Sätze von Wortvektoren berechnet haben, sollten Sie den Kosinus zwischen den Vektoren und nicht den Diff nehmen. Der Kosinus kann berechnet werden, indem das Punktprodukt der beiden normalisierten Vektoren genommen wird. Somit ist die Wortzahl kein Faktor.
quelle
Es gibt eine Funktion aus der Dokumentation, die eine Liste von Wörtern erstellt und deren Ähnlichkeiten vergleicht.
quelle
Ich möchte die vorhandene Lösung aktualisieren, um den Personen zu helfen, die die semantische Ähnlichkeit von Sätzen berechnen werden.
Schritt 1:
Laden Sie das geeignete Modell mit gensim, berechnen Sie die Wortvektoren für die Wörter im Satz und speichern Sie sie als Wortliste
Schritt 2: Berechnen des Satzvektors
Die Berechnung der semantischen Ähnlichkeit zwischen Sätzen war zuvor schwierig, aber kürzlich wurde ein Artikel mit dem Titel " EINFACHE, ABER SCHWERE BASELINE FÜR SENTENZEMBEDDINGS " vorgeschlagen, der einen einfachen Ansatz vorschlägt, indem der gewichtete Durchschnitt der Wortvektoren im Satz berechnet und dann entfernt wird die Projektionen der Durchschnittsvektoren auf ihre erste Hauptkomponente. Hier ist das Gewicht eines Wortes w a / (a + p (w)), wobei a ein Parameter ist und p (w) die (geschätzte) Wortfrequenz, die als glatte inverse Frequenz bezeichnet wird Diese Methode arbeitet deutlich besser.
Ein einfacher Code , um den Satz Vektor unter Verwendung von SIF (glatt inverser Frequenz) , um das vorgeschlagene Verfahren in dem Papier zu berechnen gegeben wurde hier
Schritt 3: Verwenden von sklearn cosine_similarity Laden Sie zwei Vektoren für die Sätze und berechnen Sie die Ähnlichkeit.
Dies ist die einfachste und effizienteste Methode zur Berechnung der Satzähnlichkeit.
quelle
Ich benutze die folgende Methode und es funktioniert gut. Sie müssen zuerst einen POSTagger ausführen und dann Ihren Satz filtern, um die Stoppwörter (Determinanten, Konjunktionen, ...) zu entfernen. Ich empfehle TextBlob APTagger . Dann erstellen Sie ein word2vec, indem Sie den Mittelwert jedes Wortvektors im Satz nehmen. Die Methode n_similarity in Gemsim word2vec macht genau das, indem sie zwei Sätze von Wörtern zum Vergleichen übergibt .
quelle
Es gibt Erweiterungen von Word2Vec, mit denen das Problem des Vergleichs längerer Textteile wie Phrasen oder Sätze gelöst werden soll. Eine davon ist Absatz2vec oder Doc2vec.
"Verteilte Darstellungen von Sätzen und Dokumenten" http://cs.stanford.edu/~quocle/paragraph_vector.pdf
http://rare-technologies.com/doc2vec-tutorial/
quelle
Gensim implementiert ein Modell namens Doc2Vec zum Einbetten von Absätzen .
Es gibt verschiedene Tutorials, die als IPython-Notizbücher vorgestellt werden:
Eine andere Methode basiert auf Word2Vec und Word Mover's Distance (WMD) , wie in diesem Tutorial gezeigt:
Eine alternative Lösung wäre, sich auf durchschnittliche Vektoren zu stützen:
Wenn Sie Tensorflow ausführen können, können Sie Folgendes versuchen: https://tfhub.dev/google/universal-sentence-encoder/2
quelle
Ich habe die Methoden der vorherigen Antworten ausprobiert. Es funktioniert, aber der Hauptnachteil davon ist, dass je länger die Sätze sind, desto größer die Ähnlichkeit ist (um die Ähnlichkeit zu berechnen, verwende ich den Cosinus-Score der beiden mittleren Einbettungen von zwei beliebigen Sätzen), da je mehr Wörter, desto positiver die semantischen Effekte wird dem Satz hinzugefügt.
Ich dachte, ich sollte meine Meinung ändern und stattdessen die Satzeinbettung verwenden, wie in diesem und diesem Artikel untersucht .
quelle
Die Facebook-Forschungsgruppe hat eine neue Lösung namens InferSent veröffentlicht. Ergebnisse und Code werden auf Github veröffentlicht. Überprüfen Sie deren Repo. Es ist ziemlich großartig. Ich plane es zu benutzen. https://github.com/facebookresearch/InferSent
ihr Papier https://arxiv.org/abs/1705.02364 Zusammenfassung: Viele moderne NLP-Systeme basieren auf Worteinbettungen, die zuvor unbeaufsichtigt auf großen Korpora trainiert wurden, als Basismerkmale. Die Bemühungen, Einbettungen für größere Textblöcke wie Sätze zu erhalten, waren jedoch nicht so erfolgreich. Mehrere Versuche, unbeaufsichtigte Darstellungen von Sätzen zu lernen, sind nicht zufriedenstellend genug, um weit verbreitet zu sein. In diesem Artikel zeigen wir, wie universelle Satzdarstellungen, die unter Verwendung der überwachten Daten der Stanford Natural Language Inference-Datensätze trainiert wurden, unbeaufsichtigte Methoden wie SkipThought-Vektoren bei einer Vielzahl von Übertragungsaufgaben durchweg übertreffen können. Ähnlich wie Computer Vision ImageNet verwendet, um Funktionen zu erhalten, die dann auf andere Aufgaben übertragen werden können. Unsere Arbeit zeigt tendenziell die Eignung der Inferenz natürlicher Sprache für den Transfer des Lernens auf andere NLP-Aufgaben. Unser Encoder ist öffentlich verfügbar.
quelle
Wenn Sie Word2Vec nicht verwenden, haben wir ein anderes Modell, um es mit BERT zum Einbetten zu finden. Unten finden Sie den Referenzlink https://github.com/UKPLab/sentence-transformers
Anderer Link folgt https://github.com/hanxiao/bert-as-service
quelle