【问题标题】:Gensim: Is doc2vec a model or operation? Differences from R implementationGensim:doc2vec 是模型还是操作?与 R 实现的区别
【发布时间】:2021-09-02 15:33:44
【问题描述】:

我的任务是将文档矢量模型投入生产。 我是 R 用户,所以我的原始模型是在 R 中。我们拥有的途径之一是在 Python 中重新创建代码和模型。

我对 Doc2vec 的 Gensim 实现感到困惑

在 R 中工作的过程是这样的:

离线


  • 在大型语料库上使用 text2vec 包中的函数(即 GloVe 或 GlobalVectors)训练词向量这给了我一个大型词向量文本文件。

  • 在 ML 步骤发生之前,TextTinyR 库中的 Doc2Vec 函数用于将每段文本从更小、更具体的训练语料库转换为向量。 这不是机器学习步骤。没有模型被训练。 Doc2Vec 函数有效地聚合句子中的词向量,其意义与求向量的总和或平均值相同,但以保留词序信息的方式。

  • 然后在这些较小的文本语料库上训练各种模型。


在线


  • 使用预训练的词向量将新文本转换为文档向量。
  • 文档向量被输入预训练模型以获得输出分类。

我为 Gensim 找到的示例代码似乎与此大相径庭。

gensim 中显示,Doc 向量是与您可以训练的词向量不同的模型类别。似乎在某些情况下,词向量和文档向量都是同时训练的。以下是教程和 stackoverflow 答案中的一些示例:

https://medium.com/@mishra.thedeepak/doc2vec-simple-implementation-example-df2afbbfbad5

How to use Gensim doc2vec with pre-trained word vectors?

How to load pre-trained model with in gensim and train doc2vec with it?

gensim(1.0.1) Doc2Vec with google pretrained vectors

所以我的问题是:

Doc2Vec 的 gensim 实现与 TextTinyR 实现有根本不同吗?

还是说gensim doc2vec模型基本上只是将word2vec模型和doc2vec过程封装成一个对象?

我在这个过程中还有什么遗漏的吗?

【问题讨论】:

    标签: python r gensim word2vec doc2vec


    【解决方案1】:

    在 R 中,您可以使用 text2vec (https://cran.r-project.org/package=text2vec) 训练 Glove 嵌入,使用 word2vec (https://cran.r-project.org/package=word2vec) 训练 word2vec 嵌入或训练 fasttext 嵌入 (https://cran.r-project.org/package=fastText / https://cran.r-project.org/package=fastTextR)。您可以将这些嵌入聚合到文档级别,只需采用例如单词或相关名词/形容词的平均值(如果您使用 udpipe (https://cran.r-project.org/package=udpipe) 标记文本或使用 R 包 TextTinyR (https://cran.r-project.org/package=TextTinyR) 中的方法,它提供了 3 个其他聚合选项:sum_sqrt / min_max_norm / idf

    R 包 doc2vec (https://cran.r-project.org/package=doc2vec) 允许训练段落向量嵌入(Gensim 术语中的 PV-DBOW / PV-DM),这不仅是词向量的平均,而且训练特定模型(例如,参见 https://www.bnosac.be/index.php/blog/103-doc2vec-in-r) . ruimtehol (https://cran.r-project.org/package=ruimtehol) 允许训练 Starspace 嵌入,它也可以选择训练句子嵌入

    【讨论】:

    • 感谢您提醒我这个 docvec 包的存在。它看起来非常有用,并且更符合 gensim 实现。
    【解决方案2】:

    我不知道你提到的tinyTextR 包的Doc2Vec 函数在做什么——谷歌搜索没有找到关于它的功能的文档。但如果它是即时的,并且需要词向量作为输入,也许它只是将文本单词的所有词向量平均在一起。

    您可以在 Gensim 文档中阅读有关 Gensim 的 Doc2Vec 模型的所有信息:

    https://radimrehurek.com/gensim/models/doc2vec.html

    正如它的介绍所解释的那样:

    通过Quoc Le and Tomas Mikolov: “Distributed Representations of Sentences and Documents” 的分布式内存和分布式词袋模型学习段落和文档嵌入。

    Gensim Doc2Vec 实现的算法也被其作者通常称为“段落向量”,包括在 Le 等人 "Document Embeddings With Paragraph Vector" 的后续论文中。

    'Paragraph Vector' 使用类似 word2vec 的训练过程来学习段落(或许多单词的其他文本)的文本向量。这个过程确实需要先验词向量作为输入,但许多模式将与文档向量一起训练词向量。它确实需要对一组文档进行训练,但在训练之后,.infer_vector() 方法可用于训练新文本的向量,而不是在原始训练集中,只要他们使用同样的话。 (此类模型训练后文档中的任何新词都将被忽略。)

    您也许可以使用诸如平均词向量之类的简单方法来近似您的 R 函数。

    或者,您可以试试 Gensim 中的备用 Doc2Vec

    但是,Gensim Doc2Vec 绝对是不同的东西,不幸的是这两个库对不同的进程使用相同的 Doc2Vec 名称。

    【讨论】:

    • 查看 cran.r-project.org/web/packages/textTinyR/textTinyR.pdf 第 15 页了解 textTinyR 的 doc2vec 功能。
    • 所以对textTinyR doc2vec 函数做一些测试,在一个句子上,然后在同一个句子上颠倒和加扰,所有的 doc2vec 输出都是相同的!这个包我用了很长时间都没有注意到,我不敢相信。
    • 该文档对可能的“方法”的描述似乎可能是特殊的 - 我没有立即认识到该计算与其他具有已建立名称的常用技术相似,但它肯定似乎 (1) 通过某种组合计算输入词向量; (2) 与 Gensim 的 Doc2Vec 完全不同。
    • 计算忽略词序是可以理解的 - 词向量的简单平均具有这种质量,并且您链接的文档中的描述不谈论词邻居或排序,只是整个令牌列表。 (如果忽略了字符-scramble,那就是其他问题!)
    【解决方案3】:

    我猜你已经知道 textTinyR 包中的Doc2Vec 函数文档了。我想补充的是以下信息:

    为了记录,我是“textTinyR”包的作者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 2017-10-11
      • 2016-03-26
      • 2021-02-27
      • 2017-02-10
      • 2010-12-07
      相关资源
      最近更新 更多