tf-idf計算を計算できる単純なJavaクラスを探しています。2つのドキュメントで類似性テストを実行したい。tf-idfクラスを使用するBIGAPIをたくさん見つけました。簡単なテストを行うためだけに、大きなjarファイルを使用したくありません。助けてください !または、誰かがTFを見つける方法を教えてくれるかどうかを教えてください。とIDF?結果を計算します:)またはこのための良いJavaチュートリアルを教えていただければ。グーグルを探していることを教えてはいけません。私はすでに3日間行ったのですが、何も見つかりませんでした:(また、Luceneを紹介しないでください:(
3 に答える
用語頻度は、特定のドキュメントで用語が出現する回数の平方根です。
逆ドキュメント頻度は、((ドキュメントの総数を用語を含むドキュメントの数で割った)の対数)に、用語がゼロ回発生する場合は1を足したものです。発生する場合は、明らかにゼロで除算しないでください。
その答えから明らかでない場合は、ドキュメントごとの用語ごとのTFと、用語ごとのIDFがあります。
そして、TF-IDF(term、document)= TF(term、document)* IDF(term)
最後に、ベクトル空間モデルを使用してドキュメントを比較します。各項は新しい次元であり、その次元を指すベクトルの部分の「長さ」はTF-IDF計算です。各ドキュメントはベクトルであるため、2つのベクトルを計算してから、それらの間の距離を計算します。
したがって、Javaでこれを行うには、FileReaderなどを使用して一度に1行でファイルを読み取り、スペースまたは使用するその他の区切り文字で分割します。各単語は用語です。各用語が各ファイルに出現する回数と、各用語が出現するファイルの数を数えます。これで、上記の計算を行うために必要なすべてが揃います。
そして、他に何もすることがないので、ベクトル距離の式を調べました。どうぞ:
D=sqrt((x2-x1)^2+(y2-y1)^2+...+(n2-n1)^2)
この目的のために、x1はドキュメント1の用語xのTF-IDFです。
編集:ドキュメント内の単語を数える方法についての質問に答えて:
- 次のように、リーダーを使用してファイルを1行ずつ読み取り
new BufferedReader(new FileReader(filename))
ます。whileループを呼び出しBufferedReader.readLine()
て、毎回nullをチェックできます。 - 行ごとに、
line.split("\\s")
-を呼び出します。これにより、行が空白で分割され、すべての単語の配列が表示されます。 - 単語ごとに、現在のドキュメントの単語数に1を加算します。これは、を使用して実行できます
HashMap
。
ここで、各ドキュメントのDを計算すると、Xの値が得られます。ここで、Xはドキュメントの数です。すべてのドキュメントを相互に比較することは、X ^ 2の比較のみを行うことです。これは、10,000の場合は特に長くはかからないはずです。D値の差の絶対値が低い場合、2つのドキュメントはより類似していることに注意してください。したがって、ドキュメントのすべてのペアのDの差を計算し、それを優先度付きキューまたは他の並べ替えられた構造に格納して、最も類似したドキュメントが一番上に表示されるようにすることができます。わかる?
agazerboy、Sujit Pal のブログ投稿では、TF と IDF の計算について詳しく説明しています。WRT の検証結果です。正しいかどうかを簡単に確認できるように、小さなコーパス (たとえば 100 ドキュメント) から始めることをお勧めします。10000 個のドキュメントの場合、Lucene を使用することは非常に合理的な選択のように見え始めます。
Lucene を参照しないように具体的にお願いしましたが、正確なクラスを指摘させてください。探しているクラスはDefaultSimilarityです。TF と IDF を計算するための非常に単純な API があります。ここの Java コードを参照してください。または、DefaultSimilarity ドキュメントで指定されているように自分で実装することもできます。
TF = sqrt(freq)
と
IDF = log(numDocs/(docFreq+1)) + 1.
log および sqrt 関数は、実際の値をダンプするために使用されます。生の値を使用すると、結果が大幅に歪む可能性があります。