问题描述
我的任务是将文档向量模型投入生产。 我是 R 用户,所以我的原始模型是用 R 语言编写的。我们的方法之一是用 Python 重新创建代码和模型。
我对 doc2vec 的 Gensim 实现感到困惑。
在 R 中工作的过程是这样的:
离线
-
使用
text2vec
包中的函数(即 glove 或 GlobalVectors)在大型语料库上训练词向量这给了我一个大型词向量文本文件。 -
在 ML 步骤发生之前,
doc2vec
库中的TextTinyR
函数用于将每段文本从更小、更具体的训练语料库转换为向量。 这不是机器学习步骤。没有训练任何模型。 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过程封装成一个对象?
这个过程还有什么我遗漏的吗?
解决方法
我不知道您提到的 tinyTextR
包的 Doc2Vec
函数在做什么 - Google 搜索没有找到有关其功能的文档。但是如果它是即时的,并且需要词向量作为输入,那么它可能只是将文本单词的所有词向量平均在一起。
您可以在 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
名称。
在 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),这不仅仅是词向量的平均,而是训练特定模型(例如参见 {{ 3}})。 ruimtehol (https://www.bnosac.be/index.php/blog/103-doc2vec-in-r) 允许训练 Starspace 嵌入,它也可以选择训练句子嵌入
,我想您已经知道 textTinyR 包中的 Doc2Vec 函数文档。我想补充的是以下信息:
- 在我提到的 R 包的 second vignette 中:“... 接收转换向量的三种方法之一(sum_sqrt、min_max_norm、idf)。这些方法基于以下博客文章(尤其是 www.linkedin.com/pulse/duplicate-quora-question-abhishek-thakur 和 https://erogol.com/duplicate-question-detection-deep-learning/) ..."
- doc2vec_methods 在 Rcpp 中内部使用了 word_vectors_methods 函数(它实现了前面提到的 3 个方法)以缩短计算时间。
只是为了记录,我是 'textTinyR' 包的作者。