2016-05-26 57 views
0

私は、用語に基づいて私の文書のtf-idfを計算しました。次に、用語の次元数を減らすためにLSAを適用しました。 'similarity_dist'には負の値が含まれます(下の表を参照)。余弦距離を0-1の範囲で計算するにはどうすればよいですか? cosine_distanceの範囲であろう故にコサイン類似度の負の値を扱う方法

cosine_distance = 1 - cosine_similarity 

:として

tf_vectorizer = CountVectorizer(max_df=0.95, min_df=2, tokenizer=tokenize_and_stem, stop_words='english') 
%time tf = tf_vectorizer.fit_transform(descriptions) 
print(tf.shape) 
svd = TruncatedSVD(100) 
normalizer = Normalizer(copy=False) 
lsa = make_pipeline(svd, normalizer) 
tfidf_desc = lsa.fit_transform(tfidf_matrix_desc) 
explained_variance = svd.explained_variance_ratio_.sum() 
print("Explained variance of the SVD step: {}%".format(int(explained_variance * 100))) 

similarity_dist = cosine_similarity(tfidf_desc) 
pd.DataFrame(similarity_dist,index=descriptions.index, columns=descriptions.index).head(10) 

print(tfidf_matrix_desc.min(),tfidf_matrix_desc.max()) 
#0.0 0.736443429828 

print(tfidf_desc.min(),tfidf_desc.max()) 
#-0.518015429416 0.988306783341 

print(similarity_dist.max(),similarity_dist.min()) 
#1.0 -0.272010919022 

enter image description here

+0

奇妙なを使用することができます。 Tfidfsは正であると予想されるため、余弦は0と1の間にあるはずです。正規化された行列のドット積であるため、余弦を計算しやすくするために通常正規化します。あなたのコードはコサインコールを表示しないし、あなたが述べたようにldaの代わりにsvdを使用しています。実際に使用しているコード全体を投稿できますか? – Rabbit

+0

申し訳ありませんが、LDAではなくLSAを適用しました。私はコードを更新しました。 'tfidf_matrix_desc'の値は0〜1で、tfidf_descは負の値を含みます(print文を参照)。 – kitchenprinzessin

答えて

0

cosine_similarity -1

1のコサイン距離の範囲内にある定義されている0〜 2

https://en.wikipedia.org/wiki/Cosine_similarity

コサイン距離は、正の空間で補数によく使用される用語で、D_C(A、B)= 1 - S_C(A、B)です。

注:0〜1の範囲でそれを持って必見あなた場合、あなたはcosine_distance/2

+0

距離を2に分けて説明してください。 doc0、doc0(上記の表)間のコサインの類似度は1ですので、sklearnメソッドは正の空間で類似点を返すと思いますか、何か不足していますか? – kitchenprinzessin

+0

cosine_similarityは-1と1の間の値として定義され、cosine_distanceは次のように定義されます。1 - cosine_similarity - >したがってcosine_distanceの範囲は0から2です。 – Yaron

関連する問題