基于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
相关产品推荐
相关产品推荐

