File size: 2,447 Bytes
903aa53 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | from transformers import pipeline
import torch
def score_article_titles(title_list, model_name="mrm8488/bert-mini-finetuned-age_news-classification"):
"""
为文章标题列表打分,返回对应的分数列表
参数:
title_list: 文章标题列表(list[str])
model_name: Hugging Face 免费模型名称,默认使用轻量的BERT微调模型
返回:
score_list: 分数列表(list[float]),分数范围0-1,越高代表标题质量越好
"""
# 检查输入是否为空
if not title_list:
return []
# 设置设备(优先使用GPU,没有则用CPU)
device = 0 if torch.cuda.is_available() else -1
# 初始化评分管道(使用情感/分类模型,适配标题评分场景)
try:
# 加载评分管道,返回标签和置信度
classifier = pipeline(
"text-classification",
model=model_name,
device=device,
top_k=None # 返回所有类别的置信度
)
except Exception as e:
print(f"加载模型失败:{e}")
print("将使用默认的distilbert-base-uncased-emotion模型")
classifier = pipeline(
"text-classification",
model="distilbert-base-uncased-emotion",
device=device,
top_k=None
)
# 对每个标题打分
score_list = []
for title in title_list:
# 过滤空标题
if not title.strip():
score_list.append(0.0)
continue
# 获取模型输出
pipeline_output = classifier(title)
# 兼容不同版本 transformers 的输出格式
if isinstance(pipeline_output, list):
# 如果是嵌套列表 [[{...}, {...}]],取第一个元素
if len(pipeline_output) > 0 and isinstance(pipeline_output[0], list):
results = pipeline_output[0]
# 否则如果是单层列表 [{...}],直接作为 results
else:
results = pipeline_output
else:
# 单个字典的情况
results = [pipeline_output]
# 计算综合分数
total_score = max([item["score"] for item in results])
# 归一化到0-1区间
normalized_score = round(max(0.0, min(1.0, total_score)), 4)
score_list.append(normalized_score)
return score_list |