You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 12:36:02