【问题标题】:Can doc2vec work on an artificial "text"?doc2vec 可以处理人工“文本”吗?
【发布时间】:2021-01-14 00:38:45
【问题描述】:

我创建了一个人工语料库(包含 52624 个文档)。每个文档都是一个对象列表(其中有 461 个)。

所以一种可能是:['chair', 'chair', 'chair', 'chair', 'chair', 'table', 'table']

这是词汇表的条形图(对数刻度)。

这就是我定义模型的方式:

model = gensim.models.doc2vec.Doc2Vec(vector_size=8, workers=4, min_count=1,epochs=40, dm=0)

观察地点: model.wv.most_similar_cosmul(positive = ["chair"])

我看到不相关的词

在我看来,以下工作也很糟糕:

inferred_vector = model.infer_vector(["chair"])
model.docvecs.most_similar([inferred_vector])

我的模型哪里失败了?

更新

有数据(JSON文件):

https://gofile.io/d/bZDcPX

【问题讨论】:

    标签: machine-learning nlp gensim word2vec doc2vec


    【解决方案1】:

    是的,Doc2VecWord2Vec 经常在合成数据上进行尝试并且很有用。但是,当数据与最初开发这些算法的自然语言所反映的相关性/分布类型不同时,它们是否有效可能需要更多的修补和非典型参数。

    首先,在您的设置中,您使用的是dm=0 模式。那是原始“段落向量”论文的PV-DBOW 模式,具体训练词向量根本,只训练文档向量。因此,如果您通过查看词向量来测试这样的模型,您的结果将只反映任何词向量的随机、未经训练的初始化值。

    请检查model.docvecs,以了解您在数据中指定的任何文档标签之间的相似性,以及它们可能更有用的关系。

    (如果您希望 Doc2Vec 模型也能学习单词——这并不一定很重要,尤其是对于小数据集或文档向量是你主要兴趣的地方——你必须使用 dm=1模式,或将dbow_words=1 添加到dm=0 以便模型添加交错skip-gram 训练。但请注意,对于看起来只是重复标记的排序运行的数据,词向量训练可能是弱/无意义/有害的,与您的 ['chair', 'chair', 'chair', 'chair', 'chair', 'table', 'table'] 示例项目。)

    另外,在此类模型中使用非常低的 min_count=1 通常是一个坏主意 - 因为此类具有任意特殊非代表性外观的令牌对周围更常见令牌的连贯性造成的损害比它们的帮助更大。

    【讨论】:

    • 非常感谢! min_conut=1 的想法是我不想丢失任何类型的对象(它不像真正的语言,你想忽略深奥的单词。我认为dm=0 更适合作为words 在这里无关紧要。words-vector 实际上对我来说并不重要
    • 是的,如果顺序不合适,dm=0 很有意义——但是你应该只比较训练有素的tags,而不是单词。 (或者,如果有其他理由尝试dm=1,则对每个文本进行改组,以阻止由无关紧要但可能受格式影响的排序创建的任何人为关系,或者使用大量的window,这样实质上,每个单词都在其他单词的上下文中。)
    • 即使数据不是真正的自然语言,非常稀有的标记比它们的价值更麻烦的见解可能仍然适用。在许多领域,从一个单一的第一个/特殊的例子过度概括通常比认为它是中立的更糟糕。同样对于经典设置中的 doc-vectors,每个 doc 都有自己的唯一 ID:当文本在没有其他示例中包含唯一单词时,DBOW 训练可能会过分强调该单词(没有偏移示例),或者 DM训练可能会为该词的向量注入一些您希望在 doc-vector 中具有的“预测能力”。
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2011-05-05
    • 2021-04-07
    相关资源
    最近更新 更多