Keras Tokenizer中word_index长度不受max_words影响的原因排查
为什么
Tokenizer的word_index长度不受num_words限制? 这是个很常见的误解,我来给你拆解清楚:
核心原因:num_words的作用不是限制词汇表生成
Tokenizer的num_words参数不会影响fit_on_texts()生成完整词汇表的过程。fit_on_texts()会遍历所有输入文本,统计每一个出现过的词,最终生成包含全部88582个词的word_index字典——不管你设置的max_words是多少。
那num_words到底管什么?它是用来控制后续文本转换为序列时的词汇保留规则:当你调用texts_to_sequences()时,只会保留前num_words-1个高频词(因为索引0是留给填充(padding)的特殊值),其他低频词会被直接忽略。
验证与解决方案
比如你的代码里,虽然tokenizer.word_index有88582个词,但如果执行:
sequences = tokenizer.texts_to_sequences(texts)
生成的序列里只会包含前99个高频词的索引(因为你设置了max_words=100),剩下的词都会被过滤掉。
如果你的需求是获取仅包含前N个高频词的索引字典,可以手动截取word_index:
from keras.preprocessing.text import Tokenizer max_words = 100 tokenizer = Tokenizer(num_words=max_words) tokenizer.fit_on_texts(texts) # 截取前max_words-1个高频词(因为索引0不对应任何词) top_word_index = {word: idx for word, idx in tokenizer.word_index.items() if idx < max_words} print(len(top_word_index)) # 这里会输出99(当总词汇数>=100时)
补充说明
官方文档里明确提到:num_words是"the maximum number of words to keep, based on word frequency. Only the most common num_words-1 words will be kept." 记住这个细节,避免后续处理序列时踩坑。
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

