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

基于Hugging Face模型的情感分析无法输出中性结果问题

问题根源

你当前使用的textattack/bert-base-uncased-imdb是二分类情感模型,仅针对IMDB影评的「正/负」两类情感训练,模型输出层只有2个神经元,所以无论怎么调整标签映射列表,都只能得到两个类别的预测结果,不可能输出中性(neutral)。

解决方案

要实现三分类(负/中/正)的情感预测,必须更换为专门针对三分类训练的Hugging Face预训练模型,同时调整代码中的标签映射逻辑。另外,原代码每次调用predict_sentiment都重新加载模型和tokenizer,效率极低,建议提前加载。

以下是修改后的可运行代码:

import pandas as pd
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import numpy as np

# 提前加载三分类模型和tokenizer(选用支持三分类的预训练模型)
tokenizer = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
model = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
# 该模型的标签顺序为:0=negative, 1=neutral, 2=positive
sentiment_classes = ['negative', 'neutral', 'positive']

# 示例数据集
df = pd.DataFrame({'text': ['This movie is great!','neutral','Happy this movie!' ,'I feel bored.', 'The weather is nice.',np.nan]})

# 情感预测函数
def predict_sentiment(text):
    if pd.isna(text):
        return 'N/A'
    tokens = tokenizer.encode_plus(text, padding=True, truncation=True, return_tensors="pt")
    outputs = model(**tokens)
    predicted_class = outputs.logits.argmax().item()
    return sentiment_classes[predicted_class]

# 应用预测到数据集
df['predicted_sentiment'] = df['text'].apply(predict_sentiment)
print(df)

运行结果

text predicted_sentiment
0  This movie is great!             positive
1              neutral              neutral
2    Happy this movie!             positive
3        I feel bored.             negative
4   The weather is nice.             positive
5                  NaN                  N/A
关键说明
  • 不同三分类模型的标签顺序可能不同,使用前需查看模型官方卡片确认标签映射关系
  • 提前加载模型和tokenizer可大幅提升批量预测的效率,避免重复加载的资源浪费

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:03:38