首页 > 解决方案 > 使用 Doc2Vec 训练文档时句子中句号的意义

问题描述

怀疑 - 1

我正在用 150000 个文档训练 Doc2Vec。由于这些文件来自合法领域,因此很难清理并为进一步培训做好准备。因此,我决定从文档中删除所有句点。话虽如此,我现在对Window_sizedoc2vec 中的参数如何识别句子感到困惑。问题中有两种观点:Doc2Vec:区分句子和文档

  1. 该算法仅适用于文本块,不知道句子/段落/文档等可能是什么。
  2. 标记化保留标点符号(例如句子之间的句点)作为独立标记甚至很常见。

因此,如果我采用的消除标点符号(句号)的方法是正确的,我会感到困惑。请给我一些支持性的答案。

怀疑2

我抓取的文档范围从 500 到 5500 个标记,因此我使用大小相当均匀的文档来训练doc2vec甚至减少词汇量的方法是:考虑一个大小大于 1500 个标记的文档,在这种情况下我使用前 50 个标记到 400 个代币 + 600 到 1000 个代币 + 最后 250 个代币。这种方法的动机来自一篇与使用 BERT 对文档进行分类相关的论文,其中 512 个标记的序列是这样生成的。

所以我想知道这个想法是否有点好进行或不建议这样做?

更新- 我刚刚在教程链接https://radimrehurek.com/gensim/models/doc2vec.html中看到了 gensim 使用的 common_text 语料库,发现该语料库中的文档只是单词的标记,不包含任何标点符号。例如:

from gensim.test.utils import common_texts, common_dictionary, common_corpus

print(common_texts[0:10])

输出:

[['human', 'interface', 'computer'], ['survey', 'user', 'computer', 'system', 'response', 'time'], ['eps', 'user', 'interface', 'system'], ['system', 'human', 'system', 'eps'], ['user', 'response', 'time'], ['trees'], ['graph', 'trees'], ['graph', 'minors', 'trees'], ['graph', 'minors', 'survey']]

教程https://radimrehurek.com/gensim/auto_examples/tutorials/run_doc2vec_lee.html也遵循了同样的原则。我在文档中删除句点的方法也是有效的,如果是,那么 window 参数将如何工作,因为在文档中它定义如下: window (int, optional) – 句子中当前单词和预测单词之间的最大距离.

标签: pythongensimword2vecdoc2vec

解决方案


有些人将句号和其他标点符号保留为独立的标记,有些人将它们删除。

没有绝对“正确”的方法,并且根据您的最终目标,其中一种可能会对文档向量质量产生轻微影响。所以现在只做对你来说最简单的事情,然后如果你有时间,你可以评估替代方法,看看它是否有帮助。

尽管文档中提到了“句子”,但Word2Vec/ Doc2Vec/etc 中的类gensim对句子没有任何理解,或者对标点符号特别敏感。他们只是将您传入的令牌列表视为语料库中的单个项目。因此,如果您要留下句号,例如在短文本中...

['the', 'cat', 'was', 'orange', '.', 'it', 'meowed', '.']

...然后'.'字符串只是另一个伪词,它将获得一个向量,训练窗口将像任何其他词一样通过它。(并且,'meowed'将距离 5 个标记'cat',因此如果 有一些影响window=5。)

我不太明白您所说的“使用前 50 到 400 个令牌 + 600 到 1000 个令牌 + 最后 250 个令牌”是什么意思。Doc2Vec最多可以处理 10000 个令牌的文本。(由于gensim.

一小组common_texts单词列表是一个人为的、玩具大小的数据,用于演示一些基本的代码用法——它不是推荐实践的例子。基于“Lee”语料库的演示同样是对一种小而简单的方法的快速介绍,该方法仅足以显示基本用法和结果。它的文本标记化——通过simple_preprocess()实用程序方法——是可以尝试的,但与所有其他可能性相比,它不是“正确的”或“最好的”。


推荐阅读