2017-05-21 4 views
0

私は、一連のドキュメント間の類似性を判断しようとしています。私が使用している方法の1つは、TF-IDFの結果とのコサインの類似性です。SklearnとgensimのTF-IDFの実装

私はsklearn、私に同様の結果が得られgensimの実装、両方を使用しようとしましたが、別のマトリックス中に自分の実施結果。

は分析した後、私は彼らの実装は、私が勉強してきたものとは異なることに気づいたと出くわした:

SklearnとgensimがTFとして生のカウントを使用し、そして得られたベクトルにL2ノルム を適用します。他の側では

、私が見つけた実装が用語数を正規化し、

TF = term count/sum of all term counts in the document 

のような私の質問は、その実装との違いは何か、ですか?彼らはクラスタリングやその他の目的のために、より良い結果を最終的に提供しますか?

EDIT(質問がより明確になります): 最終結果を正規化してから数え上げを正規化するまでの違いは何ですか? scikit学習で

答えて

0

必要に応じてTfidfTransformer()を呼び出すとき、あなたはl1l2、またはnoneのいずれかにnormを設定することにより、正規化を設定することができます。

あなたはnoneでこれをしようとした場合、あなたはあなた自身の手巻きTF-IDF実装に同様の結果を得ることができます。

正規化は通常、特定のtf-idf重み付けに対するドキュメントの長さの影響を減らすために使用され、短いドキュメントに表示されるワードは、より長いドキュメントに表示されるワードに等しくなります。

+0

ええ、実装をチェックしたところ、私はすでに手作業で類似の結果を得ています。 私は両方の方法は、文書の長さに対抗するために使用されますので、私は、begginingで用語頻度を正規化対最終結果を正規化するとの違いは何であるか尋ねた、私の質問と明示的ではなかったと思います。 – msk

1

私は、正規化ではなく長期的な周波数にそれをやってのTF-IDFの計算の最後に行われている理由を理解することになりました。

周りに検索した後、私は彼らが、コサイン類似度計算を容易にするために、L2正規化を使用して気づきました。

ので、代わりに2つのベクトル間の類似度を得るために式dot(vector1, vector2)/(norm(vector1) * norm(vector2))を使用して、我々はfit_transform関数から結果を直接使用することができます。ベクトルのノルムはすでに1

であることから、正規化する必要がなく、 tfidf * tfidf.T

用語頻度に正規化を追加しようとしましたが、最終的に同じ結果を出すだけです。ベクトル全体を正規化すると時間が無駄になります。

関連する問題