Tokenizer.word_index无"START"/"END"却含"start"/"end"的问题排查
问题原因分析
这个现象的核心原因是Keras Tokenizer的默认行为会自动将所有文本转为小写,具体拆解如下:
- 当你初始化
Tokenizer时,如果没有显式设置lower=False,它的默认参数lower=True会在处理文本时把所有单词转换成小写形式。 - 你的代码里手动给描述添加了大写的
"START"和"END"标记,但在调用tokenizer.fit_on_texts()处理这些文本时(这是生成word_index的必要步骤,虽然你没贴这部分代码,但流程上必然存在),Tokenizer会自动把这两个标记转成小写的"start"和"end",因此最终生成的word_index字典里只会存在小写形式的键。
对应你的代码流程
- 你在
train_test_data函数中给每个描述首尾加上了大写的"START "和" END"; - 之后用Tokenizer基于这些带标记的描述构建词汇表;
- 由于Tokenizer默认开启小写转换,
"START"被转为"start","END"被转为"end",所以word_index里只有小写形式的键。
解决方案
你有两种直观的解决方式:
统一使用小写标记
修改train_test_data函数里的标记为小写:l = "start " + " ".join(l) + " end"同时同步修改
createCaptions函数里的初始序列和结束判断:inSeq = "start" # ... if ID == "end": break关闭Tokenizer的自动小写转换
在初始化Tokenizer时显式设置lower=False,保留文本的大小写:from keras.preprocessing.text import Tokenizer tokenizer = Tokenizer(lower=False)这样
word_index里就会保留你手动添加的"START"和"END"键,无需修改其他代码。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

