【问题标题】:Failing to Understand Doc2Vec Output无法理解 Doc2Vec 输出
【发布时间】:2021-03-23 21:11:17
【问题描述】:

所以我开始尝试学习 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 中的机器学习很困难”最相似。至少我是这么理解的。

【问题讨论】:

    标签: python doc2vec


    【解决方案1】:

    您可能误解了输出。数字是训练向量的索引。因此,它与索引2 处的向量(即I love building chatbots)最相似,而与索引1 处的向量(即I love coding in python)最相似。

    话虽如此,不要创建两个模型,一个用于创建向量,一个用于测试。只有你创建向量的模型理解向量,另一个不理解。

    奇怪的结果可能是因为没有足够的数据让机器理解或开发有用的词嵌入。随机性可能是因为每次运行它时都会在创建词向量时滚动不同的 RNG。如果有办法,请尝试设置随机状态。

    【讨论】:

      【解决方案2】:

      Doc2Vec 和类似的算法在这样的玩具大小的数据集上不起作用。演示的最低限度将是包含数百个文本和数万个训练单词的内容 - 对于这样一个(仍然非常小的)数据集,您再次希望将默认的 vector_size 减少到像这样的小东西您的 10-20 值,而不是默认的 100

      首先,在更大的数据集上进行测试。原始论文和大多数其他重要的演示将使用数万个文本集,每个文本集至少十几个,理想情况下是几十或数百个单词。

      其次,您当前的代码正在创建一个初始 Doc2Vec 实例,然后在其上调用 .build_vocab(),然后... 丢弃该模型,并在您的第二次分配中创建一个全新模型到 model多变的。您只需要创建一个,它应该只有您真正想要的参数 - 而不是当前代码中不同参数的混合。

      在 INFO 级别打开日志记录将提供有助于您了解正在发生的步骤的输出 - 当您学习阅读输出时,您可能会看到进展良好的确认信息或问题的指示。

      最后,min_count=1 几乎总是一个坏主意 - 这些算法需要一个单词的多个使用示例,以免它在训练中成为噪音,通常最好丢弃单例(和非常罕见的)单词以允许别人变得更好。 (一旦您使用更大的数据集,丢失单词而不是只出现 1 到几次应该不是什么大问题。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 2013-12-23
        • 2014-09-19
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多