2017-09-26 7 views
0

ベクトル形式に変換し、20_Newsgroupsデータセットの各クラス間の平均コサイン類似度の差を分析しようとしました。ですから、ここでは私がPythonでやろうとしていることがあります。私はデータを読んで、sklearn.feature_extraction.text.CountVectorizerのBag of Wordsテクニックのクラスのfit()とtransform()関数とTFIDFテクニックのためのTfidfVectorizerに渡しています。コサイン類似度スコア二つの異なるベクトル化技術のために学ぶのは同じです、私は最近、仕事が20_newgroupsデータセットを使用しての文書を表現するために、3つの異なるベクトル化技術(言葉のバッグ、TF、TFIDF)を使用することです割り当てに取り組んでいます

from sklearn.datasets import fetch_20newsgroups 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_similarity,cosine_distances 
import numpy 
import math 
import csv 

=============================================================================================================================================== 

categories = ['alt.atheism','comp.graphics','comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware','comp.sys.mac.hardware',    'comp.windows.x','misc.forsale','rec.autos','rec.motorcycles','rec.sport.baseball','rec.sport.hockey', 
      'sci.crypt','sci.electronics','sci.med','sci.space','soc.religion.christian','talk.politics.guns', 
      'talk.politics.mideast','talk.politics.misc','talk.religion.misc'] 
twenty_newsgroup = fetch_20newsgroups(subset='all',remove=('headers', 'footers', 'quotes'),shuffle=True, random_state=42) 
dataset_groups = [] 
    for group in range(0,20): 
     category = [] 
     category.append(categories[group]) 
     dataset_groups.append(fetch_20newsgroups(subset='all',remove=('headers','footers','quotes'),shuffle=True,random_state=42,categories=category)) 
=============================================================================================================================================== 

bag_of_word_vect = CountVectorizer(stop_words='english',analyzer='word') #,min_df = 0.09 
bag_of_word_vect = bag_of_word_vect.fit(twenty_newsgroup.data,twenty_newsgroup.target) 

datamatrix_bow_groups = [] 
for group in dataset_groups: 
    datamatrix_bow_groups.append(bag_of_word_vect.transform(group.data)) 

similarity_matrix = [] 
for i in range(0,20): 
    means = [] 
    for j in range(i,20): 
     result_of_group_ij = cosine_similarity(datamatrix_bow_groups[i], datamatrix_bow_groups[j]) 
     means.append(numpy.mean(result_of_group_ij)) 
    similarity_matrix.append(means) 

=============================================================================================================================================== 


tf_vectorizer = TfidfVectorizer(stop_words='english',analyzer='word',use_idf=False) #,sublinear_tf=True 
tf_vectorizer = tf_vectorizer.fit(twenty_newsgroup.data) 

datamatrix_tf_groups = [] 
for group in dataset_groups: 
    datamatrix_tf_groups.append(tf_vectorizer.transform(group.data)) 

similarity_matrix = [] 
for i in range(0,20): 
    means = [] 
    for j in range(i,20): 
     result_of_group_ij = cosine_similarity(datamatrix_tf_groups[i], datamatrix_tf_groups[j]) 
     means.append(numpy.mean(result_of_group_ij)) 
    similarity_matrix.append(means) 

両方とも、技術的には異なる類似性マトリクスを与えるべきであるが、それらは同じようにしている。より正確には、tf_vectorizerは1に近い値を持つsimilarity_matrixを作成する必要があります。

ここで問題となるのは、同じクラスの同じドキュメント(alt.atheism)の両方のテクニックによって作成されたベクトルが異なるためです。しかし、あるクラスのドキュメントと別のクラスのドキュメント間の類似度スコアを計算すると、同じ値を与えるコサイン類似性スコアラーです。私たちはその後、TFIDFはベクトル空間でより細かい感覚で文書を表すされ、理論的に理解していればその余弦値が、私はWORD技術の右の袋から何を得るその後、1に近いもっとすべきですか?しかし、それは同じ類似性スコアを与えている。 BOW & TFIDFテクニックで作成した行列の値を表示してみました。誰かが私にこの問題を解決する正当な理由や、何が起こっているかをサポートする強力な議論を与えることができれば、大きな助けになるだろうか? 私はこのプラットフォームを初めて使用していますので、間違いを無視して、さらに詳しい情報が必要な場合はお知らせください。

おかげ&よろしく、 ダルシャンSonagara

+1

は、あなたの質問にフォーマットされたテキストとしてではなく、画像内のコードを追加してください。 – error

+0

@errorコードを更新しました。手伝ってくれませんか?私はそれは私が言葉の袋に取得していますどのような2つのベクトル間のより多くの角度を意味し、ゼロに近い値を与えている真の値を使用していたとしても –

答えて

1

問題は、あなたのコードでこの行です。

tf_vectorizer = TfidfVectorizer(stop_words='english',analyzer='word',use_idf=False) #,sublinear_tf=True 

あなたはFalseuse_idfを設定しています。これは、逆文書頻度が計算されていないことを意味します。したがって、用語頻度のみが計算されます。基本的にはCountVectorizerのようにTfidfVectorizerを使用しています。したがって、両方の出力は同じです:同じコサイン距離になります。

countvectorizer異なるTFIDFためのコサイン類似度行列になりtf_vectorizer = TfidfVectorizer(stop_words='english',analyzer='word',use_idf=True)を使用。

+0

。しかし、理論的には、tfidfがもっと細かい方法でドキュメントを表していて、それから単語技術のバッグが正しいと言うなら、それは正しくありませんか? –

関連する問題