使用 Doc2Vec 训练文档时句子中句号的重要性

significance of periods in sentences while training documents with Doc2Vec

疑问 - 1

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

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

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

疑问2

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

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

Update - 刚看到教程linkhttps://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) – 句子中当前词和预测词之间的最大距离。

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

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

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

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

...那么 '.' 字符串只是另一个伪词,它会得到一个向量,训练 windows 会像其他任何词一样通过它到达。 (并且,'meowed' 将距离 'cat' 5 个令牌,因此如果 window=5 会产生一些影响。)

我不太明白你说的"make use of First 50 to 400 tokens + 600 to 1000 tokens + last 250 tokens"是什么意思。 Doc2Vec 适用于 10000 个标记的文本。 (由于 gensim 的内部实现限制,比这更多的标记将被默默忽略。)将文档分成更小的块是没有必要的,也不是典型的,除非您有其他需要对更小的文本块建模。

微小的 common_texts 组单词列表是人为设计的、玩具大小的数据位,用于演示一些基本的代码用法 - 它不是推荐做法的示例。基于 'Lee' 语料库的演示同样是对一种微小而简单的方法的快速介绍,这种方法仅勉强足以显示基本用法和结果。这是文本标记化——通过 simple_preprocess() 实用方法——可以尝试,但与所有其他可能性相比,'right' 或 'best' 不行。