设置max_vocab_size后gensim Word2Vec词汇量随语料增长波动如何解决
问题原因
gensim中max_vocab_size参数的作用是控制词表构建过程中的内存占用阈值,而非最终输出的固定词汇量上限。
它的底层逻辑是:统计语料词频的过程中,每新增一个token到临时词表,就会检查当前临时词表的大小是否达到max_vocab_size的设定值。如果达到阈值,就会立刻批量删除当前词表里词频最低的一批token,再继续统计后续语料,不是等全部语料统计完成后再统一保留频率最高的N个词。
你用的测试语料全是随机生成的token,绝大多数token的出现次数都等于min_count=1,随着语料规模扩大,词表触发剪枝的时机、每次剪枝丢掉的低频次数量都不固定,最终剩下的词表大小自然会出现无规律的波动。全量语料的词汇量比子集更小,是因为全量语料里只出现1次的独一token更多,统计过程中触发剪枝的次数更多,累计丢掉的低频次也更多。
解决方案
- 方案1:先离线统计全部语料的所有token频率,筛选出频率最高的32000个token,调用
build_vocab时传入自定义trim_rule参数,仅保留你预先筛选好的token,即可得到固定大小的词表。 - 方案2:把
max_vocab_size设置为远大于32000的数值(比如10万),避免词表构建过程中提前触发剪枝,等build_vocab执行完成后,手动将词表截断保留前32000个高频词即可。
内容的提问来源于stack exchange,提问作者meliksahturker
相关产品推荐
相关产品推荐

