如何在PyTorch中加载torchtext的IWSLT2017数据集得到与Multi30k一致的输出
解决方案
你目前调用的是新版torchtext的IWSLT2017接口,返回的是原始文本对迭代器,没有自动完成分词、字段封装逻辑,要得到和旧Multi30k调用一致的输出,可选择以下两种方案:
方案1:沿用新版API手动预处理
自己对返回的迭代器做分词、格式封装,代码示例如下:
import spacy from torchtext.datasets import IWSLT2017 # 加载对应语言的分词模型,需提前安装:pip install spacy && python -m spacy download it_core_news_sm en_core_web_sm nlp_it = spacy.load('it_core_news_sm') nlp_en = spacy.load('en_core_web_sm') # 定义分词函数:支持小写、添加特殊标记 def tokenize_it(text): tokens = [tok.text.lower() for tok in nlp_it.tokenizer(text.strip())] return ['<sos>'] + tokens + ['<eos>'] def tokenize_en(text): tokens = [tok.text.lower() for tok in nlp_en.tokenizer(text.strip())] return ['<sos>'] + tokens + ['<eos>'] # 加载数据集 train_iter, valid_iter, test_iter = IWSLT2017( root='.data', split=('train', 'valid', 'test'), language_pair=('it', 'en') ) # 对迭代器做映射转换为目标格式 def process_iter(data_iter): for src_text, trg_text in data_iter: yield { 'src': tokenize_it(src_text), 'trg': tokenize_en(trg_text) } # 测试输出 train_data = list(process_iter(train_iter)) print(train_data[0])
运行后即可得到分词后的{'src': xx, 'trg': xx}格式输出。
方案2:使用旧版Legacy API(兼容原有Multi30k代码逻辑)
torchtext将旧版的Field、Dataset等API移到了torchtext.legacy模块下,可直接复用你之前写Multi30k的逻辑,代码示例如下:
from torchtext.legacy import data, datasets import spacy # 加载分词器 nlp_it = spacy.load('it_core_news_sm') nlp_en = spacy.load('en_core_web_sm') def tokenize_it(text): return [tok.text.lower() for tok in nlp_it.tokenizer(text)] def tokenize_en(text): return [tok.text.lower() for tok in nlp_en.tokenizer(text)] # 定义Field 和之前Multi30k的写法完全一致 SRC = data.Field( tokenize = tokenize_it, lower= True, init_token = "<sos>", eos_token = "<eos>" ) TRG = data.Field( tokenize = tokenize_en, lower= True, init_token = "<sos>", eos_token = "<eos>" ) # 加载IWSLT2017数据集 train_data, valid_data, test_data = datasets.IWSLT2017.splits( exts=('.it', '.en'), fields = (SRC, TRG) ) # 测试输出 和你之前Multi30k的输出格式完全一致 print(vars(train_data.examples[0]))
该方案无需调整你之前的后续数据处理、构建词典、生成迭代器的逻辑,适合沿用旧教程学习的场景。
内容的提问来源于stack exchange,提问作者crispengari
相关产品推荐
相关产品推荐

