我最近在分配任務的地方是使用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
請將格式化文本的代碼添加到您的問題中,而不是圖像中。 – error
@error我已經更新了代碼。你能幫我麼? –