使用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
相关产品推荐
相关产品推荐

