Python 如何从TfidfVectorizer计算余弦相似性?

Python 如何从TfidfVectorizer计算余弦相似性?,python,numpy,scikit-learn,sparse-matrix,tf-idf,Python,Numpy,Scikit Learn,Sparse Matrix,Tf Idf,我有两个CSV文件-培训和测试,每个文件有18000条评论。我需要使用train文件进行特征提取,并计算train文件中的每个评论与测试文件中的每个评论之间的相似性度量 我根据火车和测试集中的单词生成了一个词汇表——我删除了停止词,但没有删除拼写错误和词干 我面临的问题是-我不知道如何使用TfIdfVectorizer的输出来生成列车和测试数据之间的余弦相似性 这是将我的列车数据与词汇表相匹配的代码片段: vect = TfidfVectorizer(sublinear_tf=True, min

我有两个CSV文件-培训和测试,每个文件有18000条评论。我需要使用train文件进行特征提取,并计算train文件中的每个评论与测试文件中的每个评论之间的相似性度量

我根据火车和测试集中的单词生成了一个词汇表——我删除了停止词,但没有删除拼写错误和词干

我面临的问题是-我不知道如何使用TfIdfVectorizer的输出来生成列车和测试数据之间的余弦相似性

这是将我的列车数据与
词汇表
相匹配的代码片段:

vect = TfidfVectorizer(sublinear_tf=True, min_df=0.5,      vocabulary=vocabulary)
X = vect.fit_transform(train_list)
vocab = vect.get_feature_names()
# train_matrix = X.todense()
train_idf = vect.idf_
print vocab
print X.todense()
我从X.todense()得到的输出是

如果我只是打印X,它看起来像这样:

(0, 28137)  0.114440020953
(0, 27547)  0.238913278498
(0, 26519)  0.14777362826
(0, 26297)  0.247716207254
(0, 26118)  0.178776605168
(0, 26032)  0.15139993147
(0, 25771)  0.10334152493
(0, 25559)  0.157584788446
(0, 25542)  0.0909693864147
(0, 25538)  0.179738937276
(0, 21762)  0.112899547719
(0, 21471)  0.159940534946
(0, 21001)  0.0931693893501
(0, 13960)  0.134069984961
(0, 12535)  0.198190713402
(0, 11918)  0.142570540903
:   :
(18505, 18173)  0.237810781785
(18505, 17418)  0.233931974117
(18505, 17412)  0.129587180209
(18505, 17017)  0.130917070234
(18505, 17014)  0.137794139419
(18505, 15943)  0.130040669343
(18505, 15837)  0.0790013472346
(18505, 11865)  0.158061557865
(18505, 10896)  0.0708161593204
(18505, 10698)  0.0846731116968
(18505, 10516)  0.116681527108
(18505, 8668)   0.122364898181
(18505, 7956)   0.174450779875
(18505, 1111)   0.191477939381
(18505, 73) 0.257945257626
我不知道如何读取X.todense()或print X的输出,也不知道如何找到测试集和训练集之间的余弦距离(可能使用成对相似性?-?)

编辑:

我对测试数据重复了相同的步骤。 现在我有两个稀疏矩阵X和Y,类型为
scipy.sparse.csr.csr\u matrix
——但由于它们都是稀疏的,类型为
(doc,term)tf idf
,我无法通过直接乘法直接得到X和Y之间的余弦相似性

使用
todense()
转换X和Y会产生内存错误,这意味着效率低下

接下来我该怎么办

我需要得到一些两两余弦相似的矩阵,维数18000*18000,或者一个稀疏矩阵,但我不知道怎么做


这是家庭作业,在这个阶段,阅读sklearn文档对我没有帮助

你就快到了。使用
vect.fit_transform
返回一个矩阵的稀疏表示形式,它是训练集的文档术语矩阵表示形式。然后需要使用相同的模型转换测试集。提示:使用
测试列表
上的
转换
方法。你很幸运,因为
sklearn.metrics.pairwise.pairwise_距离(X,Y)
在通过
metric='euclidean'
时(即你想要的度量)为
X
Y
采用稀疏矩阵。从这里开始,您需要做的事情应该非常简单。

我想您可以使用

下面是我正在使用的一个示例:

tf = TfidfVectorizer(tokenizer=normalize, decode_error = 'ignore',max_features=10000)

tfidf_matrix = tf.fit_transform(aux['enlarged_description'])

#cosine_similarities = linear_kernel(tfidf_matrix, tfidf_matrix)
X = pairwise_distances(tfidf_matrix, metric = metrics,n_jobs = -2 )

谢谢你的提示。我想我差不多完成了-除了成对距离需要大量处理,我的系统无法处理它。成对距离(X,Y)给了我一个记忆错误<代码>文件“/home/bt/amzreview/local/lib/python2.7/site packages/scipy/sparse/base.py”,第1009行,进程中的数组参数返回np.0(self.shape,dtype=self.dtype,order=order)
tf = TfidfVectorizer(tokenizer=normalize, decode_error = 'ignore',max_features=10000)

tfidf_matrix = tf.fit_transform(aux['enlarged_description'])

#cosine_similarities = linear_kernel(tfidf_matrix, tfidf_matrix)
X = pairwise_distances(tfidf_matrix, metric = metrics,n_jobs = -2 )