Frage

Ich suche eine einfache Java-Klasse, die tf-idf Berechnung berechnen kann. Ich möchte auf zwei Dokumente Ähnlichkeit Test zu tun. Ich fand so viele BIG-API, die tf-idf-Klasse verwendet. Ich will nicht eine große JAR-Datei verwenden, nur meinen einfachen Test zu tun. Bitte Hilfe! Oder atlest, wenn jemand kann mir sagen, wie TF zu finden? und IDF? Ich werde die Ergebnisse berechnen :) ODER Wenn Sie einige gute Java-Tutorial für diese kann mir sagen. Bitte erzählen Sie mir nicht für Google suchen, habe ich bereits für 3 Tage tat und konnte keine Sache finden :( Bitte beachten Sie auch beziehen sich mir nicht auf Lucene: (

War es hilfreich?

Lösung

Begriff Frequenz ist die Quadratwurzel der Anzahl, wie oft ein Begriff in einem bestimmten Dokument auftritt.

Inverse Document Frequency ist (das Protokoll der (die Gesamtzahl der Dokumente durch die Anzahl der Dokumente geteilt mit dem Begriff)) plus ein, falls der Begriff tritt Null mal - wenn ja, offensichtlich nicht versuchen, zu teilen durch Null.

Wenn es nicht klar, aus dieser Antwort ist, gibt es eine TF pro Trimester pro Dokument und eine IDF pro Begriff.

Und dann TF-IDF (Begriff, Dokument) = TF (Begriff, Dokument) * IDF (term)

Schließlich verwenden Sie das Vektorraummodell Dokumente zu vergleichen, wo jeder Begriff eine neue Dimension und die „Länge“ des Teils des Zeigevektor ist in dieser Dimension ist die TF-IDF-Berechnung. Jedes Dokument ist ein Vektor, so berechnet die zwei Vektoren berechnen und dann den Abstand zwischen ihnen.

So dies in Java zu tun, lesen Sie die Datei in einer Zeile zu einem Zeitpunkt mit einem Filereader oder so etwas, und Split auf Leerzeichen oder was auch immer andere Trennzeichen Sie verwenden möchten - jedes Wort ist ein Begriff. Zählen Sie die Anzahl der einzelnen Begriff erscheint in jeder Datei, und die Anzahl der Dateien jeder Begriff erscheint in. Dann haben Sie alles, was Sie die obigen Berechnungen tun müssen.

Und da ich nichts anderes zu tun, sah ich den Vektorabstand Formel auf. Hier gehen Sie:

D=sqrt((x2-x1)^2+(y2-y1)^2+...+(n2-n1)^2)

Zu diesem Zweck x1 ist der TF-IDF für Term x in Dokument 1.

Edit: als Antwort auf Ihre Frage, wie die Worte in einem Dokument zu zählen:

  1. Lesen Sie die Datei in Zeile für Zeile mit einem Lesegerät, wie new BufferedReader(new FileReader(filename)) -. Sie BufferedReader.readLine() in einer while-Schleife aufrufen können, für null Überprüfung jedes Mal
  2. Für jede Zeile Anruf line.split("\\s") -., Die Ihre Linie auf Leerzeichen aufgespalten wird und geben Sie eine Reihe von allen Wörtern
  3. Für jedes Wort, fügen Sie 1 bis gräflichen Wort für das aktuelle Dokument. Dies könnte unter Verwendung eines HashMap erfolgen.

Jetzt, nach für jedes Dokument Berechnung D, werden Sie X-Werte haben, wobei X die Anzahl der Dokumente ist. Um alle Dokumente gegeneinander zu vergleichen, ist nur X ^ 2 Vergleiche zu tun - dies sollte nicht besonders lang für 10.000. Denken Sie daran, dass zwei Dokumente ähnlicher sind, wenn der absolute Wert der Differenz zwischen dem D-Wert niedriger. Also dann könnte man den Unterschied zwischen der Ds jeden Paar von Dokumenten und speichern berechnet, dass in einer Prioritätswarteschlange oder ein anderes sortierten Struktur, so dass die am ähnlichsten Dokumenten Blase ganz nach oben. Sinn ergeben?

Andere Tipps

agazerboy, Sujit Pal Blog-Post gibt eine ausführliche Beschreibung der TF und IDF zu berechnen. WRT Verifizieren Ergebnisse, empfehle ich Ihnen mit einem kleinen Korpus beginnen (100 Dokumente sagen), so dass Sie leicht erkennen können, ob Sie richtig sind. Für 10000 Dokumente, beginnt mit Lucene zu sehen aus wie eine wirklich vernünftige Wahl.

Während Sie gerade nicht gefragt Lucene zu beziehen, gestatten Sie mir, Ihnen zu Punkt die genaue Klasse. Die Klasse Sie suchen, ist DefaultSimilarity . Es hat eine sehr einfache API zu berechnen TF und IDF. Sehen Sie sich die Java-Code hier . Oder Sie könnten nur selbst implementieren, wie in der DefaultSimilarity Dokumentation angegeben.

          TF = sqrt(freq)

und

          IDF = log(numDocs/(docFreq+1)) + 1.

Das Protokoll und sqrt Funktionen werden verwendet, um die tatsächlichen Werte zu dämpfen. die rohen Werte verwenden, können Ergebnisse erheblich verzerren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top