Huggingface情感分析微调时DatasetDict分词触发ValueError如何解决
报错原因及修复方案
核心问题1:分词函数未指定要处理的文本列
你当前的tokenize函数直接将batch传给分词器,但batched=True模式下的batch是字典结构,键对应你DataFrame的列名(评论文本列、情感得分列等),分词器无法直接识别字典输入,必须明确指定你要处理的评论文本列。
核心问题2:未初始化对应预训练模型的分词器
你的代码中直接使用了tokenizer对象,但并未提前加载nlptown/bert-base-multilingual-uncased-sentiment对应的分词器,属于变量未定义问题。
潜在问题:文本列存在非字符串值
如果你的评论文本列包含空值(NaN)、数字类型内容,也会触发该类型报错,需要先清洗数据。
修复后的完整代码
第一步:补充分词器加载逻辑
from transformers import AutoModelForSequenceClassification, AutoTokenizer from transformers import Trainer, TrainingArguments from sklearn.metrics import accuracy_score, f1_score import datasets import pandas as pd num_labels = 5 model_name = "nlptown/bert-base-multilingual-uncased-sentiment" batch_size = 16 # 新增:加载对应模型的分词器 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)
第二步:修改分词函数,指定文本列
假设你的DataFrame中评论文本列名为review,情感得分列名为score,按如下方式修改:
def tokenize(batch): # 明确传入文本列的内容,不要直接传整个batch字典 return tokenizer(batch['review'], padding=True, truncation=True)
注意:请把代码中的
review替换为你实际的评论文本列名
第三步(可选):提前清洗文本列,排除非字符串值
在切分训练集测试集之前执行:
# 替换空值为空字符串,强制转换所有内容为字符串类型 training_data['review'] = training_data['review'].fillna('').astype(str) testing_data['review'] = testing_data['review'].fillna('').astype(str)
第四步:重新执行编码逻辑
data_encoded = data_dict.map(tokenize, batched=True, batch_size=None)
内容的提问来源于stack exchange,提问作者soulwreckedyouth
相关产品推荐
相关产品推荐

