文本生成评估指标简单介绍BLEU+ROUGE+Perplexity+Meteor 代码实现

本文主要是介绍文本生成评估指标简单介绍BLEU+ROUGE+Perplexity+Meteor 代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下指标主要针对两种:机器翻译和文本生成(文章生成),这里的文本生成并非是总结摘要那类文本生成,仅仅是针对生成句子/词的评价。
首先介绍BLEU,ROUGE, 以及BLEU的改进版本METEOR;后半部分介绍PPL(简单介绍,主要是关于交叉熵的幂,至于这里的为什么要求平均,是因为我们想要计算在一个n-gram的n中,平均每个单词出现需要尝试的次数。

机器翻译(Machine Translation, MT)

BLEU:Bilingual Evaluation Understudy

形式:
目的:计算网络生成文本Candidate和参考翻译文本(Reference, 可以有多个参考)之间的文本交叉计算。

计算:针对单个Reference:
举例子:

Candidate: ha ha ha
Reference: only saying ha is not good
针对unigram计算BLUE:
BLUE-1 = Candidate在Reference出现的次数 len(Candidate) = count(ha) count(ha,ha, ha) = 1 3 \text{BLUE-1} = \frac{\text{Candidate在Reference出现的次数}}{\text{len(Candidate)}}=\frac{\text{count(ha)}}{\text{count(ha,ha, ha)}} = \frac{1}{3} BLUE-1=len(Candidate)CandidateReference出现的次数=count(ha,ha, ha)count(ha)=31

缺点(存在问题): 如果长度很短的话,分母会很小,BLEU取值会很大,为了消除长度带来的影响:
B P = { e 1 − l r e f l c d d , l c d d < l r e f 1 , l c d d ≥ l r e f BP=\left\{ \begin{aligned} e^{1 - \frac{l_{ref}}{l_{cdd}}}, &\quad l_{cdd} < l_{ref} \\ 1, &\quad l_{cdd} \ge l_{ref} \end{aligned} \right. BP= e1lcddlref,1,lcdd<lreflcddlref

这里的BP跟n-gram的n无关

则修正之后的BLUE计算方式为:
计算步骤

  1. 确定n, n是ngram的n
  2. 统计n-gram在reference,Candidate出现次数,reference出现次数作为次数统计上限
  3. 对Candidate中每个n-gram计算匹配次数:
    M = ∑ n − g r a m min ⁡ ( O n g r a m c d d , O n g r a m r e f ) M = \sum_{n-gram} \min(O_{ngram}^{cdd}, O_{ngram}^{ref}) M=ngrammin(Ongramcdd,Ongramref)
  4. 计算BLEU-N
    B L E U N = M l c d d − 1 + n BLEU_{N} = \frac{M}{l_{cdd} - 1 + n} BLEUN=lcdd1+nM
  5. 利用几何平均计算综合得分
    B L E U = B P ⋅ ( ∏ n = 1 k B L E U n ) 1 k BLEU = BP \cdot ({\prod \limits_{n = 1}^{k}}BLEU_{n})^{\frac{1}{k}} BLEU=BP(n=1kBLEUn)k1
    这里的k一般取值为4,代表的是看了1-gram, 2-gram, 3-gram, 4-gram综合判断
    参考:https://mp.weixin.qq.com/s/wdIWq6XUcB6HJchpHie–g

使用场景:短文本生成的机器翻译评估(有reference的样本)
缺点:只适用于短文本,不适合长文本生成(生成故事)

实现

from torchtext.data.metrics import bleu_score
candidate_corpus = [['My', 'full', 'pytorch', 'test'], ['Another', 'Sentence']]
references_corpus = [[['My', 'full', 'pytorch', 'test'], ['Completely', 'Different']], [['No', 'Match']]]
bleu_score(candidate_corpus, references_corpus)

ROUGE: Recall-Oriented Understuy for Gisting Evaluation

简介:主要用于评估机器翻译文本摘要(或其他自然语言处理任务)的质量,即:衡量目标文本与生成文本之间的匹配程度,此外还考虑生成文本的召回率,BLEU则相对更看重生成文本的准确率,着重于涵盖参考摘要的内容和信息的完整性。
分别有四种方法:ROUGE-N, ROUGE-L, ROUGE-W, ROUGE-S

主要有两种形式

  • ROUGE-N(N = 1, 2, 3, …)
  • ROUGE-L

ROUGE-N计算方式为:
ROUGE-N = Candidate ∩ Reference l e n ( Reference ) \text{ROUGE-N} = \frac{\text{Candidate} \cap \text{Reference}}{len(\text{Reference})} ROUGE-N=len(Reference)CandidateReference
这里的分子交集不像最长公共子串一样,这里的交集不考虑顺序。
ROUGE-L
考虑最长公共子串(是区分顺序的,参考leetcode中最长公共子串计算,不过在这里最小单元从leetcode的字符变成了单词。1143. 最长公共子序列

单句ROUGE-L
ROUGE-L = 最长公共子串 ( Candidate , Reference ) l e n ( Reference ) \text{ROUGE-L} = \frac{\text{最长公共子串}(\text{Candidate}, \text{Reference})}{len(\text{Reference})} ROUGE-L=len(Reference)最长公共子串(Candidate,Reference)

举例子
Candidate: police killed the gunman
Reference1: police kill the gunman
Reference2: the gunman kill police

对reference1而言,ROUGE-2为1/3; 对于reference2而言,ROUGE为1/3
对于reference1而言,ROUGE-L为3/4l; 对于reference2而言,ROUGE-L为1/2
还有ROUGE-W, ROUGE-S, 可以参考: 自动文摘评测方法:Rouge-1、Rouge-2、Rouge-L、Rouge-S
缺点

  • ROUGE只关注文本的表面信息,而忽略了文本的语义信息,因此在评估文本质量时可能会出现误差.
  • ROUGE评价指标对于文本的长度比较敏感,因此在评估长文本时可能会出现偏差.
    参考:一文带你理解|NLP评价指标 BLEU 和 ROUGE(无公式) - 知乎

实现

from torchmetrics.text.rouge import ROUGEScore
preds = "My name is John"
target = "Is your name John"
rouge = ROUGEScore()
from pprint import pprint
pprint(rouge(preds, target))

在这里插入图片描述
来源:https://torchmetrics.readthedocs.io/en/stable/text/rouge_score.html
跑代码会遇到问题:https://blog.csdn.net/qq_24263553/article/details/105726751

METEOR: The Metric for Evaluation of Translation with Explicit ORdering

目的:解决BLEU的不足,与 BLEU 相比,METEOR 考虑了更多的因素,如同义词匹配、词干匹配、词序等,因此它通常被认为是一个更全面的评价指标。
实现(计算):基于unigram精度和召回率的调和平均
应用:机器翻译(Machine Translation, MT), Image Caption, Question Generation, Summarization

参考:【NLG】(三)文本生成评价指标—— METEOR原理及代码

from nltk.translate.meteor_score import meteor_scorereference3 = '我 说 这 是 怎 么 回 事,原 来 明 天 要 放 假 了'
reference2 = '我 说 这 是 怎 么 回 事'
hypothesis2 = '我 说 这 是 啥 呢 我 说 这 是 啥 呢'
# reference3:参考译文
# hypothesis2:生成的文本
res = round(meteor_score([reference3, reference2], hypothesis2), 4)
print(res)输出:
0.4725

文本生成(Text Generation)

Perplexity 困惑度

这里作了详细的解释:求通俗解释NLP里的perplexity是什么?
计算: 2 H ( p , p ^ ) 2^{H(p, \hat{p})} 2H(p,p^)
其中 H ( p , p ^ ) H(p, \hat{p}) H(p,p^)计算为:
H ( p , p ^ ) = − 1 n ∑ x p ( x ) log ⁡ 2 p ^ ( x ) H(p, \hat{p}) = -\frac{1}{n} \sum_{x} p(x) \log_2 \hat{p}(x) H(p,p^)=n1xp(x)log2p^(x)
通俗解释:

困惑度p可以理解为,如果每个时间步都根据语言模型计算的概率分布随机挑词,那么平均情况下,挑多少个词才能挑到正确的那个

from torchmetrics.text import Perplexity
import torch
gen = torch.manual_seed(42)
preds = torch.rand(2, 8, 5, generator=gen)
target = torch.randint(5, (2, 8), generator=gen)
target[0, 6:] = -100
perp = Perplexity(ignore_index=-100)
perp(preds, target)

参考:

【NLG】(二)文本生成评价指标—— METEOR原理及代码示例
一文搞懂Language Modeling三大评估标准
Perplexity of fixed-length models

这篇关于文本生成评估指标简单介绍BLEU+ROUGE+Perplexity+Meteor 代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803015

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too