python - 使用 Doc2Vec 训练文档时句子中句号的意义
问题描述
怀疑 - 1
我正在用 150000 个文档训练 Doc2Vec。由于这些文件来自合法领域,因此很难清理并为进一步培训做好准备。因此,我决定从文档中删除所有句点。话虽如此,我现在对Window_size
doc2vec 中的参数如何识别句子感到困惑。问题中有两种观点:Doc2Vec:区分句子和文档
- 该算法仅适用于文本块,不知道句子/段落/文档等可能是什么。
- 标记化保留标点符号(例如句子之间的句点)作为独立标记甚至很常见。
因此,如果我采用的消除标点符号(句号)的方法是正确的,我会感到困惑。请给我一些支持性的答案。
怀疑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) – 句子中当前单词和预测单词之间的最大距离.
解决方案
有些人将句号和其他标点符号保留为独立的标记,有些人将它们删除。
没有绝对“正确”的方法,并且根据您的最终目标,其中一种可能会对文档向量质量产生轻微影响。所以现在只做对你来说最简单的事情,然后如果你有时间,你可以评估替代方法,看看它是否有帮助。
尽管文档中提到了“句子”,但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()
实用程序方法——是可以尝试的,但与所有其他可能性相比,它不是“正确的”或“最好的”。
推荐阅读
- react-native -
未使用组件更新 - python - 在 Windows 主机上使用 python (cv2.VideoCapture) 在 docker 容器中打开网络摄像头
- batch-file - 使用 FFmpeg 批量嵌入专辑封面
- datagrid - 使用 clrIfExpandedChange 时延迟加载的可扩展行无法正常工作
- python - 如何根据第一列但不包括第一行对 CSV 文件进行排序?
- java - Treeset和内部类‽我们如何获得数组中元素的两个索引,它们总和为目标值‽
- macos - 无法完全禁用网守
- python - Python递归函数 - 这里发生了什么?
- android - Android 依赖 'android.arch.lifecycle:runtime' 的编译和运行时版本不同
- linux - 查找2的幂的Shell脚本