所以我开始尝试学习Doc2Vec,特别是余弦相似度输出。基本上,当我尝试将一个新句子与我训练模型的句子列表进行匹配时,我得到了意想不到的输出。如果有人能帮上忙,那就太棒了,下面是我的代码:
import gensim
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
import nltk
from nltk.tokenize import word_tokenize
data = [
'I love machine learning'
,'I love coding in python'
,'I love building chatbots'
,'they chat amazingly well'
,'dog poops in my yard'
,'this is a stupid exercise'
,'I like math and statistics'
,'cox communications is a dumb face'
,'Machine learning in python is difficult'
]
tagged_data = [TaggedDocument(words = word_tokenize(d.lower()), tags = [str(i)]) for i, d in enumerate(data)]
max_epochs = 15
vec_size = 10
wndw = 2
alpha_num = 0.025
model = Doc2Vec(vector_size = vec_size
,window = wndw
,alpha = alpha_num
,min_alpha = 0.00025
,min_count = 1
,dm = 1)
model.build_vocab(tagged_data)
model = Doc2Vec(tagged_data, vector_size = 20, window = 2, min_count = 1, workers = 4, epochs = 100)
new_sent = 'machine learning in python is easy'.split(' ')
model.docvecs.most_similar(positive = [model.infer_vector(new_sent)])我收到的输出是这样的(而且每次运行时它也是随机的,所以我也不确定):
[('2', 0.4818369746208191),
('5', 0.4623863697052002),
('3', 0.4057881236076355),
('4', 0.3984462022781372),
('8', 0.2882154583930969),
('7', 0.27972114086151123),
('6', 0.23783418536186218),
('0', 0.11647315323352814),
('1', -0.12095103412866592)]这意味着该模型表明“我喜欢用python编码”与“python中的机器学习很容易”最相似,而我希望“python中的机器学习很难”是最相似的。至少我是这么理解的。
发布于 2021-03-24 06:08:35
您可能误解了输出。这些数字是训练向量的索引。因此,它与索引2处的向量最相似,即I love building chatbots,而与索引1处的向量最不相似,即I love coding in python。
也就是说,不要创建两个模型,一个用于创建向量,另一个用于测试。只有你用来创建向量的模型才能理解向量,另一个则不能。
奇怪的结果可能是因为没有足够的数据让机器理解或开发有用的单词嵌入。随机性可能是因为每次运行它时,在创建单词向量时都会滚动不同的RNG。如果有办法的话,请尝试设置随机状态。
发布于 2021-03-24 11:28:14
Doc2Vec &类似的算法在像这样的玩具大小的数据集上没有意义。要演示的最低限度是包含数百个文本和数万个训练词-对于这样一个(仍然非常小的)数据集,您可能再次希望将默认vector_size减少到像您的10-20值这样的小值,而不是默认100。
因此,首先也是最重要的,在更大的数据集上进行测试。原始论文和大多数其他非平凡的演示将使用数以万计的文本集,每个文本集至少12个,理想情况下长达数十个或数百个单词。
其次,您当前的代码是创建一个初始Doc2Vec实例,然后对其调用.build_vocab(),然后...丢弃该模型,并在model变量中的第二个赋值中创建一个全新的模型。你只需要创建一个,并且它应该只有你真正想要的参数-而不是你当前代码中不同参数的混合。
在INFO级别打开日志记录将提供输出,这些输出将帮助您了解正在发生的步骤-当您学习阅读输出时,您可能会看到良好进度的确认,或问题的指示。
最后,min_count=1几乎总是一个糟糕的想法--这些算法需要多个单词用法的例子,才能使它在训练中不成为噪音,而且通常更好的做法是丢弃单个(&非常罕见)的单词,让其他单词变得更好。(一旦你使用了一个更大的数据集,丢失比只出现1到几次的单词应该不是什么大问题。)
https://stackoverflow.com/questions/66771354
复制相似问题