Es gibt verschiedene Möglichkeiten, dies zu tun, je nachdem, wie viele semantische Informationen Sie behalten möchten und wie einfach das Token Ihrer Dokumente ist (HTML-Dokumente sind wahrscheinlich nur schwer zu token, aber Sie könnten möglicherweise etwas mit Tags und Kontext tun .)
Einige von ihnen wurden von ffriend erwähnt, und die Absatzvektoren von user1133029 sind wirklich solide, aber ich dachte nur, ich würde etwas mehr über Plusses und Minuspunkte verschiedener Ansätze erzählen.
- Kosinusdistanz - Eine echte Kosinusdistanz ist wahrscheinlich die häufigste Distanzmetrik, die generisch für mehrere Domänen verwendet wird. Trotzdem gibt es nur sehr wenige Informationen in der Kosinusdistanz, die tatsächlich auf irgendetwas Semantisches abgebildet werden können, was für diese Situation nicht ideal zu sein scheint.
- Levenshtein Distance ( Levenshtein-Abstand) - Auch bekannt als
edit distance
, dies wird normalerweise nur auf der Ebene der einzelnen Token verwendet (Wörter, Bigramme usw.). Im Allgemeinen würde ich diese Metrik nicht empfehlen, da sie nicht nur semantische Informationen verwirft, sondern auch sehr unterschiedliche Wortänderungen sehr ähnlich behandelt. Sie ist jedoch eine äußerst häufige Metrik für diese Art von Dingen
- LSA - Ist ein Teil eines großen Arsenals von Techniken, wenn es um die Bewertung der Ähnlichkeit von Dokumenten geht
topic modeling
. LSA ist in letzter Zeit aus der Mode gekommen, und meiner Erfahrung nach ist es nicht ganz der stärkste Ansatz zur Themenmodellierung, aber es ist relativ einfach zu implementieren und verfügt über einige Open-Source-Implementierungen
- LDA - Ist auch eine Technik, die verwendet wird
topic modeling
, unterscheidet sich jedoch darin, LSA
dass sie interne Darstellungen lernt, die in der Regel flüssiger und intuitiver sind. Im Allgemeinen sind die Ergebnisse, die Sie erhalten, LDA
für die Modellierung der Dokumentähnlichkeit besser als LSA
, aber nicht ganz so gut, um zu lernen, wie man stark zwischen Themen unterscheidet.
- Pachinko Allocation - Ist eine wirklich nette Erweiterung zu LDA. Im Allgemeinen ist dies nur eine deutlich verbesserte Version von
LDA
. Der einzige Nachteil ist, dass die Schulung etwas länger dauert und Open-Source-Implementierungen etwas schwieriger zu bekommen sind
- word2vec - Google hat an einer Reihe von Techniken gearbeitet, mit denen Wörter und Dokumente auf intelligente Weise auf vernünftigere Vektoren reduziert werden können als mit Techniken wie
Count Vectorizers
und TF-IDF
. Word2vec ist großartig, da es eine Reihe von Open-Source-Implementierungen enthält. Sobald Sie den Vektor haben, kann jede andere Ähnlichkeitsmetrik (z. B. der Kosinusabstand) mit deutlich höherer Effizienz verwendet werden.
- doc2vec - Auch bekannt als
paragraph vectors
: Dies ist die neueste und beste in einer Reihe von Veröffentlichungen von Google, die sich mit dichten Vektordarstellungen von Dokumenten befassen . Die gensim
Implementierung der Bibliothek in Python word2vec
ist so einfach, dass sie mit vertretbarem Aufwand erstellt werden kann. doc2vec
Denken Sie jedoch an die Lizenz, wenn Sie diesen Weg beschreiten möchten
Hoffe das hilft, lass es mich wissen, wenn du irgendwelche Fragen hast.
Empirisch habe ich festgestellt, dass LSA LDA jedes Mal und bei jedem Datensatz, an dem ich es ausprobiert habe, weit überlegen ist. Ich habe mit anderen Menschen gesprochen, die dasselbe gesagt haben. Es wurde auch verwendet, um eine Reihe von SemEval-Wettbewerben für das Messen der semantischen Ähnlichkeit zwischen Dokumenten zu gewinnen, häufig in Kombination mit einem auf Wordnet basierenden Maß für Themenmodellierung und nicht semantische Ähnlichkeit in meiner Erfahrung, im Gegensatz zu dem, was einige Responder angegeben haben.
Wenn Sie gensim (eine Python-Bibliothek) verwenden, hat es LSA, LDA und word2vec, so dass Sie das 3. doc2vec leicht vergleichen können. Doc2vec ist eine coole Idee, lässt sich aber nicht sehr gut skalieren, und Sie müssen es wahrscheinlich selbst implementieren, wie ich es bin keine Kenntnis von Open-Source-Implementierungen. Es ist nicht gut skalierbar, da für jedes Dokument ein neues und separates Modell mit SGD, einem langsamen Algorithmus für maschinelles Lernen, erstellt werden muss. Aber es gibt Ihnen wahrscheinlich die genauesten Ergebnisse. LSA und LDA skalieren ebenfalls nicht gut (word2vec jedoch), LDA skaliert im Allgemeinen schlechter. Die Implementierungen von Gensim sind jedoch sehr schnell, da iterative SVD verwendet wird.
Ein weiterer Hinweis: Wenn Sie word2vec verwenden, müssen Sie immer noch festlegen, wie Vektoren aus Dokumenten zusammengesetzt werden sollen, da Sie einen anderen Vektor pro Wort erhalten. Der einfachste Weg, dies zu tun, besteht darin, jeden Vektor zu normalisieren und den Mittelwert über alle Wortvektoren im Dokument zu nehmen, oder einen gewichteten Mittelwert durch idf-Gewichtung jedes Wortes zu nehmen. Es ist also nicht so einfach wie 'use word2vec', Sie müssen etwas weiter machen, um die Ähnlichkeit von Dokumenten zu berechnen.
Ich persönlich würde mit LSA gehen, da ich gesehen habe, dass es empirisch gut funktioniert und Gensims Bibliothek sehr gut skaliert. Es gibt jedoch kein kostenloses Mittagessen. Probieren Sie daher am besten jede Methode aus, um herauszufinden, welche für Ihre Daten besser geeignet ist.
quelle
Stand der Technik scheinen "Absatzvektoren" zu sein, die in einem kürzlich erschienenen Artikel eingeführt wurden: http://cs.stanford.edu/~quocle/paragraph_vector.pdf . Der cosinus / euklidische Abstand zwischen Absatzvektoren würde wahrscheinlich besser funktionieren als jeder andere Ansatz. Dies ist wahrscheinlich noch nicht möglich, da es an Open Source-Implementierungen mangelt.
Das nächstbeste ist der Kosinusabstand zwischen LSA-Vektoren oder der Kosinusabstand zwischen rohen BOW-Vektoren. Manchmal ist es besser, andere Gewichtungsschemata zu wählen, wie z. B. TF-IDF.
quelle
Es ist nützlich, die Familie der lokalitätssensitiven Hashing-Algorithmen in Ihrer Werkzeugtasche zu haben . Diese Familie ist überhaupt nicht semantisch. Eigentlich ist der Text als eine Folge von Bits zu betrachten. Ich finde es in schmutzigen Datensätzen nützlich, wenn derselbe Text mit geringfügigen Unterschieden oft vorkommt.
Sie können ssdeep (das auf Nilsimsa-Hash basiert ) verwenden, um solche Dokumente zu identifizieren. Ssdeep war ursprünglich für die Domain Spam geplant. Spammer nehmen häufig kleine Änderungen an der Nachricht vor (fügen Sie ein Leerzeichen hinzu), um die Erkennung durch exakte Signatur (z . B. md5 ) zu verhindern.
Da viele Versionen fast desselben Dokuments in demselben Datensatz statistische Methoden zerstören, die darauf angewendet werden, kann eine solche Bereinigung sehr vorteilhaft sein.
quelle