torchtext报错AttributeError: module 'torchtext.data' has no attribute 'Field'求助
问题描述
- 代码片段:
import torchtext as data import torchtext.datasets as datasets ... text_field = data.Field(lower=True) ...
- 运行错误:
Traceback (most recent call last): File "C:\Users\emre.sinoforoglu\Desktop\cnn-text-classification-pytorch-master\main.py", line 71, in <module> text_field = data.Field(lower=True) ^^^^^^^^^^ AttributeError: module 'torchtext.data' has no attribute 'Field'
- 环境版本:
torch 2.0.0 torchtext 0.15.0
- 尝试过的无效操作:
- 改为
import torchtext.legacy.data as data,出现ModuleNotFoundError: No module named 'torchtext.legacy' - 卸载后安装torchtext 0.8.0,提示找不到对应版本:
- 改为
ERROR: Could not find a version that satisfies the requirement torchtext==0.8.0 (from versions: 0.1.1, 0.2.0, 0.2.1, 0.2.3, 0.3.1, 0.4.0, 0.5.0, 0.6.0, 0.12.0, 0.13.0, 0.13.1, 0.14.0, 0.14.1, 0.15.0, 0.15.1) ERROR: No matching distribution found for torchtext==0.8.0
解决办法
办法一:适配torchtext 0.15.0的新API
torchtext从0.12版本开始重构了API,Field类被拆分,改用分词器、词汇表组合的方式实现相同功能,示例代码如下:
- 导入所需模块:
from torchtext.vocab import build_vocab_from_iterator from torchtext.data.utils import get_tokenizer # 替换成你实际使用的数据集 from torchtext.datasets import AG_NEWS
- 定义分词器(对应原
Field(lower=True)的小写处理):
tokenizer = get_tokenizer('basic_english', lower=True)
- 构建词汇表:
# 获取数据集迭代器 train_iter = AG_NEWS(split='train') # 生成词汇迭代器 def yield_tokens(data_iter): for text, _ in data_iter: yield tokenizer(text) # 构建词汇表,添加未知词、填充词等特殊符号 vocab = build_vocab_from_iterator(yield_tokens(train_iter), specials=["<unk>", "<pad>"]) # 未知词默认用<unk>的索引替代 vocab.set_default_index(vocab["<unk>"])
- 定义文本转换函数(替代原Field的转换逻辑):
text_transform = lambda x: vocab(tokenizer(x))
之后即可用text_transform处理输入文本,实现原Field的功能。
办法二:安装兼容的旧版本依赖
torchtext 0.8.0仅兼容PyTorch 1.7.x版本,你当前使用的PyTorch 2.0.0无法匹配,可选择以下两种方案:
- 降级PyTorch到1.7.1,再安装torchtext 0.8.0:
pip install torch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 pip install torchtext==0.8.0
- 保留PyTorch 2.0.0,安装兼容的torchtext 0.14.0版本(该版本仍保留
legacy模块):
pip install torchtext==0.14.0
安装完成后,使用如下导入语句即可恢复原代码逻辑:
import torchtext.legacy.data as data text_field = data.Field(lower=True)
内容的提问来源于stack exchange,提问作者Yiğit Yılmaz
相关产品推荐
相关产品推荐

