如何让Hugging Face情感分析pipeline支持正向、中性、负向三类输出
问题根源
你当前使用的是Hugging Face情感分析pipeline默认加载的distilbert-base-uncased-finetuned-sst-2-english模型,该模型在SST-2数据集上训练,本身就只支持正向、负向二分类,训练数据中没有中性类样本,所以无论输入是否有明确情感倾向,都会被强制划分到两类之一,自然无法输出中性结果。
可行解决办法
方案1:更换支持三分类的预训练模型(最推荐)
直接在初始化pipeline时指定支持正向、中性、负向三分类的预训练模型即可,无需修改其他逻辑。目前常用的适配模型包括通用场景下的三分类情感分析预训练模型,代码示例如下:
from transformers import pipeline # 初始化三分类情感分析pipeline sentiment_analyzer = pipeline( task="sentiment-analysis", model="cardiffnlp/twitter-roberta-base-sentiment" ) # 标签映射,将模型输出的默认标签转为你需要的命名格式 label_mapping = { "LABEL_0": "NEGATIVE", "LABEL_1": "NEUTRAL", "LABEL_2": "POSITIVE" } # 测试语句 sentences = [ 'I love you', 'I hate you', 'I go to work', 'This movie was actually neither that funny, nor super witty.' ] for sen in sentences: pred = sentiment_analyzer(sen)[0] res = { "label": label_mapping[pred["label"]], "score": pred["score"] } print(f"语句:{sen}\n预测结果:{res}\n---")
该方案直接复用已训练好的三分类模型,准确率远高于自定义阈值的方案,适配大多数通用场景。
方案2:基于现有二分类模型自定义中性阈值
如果因特殊原因必须使用当前的二分类模型,可以通过设置置信度阈值划分中性类:
- 首先明确二分类模型的正向得分
p,负向得分即为1-p - 自行设置判断阈值,例如当两类得分的差值小于0.6(即
abs(p - (1-p)) < 0.6,等价于p落在0.2~0.8区间)时,将结果归为中性
代码示例如下:
from transformers import pipeline model = pipeline(task = 'sentiment-analysis') sentence = 'I go to work' predicted = model(sentence)[0] # 自定义阈值 threshold = 0.6 if predicted["label"] == "POSITIVE": pos_score = predicted["score"] neg_score = 1 - pos_score else: neg_score = predicted["score"] pos_score = 1 - neg_score if abs(pos_score - neg_score) < threshold: final_label = "NEUTRAL" final_score = max(pos_score, neg_score) else: final_label = predicted["label"] final_score = predicted["score"] print({"label": final_label, "score": final_score})
注意该方案的阈值需要结合你的业务场景下的样本数据调整,效果上限低于直接使用三分类模型。
方案3:微调二分类模型加入中性类
如果你有大量标注好的正向、中性、负向三类数据,可以在现有二分类模型的基础上微调,修改分类头输出三类结果,该方案适配定制化的业务场景,但需要一定的标注成本和训练资源。
内容的提问来源于stack exchange,提问作者Youcef B
相关产品推荐
相关产品推荐

