如何计算一个文本文件中单词之间的成对余弦相似度矩阵

时间:2018-02-03 14:10:11

标签: python text cosine-similarity

大家好:)我正在尝试用python编码来计算(和打印)文本文件中单词之间的余弦相似度矩阵。

所以,例如我所拥有的是这个文本文件:

f.txt: “你好,我的名字是莎拉,现在我正在寻求你的帮助”

输出应该是:

 hello  my  name  is  Sara  and  now  I'm  looking  for  your  help

你好1 0.54 0.42 ...... ........ .......... ...

名称

萨拉

现在

寻找

你的

帮助

等等。有什么帮助来编码吗?

这是我的尝试:

import nltk
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
tokens = []
with open('try.txt', 'r') as f:
for line in f.readlines():
    tokens += (nltk.word_tokenize(line)) # BC I have long file so this give me memory error
# Vectorise the data
vec = TfidfVectorizer()
X = vec.fit_transform(tokens)
S = cosine_similarity(X)

print(S) 

1 个答案:

答案 0 :(得分:0)

我认为你误解了余弦相似性是什么。我建议阅读基于它们的余弦相似性的文本比较完全相同,但只是为了给你一个粗略的想法:余弦相似性通常用于比较两个字符串,其中每个字符串由多个标记组成。首先对每个字符串进行标记,然后将标记转换为向量。虽然字符串中的任何内容都可以作为标记,但选择单个单词作为标记是很常见的。

在您的示例中,每个字符串只包含一个标记,即单词。所以你基本上要问:"字符串' Hello'之间有什么相似之处?和字符串' Sara',使用每个字符串中的单词作为比较单位"。这没有任何意义。 '你好'不是在Sara'和#Sara'不在' Hello',因此相似度为0.为了显示这一点,这里有一个适用于您的示例的工作代码:

import nltk
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

the_corpus = ['Hello',  'my',  'name', 'is', 'Sara', 'and', 'now', 'I\'m', 
'looking', 'for', 'your', 'help']
# Vectorise the data
vec = TfidfVectorizer()
X = vec.fit_transform(the_corpus)
S = cosine_similarity(X)
print(S) 

输出效果不大。

[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 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. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]

如果您对单个单词之间的相似性感兴趣,可以执行以下几项操作。例如,您可以使用单词中的单个字母来标记字符串。但更常见的是使用其他概念,例如"最小编辑距离"。也可以阅读这些内容。