質問

2 つのドキュメントの tf/idf 値を計算しました。tf/idf 値は次のとおりです。

1.txt
0.0
0.5
2.txt
0.0
0.5

書類は次のようなものです。

1.txt = > dog cat
2.txt = > cat elephant

これらの値を使用してコサイン類似度を計算するにはどうすればよいですか?

内積を計算してから距離を求め、それで内積を除算する必要があることはわかっています。私の値を使用してこれを計算するにはどうすればよいですか?

もう一つ質問: 両方の文書の単語数が同じであることが重要ですか?

役に立ちましたか?

解決

            a * b
sim(a,b) =--------
           |a|*|b|
* bは内積である

いくつかの詳細ます:

def dot(a,b):
  n = length(a)
  sum = 0
  for i in xrange(n):
    sum += a[i] * b[i];
  return sum

def norm(a):
  n = length(a)
  for i in xrange(n):
    sum += a[i] * a[i]
  return math.sqrt(sum)

def cossim(a,b):
  return dot(a,b) / (norm(a) * norm(b))

はい。ある程度、aとbは同じ長さでなければなりません。しかし、aとbは通常、スパース表現を持っている、あなたは唯一の非ゼロのエントリを格納する必要があり、ノルムを計算し、より高速なドットができます。

他のヒント

単純なJavaコードの実装:

  static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {
            Set<String> both = Sets.newHashSet(v1.keySet());
            both.retainAll(v2.keySet());
            double sclar = 0, norm1 = 0, norm2 = 0;
            for (String k : both) sclar += v1.get(k) * v2.get(k);
            for (String k : v1.keySet()) norm1 += v1.get(k) * v1.get(k);
            for (String k : v2.keySet()) norm2 += v2.get(k) * v2.get(k);
            return sclar / Math.sqrt(norm1 * norm2);
    }

1) tf-idf を計算します (一般に t-f 単独よりも優れていますが、データセットと要件に完全に依存します)

から ウィキ (IDFに関して)

ドキュメントセットで非常に頻繁に発生する用語の重みを減少させる逆ドキュメント周波数係数が組み込まれ、まれに発生する項の重みを増加させます。

2) いいえ、両方の文書の単語数が同じであることは重要ではありません。

3) 見つけることができます tf-idf または cosine-similarity 現在では、機械学習ライブラリ関数を呼び出すことで、どの言語でも使用できます。私はパイソンの方が好きです

計算するPythonコード tf-idf そして コサイン類似度 (使用 scikit-learn 0.18.2 )

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# example dataset
from sklearn.datasets import fetch_20newsgroups

# replace with your method to get data
example_data = fetch_20newsgroups(subset='all').data

max_features_for_tfidf = 10000
is_idf = True 

vectorizer = TfidfVectorizer(max_df=0.5, max_features=max_features_for_tf_idf,
                             min_df=2, stop_words='english',
                             use_idf=is_idf)


X_Mat = vectorizer.fit_transform(example_data)

# calculate cosine similarity between samples in X with samples in Y
cosine_sim = cosine_similarity(X=X_Mat, Y=X_Mat)

4) 興味があるかもしれません 切り捨て特異値分解 (SVD)

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