質問

tf-idf 計算を計算できる単純な Java クラスを探しています。2 つのドキュメントの類似性テストを実行したいと考えています。tf-idf クラスを使用する大きな API がたくさん見つかりました。単純なテストを行うためだけに、大きな jar ファイルを使用したくありません。助けてください !それとも誰かがTFを見つける方法を教えてくれませんか?そしてIDFは?結果を計算します:)または、このための良いJavaチュートリアルを教えてもらえます。Googleを探してくれて私に言わないでください、私はすでに3日間やっていて、何も見つけることができませんでした:(また私をルーセンに紹介しないでください:(

役に立ちましたか?

解決

用語頻度は、特定の文書内で用語が出現する回数の平方根です。

逆文書頻度は、用語が 0 回出現する場合、((その用語を含む文書の総数をその用語を含む文書の数で割った) の対数) に 1 を加えた値です。その場合は、明らかにゼロで割ろうとしないでください。

その答えからは明らかでない場合は、ドキュメントごとに用語ごとに TF があり、用語ごとに IDF があります。

そして、TF-IDF(用語、文書) = TF(用語、文書) * IDF(用語)

最後に、ベクトル空間モデルを使用してドキュメントを比較します。ここで、各項は新しい次元であり、その次元を指すベクトルの部分の「長さ」が TF-IDF 計算になります。各ドキュメントはベクトルであるため、2 つのベクトルを計算してから、それらの間の距離を計算します。

Java でこれを行うには、FileReader などを使用してファイルを一度に 1 行ずつ読み取り、スペースまたはその他の使用したい区切り文字で分割します。各単語は用語です。各ファイルに各用語が出現する回数と、各用語が出現するファイルの数を数えます。これで、上記の計算を行うために必要なものがすべて揃いました。

仕方がないのでベクトル距離の公式を調べてみた。どうぞ:

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

この目的のために、x1 はドキュメント 1 の用語 x の TF-IDF です。

編集:文書内の単語を数える方法についての質問に答えて:

  1. 次のように、リーダーを使用してファイルを 1 行ずつ読み取ります。 new BufferedReader(new FileReader(filename)) - 電話できます BufferedReader.readLine() while ループで毎回 null をチェックします。
  2. 回線ごとに電話をかける line.split("\\s") - これにより、行が空白で分割され、すべての単語の配列が得られます。
  3. 単語ごとに、現在のドキュメントの単語数に 1 を加えます。これは、 HashMap.

ここで、各ドキュメントの D を計算すると、X の値が得られます。X はドキュメントの数です。すべてのドキュメントを相互に比較するには、X^2 の比較のみを実行します。これは 10,000 件の場合、特に長い時間はかかりません。2 つのドキュメントは、D 値の差の絶対値が小さいほど類似していることに注意してください。したがって、すべてのドキュメントのペアの D の差を計算し、それを優先キューまたはその他の並べ替えられた構造に格納して、最も類似したドキュメントが上位に来るようにすることができます。意味をなす?

他のヒント

agazerboy、 Sujitパルのブログ記事にはTFとIDFの計算の完全な説明を提供します。 あなたが正しいかどうかを簡単に確認できるように、結果を検証WRTは、私は(100件の文書を言う)あなたは小さなコーパスで始まる示唆しています。 10000件の文書の場合は、使用してLuceneのは本当に合理的な選択のような外観に始まります。

Lucene について言及しないように特にお願いしましたが、正確なクラスを紹介させてください。あなたが探しているクラスは、 デフォルトの類似性. 。TF と IDF を計算するための非常にシンプルな API があります。Javaコードを参照してください ここ. 。または、DefaultSimilarity ドキュメントの指定に従って自分自身を実装することもできます。

          TF = sqrt(freq)

そして

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

log 関数と sqrt 関数は、実際の値を減衰させるために使用されます。生の値を使用すると、結果が大幅に歪む可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top