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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:36:06