当前位置: 首页 > article >正文

DeepSeek BLEU和ROUGE(Recall)的计算

以下是 BLEU Score (Bilingual ​Evaluation ​Understudy)和 ROUGE Score(​Recall-Oriented ​Understudy for ​Gisting ​Evaluation) 的原生Python实现(不依赖第三方库),通过分步计算逻辑和示例详细说明。


一、BLEU Score 实现

核心逻辑
  1. n-gram匹配:计算候选文本和参考文本的n-gram匹配数(截断到参考文本中最大出现次数)。
  2. 精确度计算:各n-gram的匹配数除以候选文本n-gram总数。
  3. 几何平均:对1-gram到4-gram的精确度取几何平均。
  4. 长度惩罚:候选文本过短时施加惩罚。
代码实现
import mathdef get_ngrams(text, n):"""生成n-gram列表"""return [tuple(text[i:i+n]) for i in range(len(text)-n+1)]def bleu_score(candidate, reference, max_n=4):"""计算BLEU分数(单参考文本简化版)"""candidate = candidate.split()reference = reference.split()# 长度惩罚c_len = len(candidate)r_len = len(reference)bp = 1.0 if c_len > r_len else math.exp(1 - r_len / c_len) if c_len !=0 else 0.0# 计算各n-gram的精确度precisions = []for n in range(1, max_n+1):# 生成候选和参考的n-gramcand_ngrams = get_ngrams(candidate, n)ref_ngrams = get_ngrams(reference, n)# 统计匹配数(截断到参考中的最大出现次数)match_count = 0ref_counts = {}for gram in ref_ngrams:ref_counts[gram] = ref_counts.get(gram, 0) + 1for gram in cand_ngrams:if ref_counts.get(gram, 0) > 0:match_count += 1ref_counts[gram] -= 1  # 避免重复匹配# 计算精确度if len(cand_ngrams) == 0:p_n = 0.0else:p_n = match_count / len(cand_ngrams)precisions.append(p_n)# 几何平均(避免零值)geom_mean = math.exp(sum(math.log(p + 1e-10) for p in precisions) / max_n)bleu = bp * geom_meanreturn bleu
示例
reference = "the cat is on the mat"
candidate1 = "the the the the the"  # 低质量候选
candidate2 = "the cat is on the mat"  # 完美匹配print(bleu_score(candidate1, reference))  # 输出接近0.0
print(bleu_score(candidate2, reference))  # 输出1.0(完美匹配)

二、ROUGE Score 实现(以ROUGE-N和ROUGE-L为例)

1. ROUGE-N(基于n-gram的召回率)
def rouge_n(candidate, reference, n=1):"""计算ROUGE-N分数(召回率)"""cand_ngrams = get_ngrams(candidate.split(), n)ref_ngrams = get_ngrams(reference.split(), n)# 统计匹配数ref_gram_counts = {}for gram in ref_ngrams:ref_gram_counts[gram] = ref_gram_counts.get(gram, 0) + 1match_count = 0for gram in cand_ngrams:if ref_gram_counts.get(gram, 0) > 0:match_count += 1ref_gram_counts[gram] -= 1  # 避免重复匹配# 召回率 = 匹配数 / 参考文本中的n-gram总数rouge = match_count / len(ref_ngrams) if len(ref_ngrams) > 0 else 0.0return rouge
2. ROUGE-L(基于最长公共子序列,LCS)
def lcs_length(x, y):"""计算最长公共子序列长度"""m, n = len(x), len(y)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(1, m+1):for j in range(1, n+1):if x[i-1] == y[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])return dp[m][n]def rouge_l(candidate, reference):"""计算ROUGE-L分数(F1值)"""cand_tokens = candidate.split()ref_tokens = reference.split()lcs = lcs_length(cand_tokens, ref_tokens)# 精确率 = LCS长度 / 候选文本长度precision = lcs / len(cand_tokens) if len(cand_tokens) > 0 else 0.0# 召回率 = LCS长度 / 参考文本长度recall = lcs / len(ref_tokens) if len(ref_tokens) > 0 else 0.0# F1值f1 = 2 * precision * recall / (precision + recall + 1e-10)return f1
示例
reference = "the cat is on the mat"
candidate = "the cat sits"  # 部分匹配# ROUGE-1
print(rouge_n(candidate, reference, n=1))  # 输出 2/6 ≈ 0.333# ROUGE-L
print(rouge_l(candidate, reference))      # LCS长度=2("the cat")
# 精确率=2/3≈0.666,召回率=2/6≈0.333 → F1≈0.444

三、对比说明

指标核心公式示例输出(候选文本:the cat sits
BLEU几何平均+长度惩罚接近0.0(因4-gram不匹配)
ROUGE-1匹配1-gram数 / 参考1-gram数2/6 ≈ 0.333
ROUGE-LLCS的F1值0.444(精确率0.666,召回率0.333)

四、关键点总结

  1. BLEU:强调生成文本的精确度和长度匹配。
  2. ROUGE-N:关注参考文本的内容覆盖度(召回率)。
  3. ROUGE-L:通过最长公共子序列衡量语义连贯性。

通过原生Python实现,可以更深入理解这些指标的计算逻辑,适用于定制化需求或教学场景。

相关文章:

DeepSeek BLEU和ROUGE(Recall)的计算

以下是 BLEU Score (Bilingual ​Evaluation ​Understudy)和 ROUGE Score(​Recall-Oriented ​Understudy for ​Gisting ​Evaluation) 的原生Python实现(不依赖第三方库),通过分步计算逻辑和示例详细说明。 一、BLEU Score 实现 核心逻辑…...

vulkanscenegraph显示倾斜模型(5.9)-vsg中vulkan资源的编译

前言 上一章深入剖析了GPU资源内存及其管理,vsg中为了提高设备内存的利用率,同时减少内存(GPU)碎片,采用GPU资源内存池机制(vsg::MemoryBufferPools)管理逻辑缓存(VkBuffer)与物理内存(VkDeviceMemory)。本章将深入vsg中vulkan资源的编译(包含…...

今日行情明日机会——20250409

今日行情还需要考虑关税对抗~ 2025年4月8日涨停的主要行业方向分析 1. 军工(19家涨停) 细分领域:国防装备、航空航天、军民融合。催化因素:国家安全战略升级、国防预算增加、重大军工项目落地预期。 2. 免税(15家涨…...

XHR、FetchAxios详解网络相关大片文件上传下载

以下是 XHR(XMLHttpRequest) 与 Fetch API 的全面对比分析,涵盖语法、功能、兼容性等核心差异: 一、语法与代码风格 XHR(基于事件驱动) 需要手动管理请求状态(如 onreadystatechange 事件)和错误处理,代码冗长且易出现回调地狱。 const xhr = new XMLHttpRequest(); x…...

Python基础总结(四)之元组

文章目录 一、元组格式二、元组操作2.1 转换元组 与 列表一样,元组也是序列,唯一的区别在于元组是不能修改的,与字符串一样。 一、元组格式 元组的创建方式很简单,秩序用逗号将元素隔开就能自动创建一个元组 示例: …...

系统分析师(六)-- 计算机网络

概述 TCP/IP 协议族 DNS DHCP 网络规划与设计 逻辑网络设计 物理网络设计 题目 层次化网络设计 网络冗余设计 综合布线系统 IP地址 网络接入技术 其他网络技术应用 物联网...

【前端】【React】useCallback的作用与使用场景总结

一、useCallback 的作用与使用场景总结 useCallback 是 React 提供的一个 Hook,用于缓存函数的引用,避免因为组件重新渲染而导致函数地址发生变化。它返回一个记忆(memoized)后的回调函数,只有当依赖项发生变化时才会…...

Qwen2.5-VL Technical Report 论文翻译和理解

一、TL;DR Qwen2.5-VL是QwenVL的最新模型,在视觉识别、精准目标定位、稳健文档解析以及长视频理解等方面实现了重大突破引入了动态分辨率处理和绝对时间编码,使其能够处理不同尺寸的图像以及长达数小时的视频,并实现秒级事件定位…...

Foxmail邮件客户端跨站脚本攻击漏洞(CNVD-2025-06036)技术分析

Foxmail邮件客户端跨站脚本攻击漏洞&#xff08;CNVD-2025-06036&#xff09;技术分析 漏洞背景 ‌漏洞编号‌&#xff1a;CNVD-2025-06036 ‌CVE编号‌&#xff1a;待分配 ‌厂商‌&#xff1a;腾讯Foxmail ‌影响版本‌&#xff1a;Foxmail < 7.2.25 ‌漏洞类型‌&#x…...

C语言打印的坑

使用下面的代码buf dprt("data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); 明明是一个字节一个字节的打&#xff0c;打出来的数据有些却是4个字节 0xffffffff 0xffffffff 0xffffffff 0x7f 0xffffffff 0x7f0…...

高并发内存池(三):PageCache(页缓存)的实现

前言&#xff1a; 在前两期内容中&#xff0c;我们深入探讨了内存管理机制中在 ThreadCache 和 CentralCache两个层级进行内存申请的具体实现。这两层缓存作为高效的内存分配策略&#xff0c;能够快速响应线程的内存需求&#xff0c;减少锁竞争&#xff0c;提升程序性能。 本期…...

pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9

在 PyCharm 中&#xff0c;如果你已经安装了 Python 3.9&#xff0c;并且希望在 Run Configurations 中新增一个 Python 3.9 的解释器&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;打开 PyCharm 设置 点击 PyCharm 左上角的 File 菜单。选择 Settings&am…...

Linux驱动开发-网络设备驱动

Linux驱动开发-网络设备驱动 一&#xff0c;网络设备总体结构1.1 总体架构1.2 NAPI数据处理机制 二&#xff0c;RMII和MDIO2.1 RMII接口2.2 MDIO接口 三&#xff0c;MAC和PHY模块3.1 MAC模块3.2 PHY模块 四&#xff0c;网络模型4.1 网络的OSI和TCP/IP分层模型4.1.1 传输层&…...

学习笔记083——Java Stream API

文章目录 1、过滤数据 filter()2、转换元素 map()3、排序 sorted()3.1、自定义排序规则 4、去重 distinct()5、限制元素数量 limit()6、收集结果 collect()6.1、收集为List6.2、收集为Set6.3、转为Map6.4、基本用法&#xff08;注意键冲突会抛异常&#xff09;6.5、处理键冲突&…...

DataEase同比环比

DataEase同比环比 前言术语实现表结构设计DataEase设计创建数据集创建仪表盘最后前言 某大数据项目,需要比较展示今年跟去年的数据,如下图: 说明:比较24,25的产品销量,相同月份做一组,并排放一块 还有更进一步: 说明:比较24,25相同月份,相同产品的销量 直接用DataE…...

RAG 工程基础

RAG 概念 RAG&#xff08;Retrieval - Augmented Generation&#xff09;技术是一种将检索与生成相结合的人工智能技术&#xff0c;旨在利用外部知识源来增强语言模型的生成能力&#xff0c;提高生成内容的质量、准确性和相关性。 具体来说&#xff0c;RAG 技术在处理用户输入的…...

基础算法:滑动窗口_python版本

能使用滑动窗口的题&#xff0c;基本都需要数字为正整数&#xff0c;这样才能保证滑入一个数字总和是增加的(单调性) 一、209. 长度最小的子数组 思路&#xff1a; 已每个位置为右端点&#xff0c;依次加大左端点&#xff0c;最短不满足 sum(num[left,right]) < target的。…...

Qt 之opengl shader language

着色器示例代码 实际运行效果...

PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕

视频讲解&#xff1a; PyRoboPlan 库&#xff0c;给 panda 机械臂微分 IK 上大分&#xff0c;关节限位、碰撞全不怕 代码仓库&#xff1a;https://github.com/LitchiCheng/mujoco-learning 今天分享PyRoboPlan库&#xff0c;比之前的方式优点在于&#xff0c;这个库考虑了机械…...

GPT - TransformerDecoderBlock

本节代码定义了一个 TransformerDecoderBlock 类&#xff0c;它是 Transformer 架构中解码器的一个基本模块。这个模块包含了多头自注意力&#xff08;Multi-Head Attention&#xff09;、前馈网络&#xff08;Feed-Forward Network, FFN&#xff09;和层归一化&#xff08;Lay…...

LabVIEW 控制电机需注意的关键问题

在自动化控制系统中&#xff0c;LabVIEW 作为图形化编程平台&#xff0c;因其高度可视化、易于集成硬件等优势&#xff0c;被广泛应用于电机控制场景。然而&#xff0c;要实现稳定、精确、高效的电机控制&#xff0c;仅有软件并不足够&#xff0c;还需结合硬件选型、控制逻辑设…...

CSS 定位属性的生动比喻:以排队为例理解 relative 与 absolute

目录 一、理解标准流与队伍的类比 二、relative 定位:队伍中 “小范围活动” 的人 三、absolute 定位:队伍中 “彻底离队” 的人 在学习 CSS 的过程中,定位属性relative和absolute常常让初学者感到困惑。它们的行为方式和对页面布局的影响较为抽象,不过,我们可以通过一个…...

Jenkins 发送钉钉消息

这里不介绍 Jenkins 的安装&#xff0c;可以网上找到很多安装教程&#xff0c;重点介绍如何集成钉钉消息。 需要提前准备钉钉机器人的 webhook 地址。&#xff08;网上找下&#xff0c;很多教程&#xff09; 下面开始配置钉钉机器人&#xff0c;登录 Jenkins&#xff0c;下载 …...

nt!KeRemoveQueue 函数分析之加入队列后进入等待状态

第一部分&#xff1a; 参考例子&#xff1a;应用程序调用kernel32!GetQueuedCompletionStatus后会调用nt!KeRemoveQueue函数进入进入等待状态 0: kd> g Breakpoint 8 hit nt!KiDeliverApc: 80a3c776 55 push ebp 0: kd> kc # 00 nt!KiDeliverApc 01 nt…...

OpenCV 风格迁移

一、引言​ 在计算机视觉和图像处理领域&#xff0c;风格迁移是一项令人着迷的技术。它能够将一幅图像&#xff08;风格图像&#xff09;的艺术风格&#xff0c;如梵高画作的笔触风格、莫奈的色彩风格等&#xff0c;迁移到另一幅图像&#xff08;内容图像&#xff09;上&#x…...

35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)

一、线程池概述 1、线程池的优势 线程池是一种线程使用模式&#xff0c;线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能&#xff0c;而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务&#xff0c;这避免了在处理短时间任务时创建与…...

Kubernetes nodeName Manual Scheduling practice (K8S节点名称绑定以及手工调度)

Manual Scheduling 在 Kubernetes 中&#xff0c;手动调度框架允许您将 Pod 分配到特定节点&#xff0c;而无需依赖默认调度器。这对于测试、调试或处理特定工作负载非常有用。您可以通过在 Pod 的规范中设置 nodeName 字段来实现手动调度。以下是一个示例&#xff1a; apiVe…...

QML中访问c++数据,并实现类似C#中mvvm模式详细方法

1. 背景需求2. 实现步骤 2.1. 定义 Model&#xff08;数据模型&#xff09; 2.1.1. DataModel.h2.1.2. DataModel.cpp 2.2. 定义 ViewModel&#xff08;视图模型&#xff09; 2.2.1. PersonViewModel.h2.2.2. PersonViewModel.cpp 2.3. 在 QML 中使用 ViewModel 2.3.1. main.cp…...

React 获得dom节点和组件通信

通过REF 实例对象的.current属性获得绑定的DOM节点 组件通信 组件通信 1 父传子 父组件传递数据 子组件接受数据 通过pros对象接受 子组件的形参列表props只读 props中数据不可修改 特殊情况 在子传父的过程中没有直接给子组件添加属性&#xff0c;而是向父组件中添加其他…...

代码,Java Maven项目打包遇到的环境问题

这几天在写一些Java版本的Langchain4J的 AI 测试case&#xff0c;有一段时间不运行的Java环境&#xff0c;反复出现环境问题&#xff0c;记录下 1、Java编译版本的问题 修改编译版本&#xff1a; 2、在IDE中运行遇到Maven中JDK版本问题 在ide中执行maven命令&#xff0c;遇到下…...