Ich möchte das folgende Problem lösen: Ich habe eine Reihe von Sätzen als Datensatz, und ich möchte in der Lage sein, einen neuen Satz einzugeben und den Satz zu finden, der dem neuen Satz im Datensatz am ähnlichsten ist. Ein Beispiel würde so aussehen:
Neuer Satz: " I opened a new mailbox
"
Vorhersage basierend auf Datensatz:
Sentence | Similarity
A dog ate poop 0%
A mailbox is good 50%
A mailbox was opened by me 80%
Ich habe gelesen, dass Cosinus-Ähnlichkeit verwendet werden kann, um diese Art von Problemen zusammen mit tf-idf zu lösen (und RNNs sollten keine signifikanten Verbesserungen der grundlegenden Methoden bringen), oder auch word2vec wird für ähnliche Probleme verwendet. Sind diese auch in diesem speziellen Fall tatsächlich einsetzbar? Gibt es andere Techniken / Algorithmen, um dies zu lösen (vorzugsweise mit Python und SKLearn, aber ich bin auch offen für Informationen zu TensorFlow)?
quelle
Antworten:
Ihr Problem kann sowohl mit Word2vec als auch mit Doc2vec gelöst werden. Doc2vec würde bessere Ergebnisse liefern, da es beim Trainieren des Modells Sätze berücksichtigt.
Doc2vec-Lösung
Über diesen Link können Sie Ihr doc2vec-Modell trainieren . Möglicherweise möchten Sie einige Vorverarbeitungsschritte ausführen, z. B. das Entfernen aller Stoppwörter (Wörter wie "the", "an" usw., die dem Satz nicht viel Bedeutung verleihen). Sobald Sie Ihr Modell trainiert haben, können Sie die ähnlichen Sätze mit folgendem Code finden.
Ergebnisse:
Die obigen Ergebnisse sind eine Liste von Tupeln für
(label,cosine_similarity_score)
. Sie können die Ausgaben auf Sätze abbilden, indem Sie tuntrain[29670]
.Bitte beachten Sie, dass der oben beschriebene Ansatz nur dann gute Ergebnisse liefert, wenn Ihr doc2vec-Modell Einbettungen für Wörter enthält, die im neuen Satz gefunden wurden. Wenn Sie versuchen, Ähnlichkeit für einen Kauderwelsch-Satz wie zu erhalten
sdsf sdf f sdf sdfsdffg
, erhalten Sie nur wenige Ergebnisse, aber dies sind möglicherweise nicht die tatsächlich ähnlichen Sätze, da Ihr trainiertes Modell diese Kauderwelsch-Wörter möglicherweise beim Trainieren des Modells nicht gesehen hat. Versuchen Sie also, Ihr Modell in so vielen Sätzen wie möglich zu trainieren, um so viele Wörter wie möglich zu integrieren, um bessere Ergebnisse zu erzielen.Word2vec-Lösung
Wenn Sie word2vec verwenden, müssen Sie den Durchschnittsvektor für alle Wörter in jedem Satz berechnen und die Kosinusähnlichkeit zwischen den Vektoren verwenden.
Ähnlichkeit berechnen
quelle
sentence_1.split()
macht das gleiche.Word Mover's Distance (WMD) ist ein Algorithmus zum Ermitteln der Entfernung zwischen Sätzen. WMD basiert auf Worteinbettungen (z. B. word2vec), die die semantische Bedeutung von Wörtern in dichte Vektoren kodieren.
Beispielsweise:
Quelle: Papier "Von Word-Einbettungen zum Dokumentieren von Entfernungen"
Das gensim-Paket enthält eine WMD-Implementierung .
Für Ihr Problem würden Sie den eingegebenen Satz mit allen anderen Sätzen vergleichen und den Satz mit der niedrigsten WMD zurückgeben.
quelle
Mit sklearn können Sie eine einfache Lösung ausprobieren, die problemlos funktioniert.
Verwenden Sie tfidfvectorizer , um eine Vektordarstellung für jeden Text zu erhalten
Passen Sie den Vektorisierer an Ihre Daten an und entfernen Sie die Stoppwörter.
Transformieren Sie den neuen Eintrag mit dem zuvor trainierten Vektorisierer
Berechnen Sie die Kosinusähnlichkeit zwischen dieser Darstellung und jeder Darstellung der Elemente in Ihrem Datensatz.
Wenn Sie über einen umfangreichen Datensatz verfügen, können Sie ihn nach dem Abrufen der Darstellung und vor dem Vorhersagen neuer Daten gruppieren (z. B. mit KMeans von scikit learn).
Dieser Code führt alle diese Schritte aus. Sie können es auf meinem Github- Repo überprüfen .
quelle
Es gibt einige neuere Arbeiten, die auf Variational Auto-Encoder in RNN-Modellen basieren. Generieren von Sätzen aus einem fortlaufenden Raum mit Pytorch-Implementierungen: Github-Code .
es gelang ihnen, das semantische, syntaktische globale Merkmal eines Satzes in einen latenten Raum zu komprimieren, der möglicherweise mit einigen endlichen 10 bis 30 unabhängigen Zufallsvariablen ausgedrückt wird (faktorisierte Verteilung).
die neuartige Idee in dieser Arbeit, interpolieren sie zwischen zwei Sätzen. und die Ergebnisse waren ziemlich erstaunlich.
quelle
Die verallgemeinerte Lösung besteht aus den folgenden Schritten:
Für 1. ist word2vec die beste Wahl, aber wenn Sie word2vec nicht verwenden möchten, können Sie einige Annäherungen daran vornehmen. Eine Möglichkeit besteht darin, aus Ihren trainierten Sätzen eine Matrix von Wörtern zu erstellen , die gleichzeitig vorkommt , und TSVD darauf anzuwenden . Coccurance Matrix vonn Xn n Xd d
Sobald Sie die Worteinbettung für jedes Wort erhalten haben, können Sie eine der Ähnlichkeitsmetriken wie Cosinus-Ähnlichkeit usw. auf jeden Satz anwenden, um die Ähnlichkeit mit anderen zu messen.
quelle