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

标签 python numpy scikit-learn sparse-matrix tf-idf

我有两个 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 文档再多也无济于事。

最佳答案

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

关于python - 如何从 TfidfVectorizer 计算余弦相似度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39432350/

相关文章:

python - 如何获取最大操作的索引

python - 在 nltk 中使用 scikit-learn 分类器,多类案例

python - 了解 scikit 神经网络参数

python - Pyodbc 更新游标

numpy - 将 numpy.datetime64 转换为纪元时间

python - 棘手的 MySQL 查询而不是 Python 脚本来实现结果?

使用 numpy 矩阵计算距离的 Pythonic 方法?

python - 决策树学习中当前节点到下一个节点的特征组合: useful to determine potential interactions?

python - 函数不改变全局变量

python - 如何解决错误 FileNotFoundError : [WinError 2] The system cannot find the file specified when using ffmpeg-python?