news 2026/7/12 5:56:56

python bert_score使用本地模型的方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python bert_score使用本地模型的方法

1. 背景

bert_score是一个用于评估文本生成质量的Python库,基于预训练的BERT模型计算参考文本与生成文本之间的语义相似度。它通过比较两个文本的BERT嵌入向量来评估它们的匹配程度,比传统的n-gram匹配方法(如BLEU、ROUGE)更能捕捉语义层面的相似性。一般bert_score 是仅仅支持指定模型名称然后再代码实现里面从Hugging Face上面拉取模型。但是如果我们在有限制的网络环境中在线拉取模型就会失败,比较合适的解决办法就是先将模型下载到本地,然后给bert_score指定模型路径。

2. 支持的模型和语言

bert_score中通过model_type和lang两个参数来执行模型和对应的文本语言。

具体文档可以参考:https://github.com/Tiiiger/bert_score

from bert_score import score candidates = ["The cat sits on the mat."] # 生成文本 references = ["A cat is sitting on the rug."] # 参考文本 # 计算BERTScore P, R, F1 = score(candidates, references, model_type='roberta-large',lang="en") print(f"Precision: {P.mean():.3f}, Recall: {R.mean():.3f}, F1: {F1.mean():.3f}")

3.支持本地模型的方法

3.1 修改源码

1. 在score方法里面可以看到get_model和get_tokenizer两个方法

2.点进去可以看到对应函数的源码

def get_model(model_type, num_layers, all_layers=None): if model_type.startswith("scibert"): model = AutoModel.from_pretrained(cache_scibert(model_type)) elif "t5" in model_type: from transformers import T5EncoderModel model = T5EncoderModel.from_pretrained(model_type) else: model = AutoModel.from_pretrained(model_type) model.eval() if hasattr(model, "decoder") and hasattr(model, "encoder"): model = model.encoder # drop unused layers # ...... return model def get_tokenizer(model_type, use_fast=False): if model_type.startswith("scibert"): model_type = cache_scibert(model_type) if version.parse(trans_version) >= version.parse("4.0.0"): tokenizer = AutoTokenizer.from_pretrained(model_type, use_fast=use_fast) else: assert not use_fast, "Fast tokenizer is not available for version < 4.0.0" tokenizer = AutoTokenizer.from_pretrained(model_type) return tokenizer

3. 修改源码直接将我们的model_path硬编码进去,当然为了更好的适配性,可以将model_path做成一个可选参数,然后传递出去给score函数

def get_model(model_type, num_layers, all_layers=None): model_path = 'xxx' if model_type.startswith("scibert"): model = AutoModel.from_pretrained(cache_scibert(model_type)) elif "t5" in model_type: from transformers import T5EncoderModel model = T5EncoderModel.from_pretrained(model_path) else: model = AutoModel.from_pretrained(model_path) model.eval() def get_tokenizer(model_type, use_fast=False): if model_type.startswith("scibert"): model_type = cache_scibert(model_type) model_path = 'xxx' if version.parse(trans_version) >= version.parse("4.0.0"): tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=use_fast) else: assert not use_fast, "Fast tokenizer is not available for version < 4.0.0" tokenizer = AutoTokenizer.from_pretrained(model_path) return tokenizer

3.2 添加对应的num_layers参数

这里还有一种方法就是通过给model_type传递给本地模型所在的路径。同时传递num_layers参数来指定。

原因是因为其实Transformers里面的xxx.from_pretrained方法其实也是可以支持你配置本地路径来加载的,这里加载模型也不会有问题。但是在bert_score中他是需要提前知道层数来优化计算过程的。这里才是报错的原因。

这一部分代码是在utils文件中。

def calculate_bert_score(original_text: str, polished_text: str, lang: str = "zh",model_type:str=None) -> float: try: # 使用bert_score计算F1分数 score_params = { "verbose": False, "device": "cuda" if torch.cuda.is_available() else "cpu" } if model_type is None: score_params["model_type"] = BERT_MODEL_PATH #指定模型路径 score_params["num_layers"] = BERT_BASE_CHINESE_NUM_LAYERS#执行模型层数(12) else: score_params["model_type"] = model_type P, R, F1 = score([polished_text], [original_text], **score_params) # 返回F1分数(转换为Python float) f1_score = F1.item() if hasattr(F1, 'item') else float(F1) return f1_score except Exception as e: print(f"计算bert_score时出错: {str(e)}") # 如果计算失败,返回一个默认值或者抛出异常 raise
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 19:06:05

pythonstudy Day37

MLP神经网络的训练 PyTorch的安装 我们后续完成深度学习项目中&#xff0c;主要使用的包为pytorch&#xff0c;所以需要安装&#xff0c;你需要去配置一个新的环境。 未来在复现具体项目时候&#xff0c;新环境命名最好是python版本_pytorch版本_cuda版本&#xff0c;例如 p…

作者头像 李华
网站建设 2026/7/10 9:05:50

Linly-Talker结合RAG技术实现知识增强型虚拟客服系统

Linly-Talker结合RAG技术实现知识增强型虚拟客服系统 在银行的智能柜台前&#xff0c;一位老人轻声问&#xff1a;“我这个月养老金涨了多少&#xff1f;”屏幕中的虚拟柜员微微一笑&#xff0c;眼神温和地回应&#xff1a;“根据您所在城市的最新政策&#xff0c;2024年起基础…

作者头像 李华
网站建设 2026/7/12 4:23:30

用Deepseek-v3.1在Trae中编写AI中继程序

用 Deepseek-v3.1 在 Trae 中构建 AI 中继服务&#xff1a;打通国产大模型与 OpenAI 生态的桥梁 在本地开发中&#xff0c;我们常遇到这样一个问题&#xff1a;许多优秀的国产大模型&#xff08;如百度飞桨星河社区部署的 ERNIE 系列&#xff09;虽然性能强劲、中文理解出色&a…

作者头像 李华
网站建设 2026/7/11 18:06:58

LobeChat能否实现思维导图输出?结构化内容展示尝试

LobeChat能否实现思维导图输出&#xff1f;结构化内容展示尝试 在AI助手逐渐从“问答工具”演变为“认知协作者”的今天&#xff0c;用户不再满足于一串流水线式的文本回复。他们希望看到逻辑清晰的框架、层次分明的知识体系&#xff0c;甚至是可交互的图表——尤其是在处理复杂…

作者头像 李华
网站建设 2026/7/11 18:06:57

开源5G基站硬件参数

威武纪 高集成RFMC7000模块 SDR软件无线电 AD9371 FMC子卡和拓展卡pcie 300MHz~6GHz频段 SDR 开发评估发射接收卡 双通道收发链路 智邮开源 5G通信验证 射频板卡 OXG-SDR4100 软件无线电 SDR开发板 搭载两颗AD9371 开源5G基站OAI pcie 4路发射 4路接收 300MHz&#xff5e;6GHz …

作者头像 李华
网站建设 2026/7/11 18:06:56

C#开发桌面应用调用GPT-SoVITS REST API实战

C# 桌面应用集成 GPT-SoVITS 实现个性化语音合成实战 在当前 AI 技术快速落地的背景下&#xff0c;语音合成已不再是科研实验室里的“黑箱”技术。越来越多开发者希望将高质量的 TTS 能力嵌入到本地工具中——尤其是那些需要离线运行、保护隐私或具备图形化操作界面的应用场景。…

作者头像 李华