我有两个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的输出,我不知道如何找到测试和训练集之间的余弦距离(可能使用成对相似性? - {{3 }})
编辑:
我为我的测试数据重复了相同的步骤。
现在我有两个类型为scipy.sparse.csr.csr_matrix
的稀疏矩阵X和Y - 但由于它们都是稀疏的并且类型为(doc, term) tf-idf
,所以我不能通过直接乘法直接得到X和Y之间的余弦相似性。
使用todense()
转换X和Y会给我一个MemoryError - 这意味着它效率低下。
接下来我该怎么办?
我需要得到某种矩阵,其成对余弦相似度为18000 * 18000,或者是稀疏矩阵,但我不知道该怎么做。
这是作业,在这个阶段没有任何阅读sklearn文档帮助我。
答案 0 :(得分:2)
你快到了。使用vect.fit_transform
返回document-term matrix.的稀疏表示。它是训练集的文档术语矩阵表示。然后,您需要使用相同的模型转换测试集。提示:在transform
上使用test_list
方法。您很幸运,因为sklearn.metrics.pairwise.pairwise_distances(X, Y)
在传递X
时会为Y
和metric='euclidean'
获取稀疏矩阵(即您想要的指标)。从这里开始你应该做的非常简单。
答案 1 :(得分:0)
我认为您可以使用pariwise_distances
以下是我正在使用的示例:
intrs = Counter(t1) & Counter(t2)
count = sum(intrs.values())