如何基于BERT德语情感分析模型获取每条推文的情感得分
获取oliverguhr/german-sentiment-bert三类情感得分的实现方法
你当前调用的SentimentModel是第三方封装的高层接口,默认predict_sentiment方法仅返回概率最高的情感标签,没有显式暴露三类得分,两种可直接运行的实现方案如下:
方案1:无需修改模型加载逻辑,直接开启接口自带的概率返回参数
封装接口本身已经内置了概率计算逻辑,只是默认关闭了输出,修改调用参数即可拿到和模型卡片一致的三类得分,代码如下:from germansentiment import SentimentModel model = SentimentModel() texts = [ "Mit keinem guten Ergebniss","Das ist gar nicht mal so gut", "Total awesome!","nicht so schlecht wie erwartet", "Der Test verlief positiv.","Sie fährt ein grünes Auto."] # 开启概率输出开关 result = model.predict_sentiment(texts, output_probabilities=True) print(result)返回结果中,每条文本对应一个二元元组:第一个值是模型判定的最终情感标签,第二个值是
(类别名, 得分)格式的列表,依次包含negative、neutral、positive三类的概率值,单条样本三类得分总和为1,和Hugging Face模型卡片展示的输出完全对齐。方案2:基于Hugging Face原生接口直接加载模型,完全可控输出逻辑
如果担心第三方封装库的版本变动导致结果不一致,可以直接用transformers库原生加载模型,手动计算softmax概率,代码如下:from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch import torch.nn.functional as F model_path = "oliverguhr/german-sentiment-bert" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForSequenceClassification.from_pretrained(model_path) id2label = model.config.id2label # 固定映射:0=negative, 1=neutral, 2=positive texts = [ "Mit keinem guten Ergebniss","Das ist gar nicht mal so gut", "Total awesome!","nicht so schlecht wie erwartet", "Der Test verlief positiv.","Sie fährt ein grünes Auto."] # 文本编码 inputs = tokenizer(texts, padding=True, truncation=True, max_length=512, return_tensors="pt") # 推理计算logits with torch.no_grad(): logits = model(**inputs).logits # softmax转换为概率得分 probs = F.softmax(logits, dim=1) # 格式化输出 for text, prob in zip(texts, probs): res = {id2label[i]: round(p.item(), 4) for i, p in enumerate(prob)} print(f"文本: {text}\n情感得分: {res}\n")
注意:该模型的类别顺序固定为负向、中性、正向,不要随意调整映射顺序,否则会出现标签和得分不匹配的问题。
之前调试没找到对应调用逻辑的原因很简单:高层封装的默认分支只返回logits取argmax后的标签结果,概率计算的逻辑只有在传入output_probabilities=True参数时才会触发返回,顺着默认执行路径追踪自然看不到得分输出的相关代码。
内容的提问来源于stack exchange,提问作者Valeriomerio
相关产品推荐
相关产品推荐

