使用DistilBERT分词时报TextEncodeInput类型错误该如何解决?
问题原因
- 参数类型不匹配:HuggingFace Transformers库的
tokenizer.encode()方法仅支持传入字符串、或两个字符串组成的元组作为输入,你在代码中传入了seq.split(" ")生成的分词列表,不符合接口要求,直接触发类型错误。 - 代码执行顺序倒置:你在代码中先执行
idx的计算逻辑,此时生成txt_seq的padding步骤还未运行,txt_seq属于未定义/非预期值的状态,即便参数类型修正也会报错。 - 逻辑冗余:你已经提前调用
tokenizer.tokenize()完成了分词、并手动添加了[CLS]/[SEP]特殊标记,后续再调用encode属于重复处理,容易导致特殊标记被二次转义的问题。
解决方案
你可以参考下方修正后的代码,核心调整了执行顺序、参数输入,同时简化冗余逻辑:
import numpy as np import re maxlen = 50 maxqnans = np.int((maxlen-20)/2) # 分词加特殊标记 corpus_tokenized = ["[CLS] "+ " ".join(tokenizer.tokenize(re.sub(r'[^\w\s]+|\n', '', str(txt).lower().strip()))[:maxqnans])+ " [SEP]" for txt in corpus] # 先做padding生成txt_seq txt_seq = [txt + " [PAD]"*(maxlen-len(txt.split(" "))) if len(txt.split(" ")) != maxlen else txt for txt in corpus_tokenized] # 计算mask masks = [[1 if token != "[PAD]" else 0 for token in seq.split(" ")] for seq in txt_seq] # 修正encode输入,关闭自动加特殊标记 idx = [tokenizer.encode(seq, add_special_tokens=False) for seq in txt_seq] # 计算segments segments = [] for seq in txt_seq: temp, i = [], 0 for token in seq.split(" "): temp.append(i) if token == "[SEP]": i += 1 segments.append(temp) # 生成训练向量 X_train = [np.asarray(idx, dtype='int32'), np.asarray(masks, dtype='int32'), np.asarray(segments, dtype='int32')]
关键改动说明
- 调整了代码执行顺序,先完成padding生成
txt_seq后再计算mask、idx tokenizer.encode直接传入字符串格式的完整序列,添加add_special_tokens=False参数避免重复添加你已经手动插入的[CLS]/[SEP]标记- 优化了mask的计算逻辑,直接根据
[PAD]标记生成,避免长度计算错误
内容的提问来源于stack exchange,提问作者ccc
相关产品推荐
相关产品推荐

