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

使用DistilBERT AutoTokenizer处理自定义数据时遇TypeError错误求助

解决DistilBERT Token分类中的PreTokenizedEncodeInput类型错误

错误根源

这个报错是因为传给分词器的examples["tokens"]格式不满足is_split_into_words=True的要求。当开启这个参数时,输入必须是每个样本对应一个已分词的字符串列表,比如:

# 正确格式示例
examples = {
    "tokens": [["i", "am", "a", "student"], ["hello", "world"]],
    "ner_tags": [[0, 0, 0, 1], [2, 0]]
}

如果你的examples["tokens"]是未拆分的整句字符串(比如["i am a student", "hello world"]),或者格式不是嵌套列表,就会触发该类型错误。

修复方案

1. 修正数据集格式

确保自定义数据集中的tokens字段是已拆分的单词/ token列表:

  • 如果原始数据是整句字符串,先做拆分处理(中文可使用jieba等分词工具,英文直接按空格拆分即可):
# 示例:将原始整句数据转换为分词后的格式
def process_raw_data(raw_data):
    processed_data = []
    for item in raw_data:
        processed_data.append({
            "tokens": item["sentence"].split(),  # 英文按空格拆分
            "ner_tags": item["label_list"]
        })
    return processed_data

2. 验证输入格式

调用分词函数前,先打印examples["tokens"]的前几个样本,确认格式为嵌套列表:

print(examples["tokens"][0])  # 应输出类似 ["i", "love", "nlp"] 的列表

3. 可选:调整分词参数(不推荐)

如果不想提前分词,可去掉is_split_into_words=True参数,但需要重新编写标签对齐逻辑(因为要手动处理分词后的单词映射),这种方式复杂度更高,优先推荐提前整理数据集格式。

验证修复后的代码

用正确格式的数据集测试你的分词函数:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
label_all_tokens=True

def tokenize_and_align_labels(examples):
    tokenized_inputs = tokenizer(examples["tokens"], truncation=True, 
                                 is_split_into_words=True, padding=True)
    labels = []
    for i, label in enumerate(examples['ner_tags']):
        word_ids = tokenized_inputs.word_ids(batch_index=i)
        previous_word_idx = None
        label_ids = []
        for word_idx in word_ids:
            if word_idx is None:
                label_ids.append(-100)
            elif word_idx != previous_word_idx:
                label_ids.append(label[word_idx])
            else:
                label_ids.append(label[word_idx] if label_all_tokens else -100)
            previous_word_idx = word_idx

        labels.append(label_ids)

    tokenized_inputs["labels"] = labels
    return tokenized_inputs

# 测试用示例数据
test_data = {
    "tokens": [["i", "am", "a", "distilbert", "newbie"], ["i", "need", "help", "with", "token", "classification"]],
    "ner_tags": [[0, 0, 0, 1, 2], [0, 0, 0, 0, 3, 3]]
}

result = tokenize_and_align_labels(test_data)
print(result["labels"])  # 输出对齐后的标签列表,无报错

内容的提问来源于stack exchange,提问作者sameer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:46:00