余弦相似度输出不符合预期

0 投票
2 回答
29 浏览
提问于 2025-04-12 01:19

我正在尝试计算一句话中两个单词的余弦相似度。这句话是:“黑猫坐在沙发上,棕狗躺在地毯上”。

我的Python代码如下:

from nltk.tokenize import sent_tokenize, word_tokenize
import warnings
 
warnings.filterwarnings(action = 'ignore')
 
import gensim
from gensim.models import Word2Vec
from sklearn.metrics.pairwise import cosine_similarity

sentence = "The black cat sat on the couch and the brown dog slept on the rug"
# Replaces escape character with space
f = sentence.replace("\n", " ")
 
data = []

# sentence parsing
for i in sent_tokenize(f):
    temp = []
    # tokenize the sentence into words
    for j in word_tokenize(i):
        temp.append(j.lower())
    data.append(temp)
print(data)
# Creating Skip Gram model
model2 = gensim.models.Word2Vec(data, min_count = 1, vector_size = 512, window = 5, sg = 1)

# Print results
print("Cosine similarity between 'black' " +
          "and 'brown' - Skip Gram : ",
    model2.wv.similarity('black', 'brown'))

因为“黑色”和“棕色”都是颜色,所以它们的余弦相似度应该是最大的(大约在1左右)。但是我的结果显示如下:

[['the', 'black', 'cat', 'sat', 'on', 'the', 'couch', 'and', 'the', 'brown', 'dog', 'slept', 'on', 'the', 'rug']]
Cosine similarity between 'black' and 'brown' - Skip Gram :  0.008911405

有没有人知道这里出了什么问题?我对余弦相似度的理解正确吗?

2 个回答

0

你不能只用十几个词(句子里的单词)来训练一个word2vec模型。你需要成千上万甚至上百万个词才能训练好。

0

如果你想自己训练一个word2vec模型,就像你这里展示的那样,你需要一个包含大量不同用法的单词示例的大数据集,才能生成有用的向量。只有通过尝试建模成千上万种不同的单词,以及它们在各种细微变化中的用法,才能把这些单词的向量调整到能够反映相对意义的位置。

如果你的训练数据只有15个单词,或者这些单词的用法示例很少,那么就无法得到有用的结果。(这就是为什么默认的min_count设置为5的原因,通常来说,随着数据量的增加,你应该尝试增加这个值,而不是减少它。)

一般来说,word2vec在小规模的示例中是无法很好地展示或理解的。此外,要创建常见的100到400维的单词向量,最好是有数百万到数十亿个单词的训练文本。如果你想支持更大的维度,比如你选择的vector_size=512,那你需要更多的训练单词。

所以你可以考虑以下几个选项:

  • 如果你想训练自己的模型,找更多的训练文本,使用更小的vector_size,以及更大的min_count;或者

  • 使用别人已经训练好的单词向量集,这些可以加载到Gensim的KeyedVectors对象中(这些向量没有关联的训练模型)

撰写回答