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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:42:02