大家好:)我正在尝试用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)
答案 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.]]
如果您对单个单词之间的相似性感兴趣,可以执行以下几项操作。例如,您可以使用单词中的单个字母来标记字符串。但更常见的是使用其他概念,例如"最小编辑距离"。也可以阅读这些内容。