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.
@Ahmet Wenn es etwas gibt, dass Sie wollen, dass ich klärere, lassen Sie mich wissen. – srean
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. –
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