值列表的余弦相似度

问题描述 投票:1回答:2

我试图找到字符串列表的余弦相似性。我使用sklearn tfidf向量首先将文本转换为数字向量,然后使用成对的cosine_similarity api找到每个字符串对的得分。

字符串似乎相似,但我得到一个奇怪的答案。除了单词TRENTON之外,字符串数组中的第一个和第三个值是相似的,但余弦相似度是0.类似地,第一个,第三个和第四个字符串是相同的,除了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.       ]]
python scikit-learn tf-idf tfidfvectorizer
2个回答
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,因为每个向量都与自身相似。


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/

© www.soinside.com 2019 - 2024. All rights reserved.