4

類似性の計算にTF/IDFを使用しています。たとえば、次の2つのドキュメントがあるとします。

Doc A => cat dog
Doc B => dog sparrow

通常、類似度は50%ですが、TF/IDFを計算すると。以下の通りです

DocAのTf値

dog tf = 0.5
cat tf = 0.5

DocBのTf値

dog tf = 0.5
sparrow tf = 0.5

DocAのIDF値

dog idf = -0.4055
cat idf = 0

DocBのIDF値

dog idf = -0.4055 ( without +1 formula 0.6931)
sparrow idf = 0

DocAのTF/IDF値

0.5x-0.4055 + 0.5x0 = -0.20275

DocBのTF/IDF値

0.5x-0.4055 + 0.5x0 = -0.20275

これで、-0.20275の類似性があるように見えます。それは...ですか?それとも私は何かが足りないのですか?それとも次のステップはありますか?私も計算できるように教えてください。

ウィキペディアが言及したtf/idf式を使用しました

4

3 に答える 3

17

私があなたの質問を得るかどうか見てみましょう:あなたは2つの文書間のTF /IDF類似性を計算したいです:

Doc A: cat dog

Doc B: dog sparrow

これがあなたのコーパス全体だと思います。したがって|D| = 2 、Tfsはすべての単語で実際に0.5です。'dog'のIDFを計算するには、log(|D|/|d:dog in d| = log(2/2) = 0 同様に、'cat'と'sparrow'のIDFは次のlog(2/1) = log(2) =1 ようになります(これを簡単にするために、ログベースとして2を使用します)。

したがって、「dog」のTF/IDF値は0.5*0 = 0になり、「cat」および「sparrow」のTF/IDF値は0.5*1=0.5になります。

2つのドキュメント間の類似性を測定するには、(猫、スズメ、犬)空間のベクトル間の正弦を計算する必要があります:(0.5、0、0)および(0、0.5、0)そして結果0を取得します。

要約すると:

  1. IDFの計算にエラーがあります。
  2. このエラーにより、誤ったTF/IDF値が作成されます。
  3. ウィキペディアの記事では、類似性のためのTF/IDFの使用について十分に説明されていません。Manning、Raghavan、Schützeの説明の方がずっと好きです。
于 2009-12-31T20:46:32.350 に答える
0

log の代わりに ln を使用する必要があると思います。

于 2010-01-03T16:10:39.600 に答える
0
def calctfidfvec(tfvec, withidf):
    tfidfvec = {}
    veclen = 0.0

    for token in tfvec:
        if withidf:
            tfidf = (1+log10(tfvec[token])) * getidf(token)
        else:
            tfidf = (1+log10(tfvec[token]))
        tfidfvec[token] = tfidf 
        veclen += pow(tfidf,2)

    if veclen > 0:
        for token in tfvec: 
            tfidfvec[token] /= sqrt(veclen)

    return tfidfvec

def cosinesim(vec1, vec2):
    commonterms = set(vec1).intersection(vec2)
    sim = 0.0
    for token in commonterms:
        sim += vec1[token]*vec2[token]

    return sim
于 2016-11-04T07:10:48.933 に答える