2017-09-26 82 views
0

我最近在分配任務的地方是使用20_newgroups數據集,並使用3種不同的矢量化技術(文字包,TF,TFIDF)來表示文件的工作矢量格式,然後嘗試分析20_Newsgroups數據集中每個類之間的平均餘弦相似度之間的差異。所以這就是我在Python中想要做的。我正在讀取數據並將其傳遞給sklearn.feature_extraction.text.CountVectorizer Bag's Words技術的類的fit()和transform()函數以及TFIDF技術的TfidfVectorizer餘弦相似度得分scikit學會了兩種不同的量化技術是相同的

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) 

兩者在技術上應該給出不同的相似性矩陣,但它們是相同的。更precisiosly tf_vectorizer應該創建similarity_matrix具有值更接近於1。

這裏的問題是,既通過爲技術例如(alt.atheism)同一類的同一文檔創建矢量是不同的,並且它應該是。但是當我計算一個類和另一個類的文檔之間的相似度分數時,餘弦相似度計分器給了我相同的值。如果我們從理論上理解TFIDF在向量空間中代表更精細意義上的文檔,那麼餘弦值應該更接近1,那麼我從BAG OF WORD技術得到的結果是正確的嗎?但它給出了相同的相似度分數。我試着打印由BOW & TFIDF技術創建的矩陣值。如果有人能給我一個很好的理由來解決這個問題,或者支持正在發生的事情的強有力的論證,這會有很大的幫助嗎? 我是這個平臺的新手,所以請忽略任何錯誤,並告訴我是否需要更多信息。

感謝&問候, 達山Sonagara

+1

請將格式化文本的代碼添加到您的問題中,而不是圖像中。 – error

+0

@error我已經更新了代碼。你能幫我麼? –

回答

1

問題是這一行代碼。

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

您已將use_idf設置爲False。這意味着不計算逆文檔頻率。因此只計算詞頻。基本上你正在使用TfidfVectorizer,比如CountVectorizer。因此兩者的輸出是相同的:導致相同的餘弦距離。

使用tf_vectorizer = TfidfVectorizer(stop_words='english',analyzer='word',use_idf=True)將導致與countvectorizer不同的tfidf的餘弦相似性矩陣。

+0

即使我使用的是真值,它給我的值接近於零意味着兩個向量之間的角度更大,然後我得到的是單詞。但從理論上說,如果我們說tfidf以更精細的方式代表文檔,那麼字符技術的正確性呢? –