我最近正在从事任务使用20_newGroups数据集并使用3个不同的矢量化技术(单词袋,TF,TFIDF)来表示文档以向量格式表示文档,然后尝试尝试分析20_newsGroups数据集中每个类之间平均余弦相似性之间的差异。因此,这是我在Python试图做的事情。我正在阅读数据并将其传递到 sklearn.feature_extraction.text.countvectorizer class的fit()和transform()单词袋技术和 tfidfvectorizer fort tfidf Technique。/p>
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)
两者在技术上都应给出不同的相似性_matrix,但它们的态度相同。更精确的tf_vectorizer应该创建相似的_matrix,其值更封闭到1。
这里的问题是,通过两种技术为同一类的同一文档(例如Alt.Atheism)创建的向量是不同的,应该是不同的。但是,当我计算一个类和另一类文档之间的相似性分数时,余弦相似性得分人给我相同的价值。如果我们从理论上理解,那么TFIDF在矢量空间方面更为细微的意义上代表文档,因此余弦值应该更接近1,那么我从一袋Word Technique中得到的东西对吗?但是它给出了相同的相似性分数。我尝试了Bow&TFIDF技术。如果有人能给我一个充分的理由解决这个问题或支持正在发生的事情,那将有很大的帮助?我是这个平台的新手,所以请忽略任何错误,如果您需要更多信息,请告诉我。
谢谢问候,Darshan Sonagara
问题是您的代码中的这一行。
tf_vectorizer = TfidfVectorizer(stop_words='english',analyzer='word',use_idf=False) #,sublinear_tf=True
您将use_idf
设置为False
。这意味着未计算逆文档频率。因此,仅计算术语频率。基本上,您像CountVectorizer
一样使用TfidfVectorizer
。因此两者的输出相同:导致相同的余弦距离。
使用tf_vectorizer = TfidfVectorizer(stop_words='english',analyzer='word',use_idf=True)
将导致TFIDF的余弦相似性矩阵与CountVectorizer不同。