如何解决Gensim 中的 filter_extreme
我刚刚开始使用 Gensim 模块。我将 filter_extreme 应用于我处理过的文档。
dictionary = gensim.corpora.Dictionary(processed_docs)
print(len(dictionary))
输出为91436
然后我申请了filter_extreme
,
dictionary.filter_extremes(keep_n=None)
print(len(dictionary))
输出为 20687
。
从 Gensim 文档来看,keep_n=None
将保留所有令牌,但是,就我而言,令牌减少了 70000。我是否误解了 filter_extremes
的功能?
解决方法
filter_extremes
reads 的文档:
Dictionary.filter_extremes(no_below=5,no_above=0.5,keep_n=100000)
过滤掉出现在
中的token- 少于no_below 个文件(绝对数)或
- 超过no_above 个文档(总语料库大小的一部分,而不是绝对数量)。
- 在 (1) 和 (2) 之后,只保留第一个 keep_n 最频繁的标记(如果 None,则保留所有标记)。
修剪后,缩小单词 id 中产生的间隙。
注意:由于间隔缩小,同一个词在调用这个函数前后可能会有不同的词id!
如您所见,该方法仅在根据前两个参数 keep_n
和 no_below
的值丢弃标记后才查看 no_above
值。
您似乎没有明确为后两个传递所需的截止点,因此它们默认为 5 和 0.5,分别丢弃出现在您语料库中少于 5 个和超过一半的所有文档中的标记.我的猜测是,您的字典中大约有 70,000 个标记符符合后两个标准。
如果,无论出于何种原因,人们开始使用 .filter_extremes()
方法以保证所讨论的字典保持不变,则需要这样运行它:dictionary.filter_extremes(no_below=1,no_above=1,keep_n=None)
.
还要注意 gensim 的字典 comes with another argument 可能会导致类似的混淆:prune_at
,默认值为 2,000,000。如果没有被覆盖,它将导致 gensim 试图将令牌的数量保持在 2,000 的最大值(如果语料库足够大,则会大大降低您的代码速度)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。