当达到 2000000 个令牌时,有没有办法停止在 gensim.WikiCorpus 中创建词汇?

Posted

技术标签:

【中文标题】当达到 2000000 个令牌时,有没有办法停止在 gensim.WikiCorpus 中创建词汇?【英文标题】:is there a way to stop creation of vocabulary in gensim.WikiCorpus when reach 2000000 tokens? 【发布时间】:2021-12-13 14:12:08 【问题描述】:

我下载了最新的 wiki 转储多流 bz2。我从 gensim 语料库中调用 WikiCorpus 类,在 90000 个文档之后,词汇量达到最高值(2000000 个标记)。 我在终端得到了这个:

保留 2000000 个令牌,这些令牌在不少于 0 且不超过 580000 (=100.0%) 个文档中 结果字典:字典(2000000 个唯一标记:['ability', 'able', 'abolish', 'abolition', 'about']...) 将文档 #580000 添加到 Dictionary(2000000 个唯一标记:['ability', 'able', 'abolish', 'abolition', 'about']...)

WikiCorpus 类继续工作,直到我的 bz2 中的文档结束。 有没有办法阻止它?或将 bz2 文件拆分为示例? 感谢您的帮助!

【问题讨论】:

【参考方案1】:

没有限制令牌数量的特定参数。但是当您使用WikiCorpus.get_texts() 时,您不必全部阅读:您可以随时停止。

如果按照您的另一个问题的建议,您打算使用 Gensim Word2Vec(或类似模型)的文章文本,则不需要构造函数自己进行昂贵的全扫描词汇发现.如果您提供任何虚拟对象(例如空的dict)作为可选的dictionary 参数,它将跳过这个不必要的步骤。例如:

wiki_corpus = WikiCorpus(filename, dictionary=)

如果您还想使用整套文章的某些截断版本,我建议您手动迭代仅部分文章。例如,如果子集很容易作为list 放入 RAM 中,比如 50000 篇文章,那么简单如下:

import itertools
subset_corpus = list(itertools.islice(wiki_corpus, 50000))

如果您想创建一个大于 RAM 的子集,请迭代设定数量的文章,将它们的标记化文本写入临时文本文件,每行一个。然后将该文件用作您以后的输入。 (通过只花费一次 WikiCorpus 提取/标记化工作,然后重用磁盘中的文件,即使您不需要这样做,有时也可以提高性能。)

【讨论】:

以上是关于当达到 2000000 个令牌时,有没有办法停止在 gensim.WikiCorpus 中创建词汇?的主要内容,如果未能解决你的问题,请参考以下文章

停止刷新令牌的竞争条件?

LibGDX 暂停时停止时间计数器

有没有办法在销毁链表时取消引用 nullptr 时停止接收异常错误?

当pygame达到某种情况时如何停止定时器

iOS:当用户滚动表格视图时标签停止更新

如何在解析期间设置 github 令牌的自动更改?