我正在尝试生成句子中两个单词之间的余弦相似度。这句话是“黑猫坐在沙发上,棕色狗睡在地毯上”。
我的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
知道这里出了什么问题吗?我对余弦相似度的理解正确吗?
如果您正在训练自己的 word2vec 模型,正如您在此处所示,它需要一个包含各种单词使用上下文示例的大型数据集来创建有用的向量。只有尝试对数以万计的不同单词进行建模(在许多微妙变化的用法中)的推拉操作,才能将单词向量移动到反映相对含义的位置。
仅包含 15 个单词的训练语料库或使用示例很少的单词就不会发挥这种作用。 (默认
min_count
为 5 有一个很好的理由,一般来说,当您的数据变得足够大以允许它时,您应该尝试增加该值,而不是减少它。)
一般来说,word2vec不能用玩具大小的例子来很好地演示或理解。此外,甚至要创建 100 到 400 维的常见维度的词向量,最好有数百万或数十亿个单词的训练文本。您需要更多的训练单词来支持更大的维度,例如您的
vector_size=512
选择。
因此,您的一些潜在选择是:
如果你想训练自己的模型,请找到更多的训练文本,使用较小的
vector_size
和较大的min_count
;或
使用其他人预训练的词向量集,可以将其加载到 Gensim
KeyedVectors
对象(没有关联训练模型的向量)