我正在尝试查找字符串列表的余弦相似度。我先使用sklearn tfidf向量将文本转换为数字向量,然后使用成对的cosine_similarity API查找每个字符串对的得分。
字符串看起来很相似,但是我得到一个奇怪的答案。字符串数组中的第一个和第三个值相似,但单词TRENTON除外,但余弦相似度为0。类似,第1,第3和第4个字符串相同,除了GREEN和CHILLI之间的空格和余弦相似度为零。那不是很奇怪吗?
我的代码:
from sklearn.metrics import pairwise_kernels
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer=TfidfVectorizer()
values =['GREENCHILLI TRENTON'
,'GREENCHILLI'
,'GREEN CHILLI'
,'GREEN CHILLI']
X_train_counts = tfidf_vectorizer.fit_transform(values)
similarities = cosine_similarity(X_train_counts)
print(similarities)
输出
[[1. 0.6191303 0. 0. ]
[0.6191303 1. 0. 0. ]
[0. 0. 1. 1. ]
[0. 0. 1. 1. ]]
答案 0 :(得分:0)
在最后两个GREEN CHILLI之间缺少逗号(,),因此tfidf将其视为仅3条记录而不是4条记录。
如果您对其进行了更正,则应该在下面看到余弦相似度
[[1. 0.6191303 0. 0. ]
[0.6191303 1. 0. 0. ]
[0. 0. 1. 1. ]
[0. 0. 1. 1. ]]
如何解释上述矩阵:第n行中的值是该tfidf向量与所有其他向量的余弦相似度(按顺序排列)。因此所有对角线将为1,因为每个向量都与其自身相似。
答案 1 :(得分:0)
除了单词Trenton之外,字符串数组值中的第一个和第三个值相似,但余弦相似度为0。 类似地,第一,第三和第四字符串是相同的,只是GREEN和CHILLI之间的空间,并且余弦相似度为零。奇怪吗?
这并不像您想的那样奇怪。如果您比较的字符串之间具有完全匹配的单词,则您只会得到一个非零的余弦相似度。我将尝试解释会发生什么:
当TF-IDF矢量化程序从您的字符串列表中创建矢量时,它首先列出所有出现的单词。
因此,在您的情况下,列表如下所示:
GREENCHILLI
TRENTON
GREEN
CHILLI
现在,每个单词都成为该算法使用的坐标系中的一个轴。所有轴彼此垂直。
因此,当您将“ GREENCHILLI TRENTON”与“ GREEN CHILLI”进行比较时,该算法将得出两个向量。来自“ GREENCHILLI TRENTON”的组件,具有与“ GREENCHILLI”平行的组件和与“ TRENTON”平行的组件。字符串“ GREEN CHILI”中的向量在坐标系的“ GREEN”和“ CHILLI”方向具有分量。计算两者之间的点积时,您将得到零。因此,余弦相似度也为零。
因此,当您将其与“ GREENCHILLI”进行比较时,“ GREEN CHILLI”中的差异将发挥所有作用。一旦向量化器根据列表中找到的所有单词建立了坐标系,这些字母就不再重要了,因为它可以将“ GREENCHILLI”,“ GREEN”和“ CHILLI”标识为不同的单词,并将它们变成垂直轴。它的参考坐标系。
希望更加清晰。我建议阅读以下文章系列,以更深入地了解正在发生的事情:
http://blog.christianperone.com/2011/09/machine-learning-text-feature-extraction-tf-idf-part-i/