加载IMDB数据集时build_vocab_from_iterator报'tuple'无lower属性的问题
错误原因与解决方法
原因分析
- WikiText2数据集的训练迭代器返回的每一项都是纯文本字符串,直接用tokenizer处理完全适配
- IMDB数据集的训练迭代器返回的每一项是**(标签, 文本)**的二元组,当你直接把元组传给
basic_englishtokenizer时,tokenizer内部会尝试调用字符串的lower()方法做小写转换,但元组没有这个属性,因此抛出'tuple' object has no attribute 'lower'错误
修正后的代码
from torchtext.datasets import WikiText2, IMDB from torchtext.data.utils import get_tokenizer from torchtext.vocab import build_vocab_from_iterator tkzer = get_tokenizer('basic_english') # WikiText2的处理逻辑不变 tr_iter = WikiText2(split='train') vocabulary_wiki = build_vocab_from_iterator(map(tkzer, tr_iter), specials=['<unk>']) # IMDB的处理:先提取每个元组中的文本部分,再分词 tr_iter_imdb = IMDB(split='train') # 生成只包含文本的迭代器 text_iter_imdb = (text for label, text in tr_iter_imdb) # 基于文本迭代器构建词汇表 vocabulary_imdb = build_vocab_from_iterator(map(tkzer, text_iter_imdb), specials=['<unk>'])
关键说明
- 用生成器表达式
(text for label, text in tr_iter_imdb)从IMDB的元组数据中剥离出纯文本内容,确保tokenizer处理的是字符串类型 - 后续的
map(tkzer, text_iter_imdb)就和WikiText2的处理逻辑一致,能正常完成分词和词汇表构建
内容的提问来源于stack exchange,提问作者Sumit
相关产品推荐
相关产品推荐

