2010-10-27 2 views
5

Ich habe an einem Projekt über Satzähnlichkeit gearbeitet. Ich weiß, dass es viele Male in SO gefragt wurde, aber ich möchte nur wissen, ob mein Problem durch die Methode, die ich verwende, auf die Art und Weise erreicht werden kann, wie ich es tue, oder ich sollte meine Herangehensweise an das Problem ändern. Grob gesagt, soll das System alle Sätze eines Artikels aufteilen und ähnliche Sätze unter anderen Artikeln finden, die dem System zugeführt werden.N-Gramm-Satzähnlichkeit mit Kosinusähnlichkeitsmessung

Ich verwende Cosinusähnlichkeit mit Tf-IDF Gewichte und das ist, wie ich es getan habe.

1- Zuerst teile ich alle Artikel in Sätze auf, dann erzeuge ich Trigramme für jeden Satz und sortiere sie (sollte ich?).

2- Ich berechne die tf-idf Gewichtungen der Trigramme und erzeuge Vektoren für alle Sätze.

3- Ich berechne das Skalarprodukt und die Größe des ursprünglichen Satzes und des zu vergleichenden Satzes. Berechnen Sie dann die Kosinusähnlichkeit.

Das System funktioniert jedoch nicht wie erwartet. Hier habe ich einige Fragen im Kopf.

Soweit ich über tf-IDF Gewichtungen gelesen habe, denke ich, dass sie nützlicher sind, um ähnliche "Dokumente" zu finden. Da ich an Sätzen arbeite, habe ich den Algorithmus ein wenig modifiziert, indem ich einige Variablen der Formel von tf- und idf-Definitionen geändert habe (anstelle von Dokument habe ich versucht, eine Satz-basierte Definition zu finden).

tf = Anzahl der Vorkommen von trigram in Satz/Anzahl aller trigrams in Satz

idf = Anzahl aller Sätze in allen Artikeln/Anzahl der Sätze, wo trigram erscheint

Glaubst du, es ist ok eine solche Definition für dieses Problem zu verwenden?

Eine andere ist, dass ich gesehen habe, dass die Normalisierung viele Male erwähnt wird, wenn man die Kosinusähnlichkeit berechnet. Ich vermute, dass dies wichtig ist, weil die Trigrammvektoren möglicherweise nicht die gleiche Größe haben (was sie in meinem Fall selten sind). Wenn ein Trigrammvektor die Größe von x hat und der andere x + 1 ist, dann behandle ich den ersten Vektor so, wie er die Größe von x + 1 hatte, wobei der letzte Wert 0 ist. Ist das mit Normierung gemeint? Wenn nicht, wie mache ich die Normalisierung?

Neben diesen, wenn ich den falschen Algorithmus gewählt habe, was sonst kann für ein solches Problem (vorzugsweise mit N-Gram-Ansatz) verwendet werden?

Vielen Dank im Voraus.

Antwort

5

Ich bin nicht sicher, warum Sie die Trigramme für jeden Satz sortieren. Alles, was Sie bei der Berechnung der Kosinusähnlichkeit beachten müssen, ist die Frage, ob dasselbe Trigramm in den beiden Sätzen aufgetreten ist oder nicht und mit welchen Frequenzen. Konzeptionell definieren Sie eine feste und gemeinsame Ordnung unter allen möglichen Trigrammen. Denken Sie daran, dass die Reihenfolge für alle Sätze gleich sein muss. Wenn die Anzahl der möglichen Trigramme N ist, erhalten Sie für jeden Satz einen Vektor der Dimensionalität N. Wenn ein bestimmtes Trigramm nicht auftritt, setzen Sie den entsprechenden Wert im Vektor auf Null. Sie müssen die Nullen nicht wirklich speichern, sondern müssen sich um sie kümmern, wenn Sie das Punktprodukt definieren.

Mit diesen Worten sind Trigramme keine gute Wahl, da die Chancen auf eine Übereinstimmung viel spärlicher sind. Für hohe k haben Sie bessere Ergebnisse aus Beuteln mit k aufeinander folgenden Wörtern statt K-Gramm. Beachten Sie, dass die Reihenfolge spielt keine Rolle in einer Tasche, es ist ein Satz. Sie verwenden k = 3 k-Gramm, aber das scheint auf der hohen Seite zu sein, besonders für Sätze.Entweder auf zwei Gramm herunterfallen oder Taschen mit verschiedenen Längen verwenden, beginnend mit 1. Vorzugsweise beide verwenden.

Ich bin sicher, Sie haben bemerkt, dass Sätze, die nicht das genaue Trigramm verwenden, 0 Ähnlichkeit in Ihrer Methode haben. K-Bag der Wörter wird die Situation etwas lindern, aber nicht vollständig lösen. Denn jetzt brauchst du Sätze, um Wörter zu teilen. Zwei Sätze können ähnlich sein, ohne die gleichen Wörter zu verwenden. Es gibt ein paar Möglichkeiten, dies zu beheben. Verwenden Sie entweder LSI (Latent Semantic Indexing) oder Clustering der Wörter und verwenden Sie die Cluster-Labels, um Ihre Kosinusähnlichkeit zu definieren.

Um die Cosinus Ähnlichkeit zwischen den Vektoren x und y Sie berechnen die Skalarprodukt und dividieren durch die Normen von x und y zu berechnen. Die 2-Norm des Vektors x kann als Quadratwurzel der Summe der quadrierten Komponenten berechnet werden. Sie sollten jedoch auch Ihren Algorithmus ausprobieren ohne eine Normalisierung zu vergleichen. Normalerweise funktioniert es gut, weil Sie sich bereits um die relativen Größen der Sätze kümmern, wenn Sie den Begriff Frequenzen (tf) berechnen.

Hoffe, das hilft.

+0

@Ahmet Wenn es etwas gibt, dass Sie wollen, dass ich klärere, lassen Sie mich wissen. – srean

+0

Vielen Dank für Ihre Antwort. Erstens, der Grund, warum ich den Vektor sortiere, ist, dass ich bessere Ergebnisse erziele. Ich habe versucht, was Sie vorschlagen, aber es gibt kein Glück. Aber ich habe gerade etwas realisiert, dass die ähnlichen Wörter im Allgemeinen die ähnlich langen sind. Diese Kosinusähnlichkeit erscheint mir etwas zufällig, da wir nicht die Verbindung zwischen den N-Grammen überprüfen, sondern die Häufigkeit der N-Gramme überprüfen, ohne zu berücksichtigen, was sie sind. Vielleicht verpasse ich noch etwas. –

+0

Natürlich wird Kosinusähnlichkeit zufällig aussehen, wenn Sie nicht darauf achten, dass sie übereinstimmen oder nicht, denn was Sie in diesem Fall berechnen, hat nichts mit Kosinusähnlichkeit zu tun. Sie tun es falsch, und in diesem Fall wird es per Definition zufällig sein. Versuchen Sie es noch einmal und folgen Sie den Anweisungen genau, es wird funktionieren. – srean