如何从TfidfVectorizer计算余弦相似度?

问题描述 投票:2回答:2

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

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

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

这是适合我的火车数据到vocabulary的代码片段:

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()获得的输出是

[[ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 ..., 
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]]

如果我只是打印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()或打印X读取输出,我不知道如何找到测试和火车集之间的余弦距离(可能使用成对相似性? - http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html?)

编辑:

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

使用todense()转换X和Y会给我一个MemoryError - 这意味着它效率低下。

接下来我该怎么办?

我需要得到某种矩阵,其成对余弦相似度为18000 * 18000,或者是稀疏矩阵,但我不知道该怎么做。

这是为了完成家庭作业,在这个阶段没有多少阅读sklearn文档帮助我。

python numpy scikit-learn sparse-matrix tf-idf
2个回答
2
投票

你快到了。使用vect.fit_transform返回document-term matrix.的稀疏表示。它是训练集的文档术语矩阵表示。然后,您需要使用相同的模型转换测试集。提示:在transform上使用test_list方法。你很幸运,因为当sklearn.metrics.pairwise.pairwise_distances(X, Y)通过时,XYmetric='euclidean'采用稀疏矩阵(即你想要的指标)。从这里开始你应该做的非常简单。


0
投票

我想你可以使用pariwise_distances

这是我正在使用的一个例子:

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 )
© www.soinside.com 2019 - 2024. All rights reserved.