自然语言处理评估指标

中文描述评价指标(blue,rouge,meteor,cider)_wzxkkdm的博客-CSDN博客

中文文本摘要指标-ROUGE - 知乎

中文文本摘要指标-ROUGE - 知乎

NLP评估指标之ROUGE - 知乎
困惑度PPL (perplexity)_ppl困惑度_hxxjxw的博客-CSDN博客

NLP常见任务及评估指标_nlp评价指标_牵制有心碎的博客-CSDN博客
evaluate-metric (Evaluate Metric)

1、perplexity

perplexity = e**(sum(losses) / num_tokenized_tokens),遵循深度学习框架中的最新约定。

文章目录
四大类常见的任务:
评估指标
1、PPL
2、BLEU
3、ROUGE
4、METEOR
5、CIDEr
6、Edit Distance
四大类常见的任务:


以下很多内容均为参考,链接放于文末~

评估指标
一、分类任务常见评估:

准确度(Accuracy) 评估预测正确的比例,精确率(Precision) 评估预测正例的查准率,召回率(Recall) 评估真实正例的查全率。如果是多分类,则每个类别各自求P、R最终求平均值。❤️🧡💛

TP(True Positives):真正例,预测为正例而且实际上也是正例;

FP(False Positives):假正例,预测为正例然而实际上却是负例;

FN(false Negatives):假负例,预测为负例然而实际上却是正例;

TN(True Negatives):真负例,预测为负例而且实际上也是负例。

1、精确率(Precision):以预测结果为判断依据,预测为正例的样本中预测正确的比例。

用此标准来评估预测正例的准确度。

2、召回率(Recall):以实际样本为判断依据,实际为正例的样本中,被预测正确的正例占总实际正例样本的比例。也叫“查全率”。

3、准确率(Accuracy):最直观的就是准确率: 模型判断正确的数据(TP+TN)占总数据的比例

                                                 (TP+TN)/(TP+TN+FP+FN)
1
什么情况下精确率很高但是召回率很低?

一个极端的例子,比如我们黑球实际上有3个,分别是1号、2号、3号球,如果我们只预测1号球是黑色,此时预测为正例的样本都是正确的,精确率p=1,但是召回率r=1/3。

什么情况下召回率很高但是精确率很低?

如果我们10个球都预测为黑球,此时所有实际为黑球都被预测正确了,召回率r=1,精确率p=3/10。

4、F1值:中和了精确率和召回率的指标

当P和R同时为1时,F1=1。当有一个很大,另一个很小的时候,比如P=1,R~0 , 此时F1~0。分子2PR的2完全了为了使最终取值在0-1之间,进行区间放大,无实际意义。

分类任务、命名实体识别、信息提取代码 Accuracy, Precision, Recall, F1

===============torch=================
from torchmetrics import Accuracy, Precision, Recall, F1
# 预测结果和真实标签
preds = torch.tensor([0, 1, 2, 3])
target = torch.tensor([0, 1, 2, 2])
# Accuracy
acc = Accuracy()(preds, target)
# Precision
precision = Precision()(preds, target, average='macro')
# Recall
recall = Recall()(preds, target, average='macro')
# F1
f1 = F1()(preds, target, average='macro')
===============sklearn=================
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
f1_score(target, preds)
===============tensorflow==============
import tensorflow as tf
train_graph = tf.Graph()
with train_graph.as_default():
    labels = tf.constant([1, 1, 1, 0, 0, 0, 0, 0, 0, 0])
    predicts = tf.constant([1, 1, 0, 1, 1, 0, 0, 0, 0, 0])
 
    # 返回的是一个二元组tuple
    accuracy = tf.metrics.accuracy(labels, predicts)
    precision = tf.metrics.precision(labels, predicts)
    recall = tf.metrics.recall(labels, predicts)
    f1 = tf.metrics.mean((2 * precision[1] * recall[1]) / (precision[1] + recall[1]), name='f1_score')
 
with tf.Session(graph=train_graph) as sess:
    sess.run(tf.local_variables_initializer())
    result = sess.run([accuracy, precision, recall, f1])
    print(result)
序列标注任务代码 Precision, Recall, F1

import torch
from torchmetrics import Precision, Recall, F1

# 预测结果和真实标签
preds = torch.tensor([0, 1, 2, 3, 4])
target = torch.tensor([0, 1, 0, 3, 4])

# Precision
precision = Precision(num_classes=5, average='macro', multilabel=False)(preds, target)

# Recall
recall = Recall(num_classes=5, average='macro', multilabel=False)(preds, target)

# F1
f1 = F1(num_classes=5, average='macro', multilabel=False)(preds, target)
print(f"F1: {f1:.4f}")
16
================================

语言模型就是用来计算一个句子的概率的模型,也就是判断一句话是否是人话的概率。

1、PPL
困惑度(Perplexity,PPL) 基本思想是:给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好 ,公式如下:❤️🧡💛

困惑度越小,句子概率越大,语言模型越好。


这里补充开N次根号(N为句子长度,如果是中文,那就是分词后词的个数)意味着几何平均数:

💡 1、需要平均 的原因是,因为每个字符的概率必然小于1,所以越长的句子的概率在连乘的情况下必然越小,所以为了对长短句公平,需要平均一下,使得不同长度的句子困惑度可以在一个量级下比较。2、如果有其中的一个概率是很小的,就会影响最终结果小,所以要用几何平均。机器翻译常用指标BLEU 也使用了几何平均,还有机器学习常用的F-score 使用的调和平均数 ,也有类似的效果。

N-gram(uni-gram, bi-gram, tri-gram) 不同词袋模型

uni-gram:单个词语概率独立

重点:如uni-gram就是单个词语的出现频率(词频/语料库中所有的词语数量),而例如tri-gram则是:

💡 困惑度是交叉熵的指数形式。log perplexity和交叉熵cross entropy是等价的

语言模型(也可以用于文本生成任务如机器翻译、摘要生成)代码 Perplexity

import torch
from torchmetrics import Perplexity

# 预测结果和真实标签
preds = torch.randn(2, 10, 100)  # (batch_size, seq_len, vocab_size)
target = torch.randint(0, 100, size=(2, 10))  # (batch_size, seq_len)

# Perplexity
perplexity = Perplexity()(preds, target)
print(f"Perplexity: {perplexity:.4f}")
1
2
3
4
5
6
7
8
9
10
def perplexity(y_true, y_pred):
      """
       y_true: numpy数组,真实标签序列,形状为 (N,)
       y_pred: numpy数组,预测标签序列,形状为 (N, V),V为词汇表大小
       """
       N = y_true.shape[0] # 序列长度
       log_prob = np.log(y_pred[np.arange(N), y_true]) # 获取对应标签的预测概率的对数
       perp = np.exp(-np.sum(log_prob) / N) # 计算困惑度
       return perp
===============================

机器翻译任务指标1

2、BLEU
双语评估替补(Bilingual Evaluation Understudy)。衡量机器翻译的好坏,取值范围是[0, 1],越接近1,表明翻译质量越好,主要是基于精确率。❤️🧡💛

💡 BLEU 的 1-gram 精确率表示译文忠于原文的程度,而其他 n-gram 表示翻译的流畅程度。

target:参考的翻译 ; pred: 译文

lc:生成译文; lr:参考译文
1、Pn及n-gram精确率计算: 🐍🐍🐍

假设机器翻译的pred译文C和一个targets参考翻译S1如下:

C: a cat is on the table或there there there there there

S1: there is a cat on the table (参考翻译有m个)

针对上面的例子:n去1代表1-gram词袋精确率统计;
p1=min(5,1)/5
所以 p1 = 1/5 (因为there在C和S1中都出现了 我们按最少的次数来)

2、BP惩罚因子:对翻译结果的长度进行惩罚。这样做的目的是为了防止翻译结果过长而得分过高,因为较长的翻译结果往往可以包含更多的词汇,从而有更高的概率在参考翻译结果中找到匹配的词汇。
bp = exp(1 - (ref_len / cand_len))
其中:ref_len 表示参考翻译结果的长度(一般是词汇数量),cand_len 表示生成的翻译结果的长度(同样是词汇数量),exp 表示指数函数。
当生成翻译长度小于参考翻译长度,惩罚因子会降低BLEU得分,使得较长的翻译结果在评估中得到较低的权重。当机器翻译的长度比较短时,BLEU 得分也会比较高(这里为1),但是这个翻译是会损失很多信息的。所以在实际应用中,可以根据具体的需求和任务情况,调整长度惩罚因子的数值,以满足评估的要求。

文本生成任务(机器翻译、语言生成、对话系统)代码 BLEU

import torch
from nltk.translate.bleu_score import sentence_bleu
# 生成参考文本和翻译文本
ref = [['the', 'cat', 'is', 'on', 'the', 'mat']]
hypo = ['the', 'cat', 'is', 'on', 'mat']
# 将参考文本和翻译文本转化为NLTK需要的格式
refs = [[ref]]
hyps = [hypo]

# 计算BLEU指标
score = sentence_bleu(refs, hyps)
================================

机器翻译、文章摘要评价任务指标2

3、ROUGE
Recall-Oriented Understudy for Gisting Evaluation主要是基于召回率(recall) 的。可用来衡量生成结果和标准结果的匹配程度❤️🧡💛

ROUGE-N: 在 N-gram 上计算召回率
ROUGE-L: 考虑了机器译文和参考译文之间的最长公共子序列
ROUGE-W: 改进了ROUGE-L,用加权的方法计算最长公共子序列
ROUGE-S: 其实是Rouge-N的一种扩展,N-gram是连续的,Skip-bigram是允许跳过中间的某些词,同时结合了Rouge-L的计算方式。
1、ROUGE-N 主要统计 N-gram 上的召回率,对于 N-gram,可以计算得到 ROUGE-N 分数:🍉🍉

💡 公式的分母是统计在参考译文targets中 N-gram 的个数,
而分子是统计参考译文与机器译文pred共有的 N-gram 个数。

值为(0~1)

如果给定多个参考译文 Si, ROUGE-N 会分别计算机器译文和这些参考译文的ROUGE-N 分数,并取其最大值

2、ROUGE-L 中的 L 指最长公共子序列 (longest common subsequence, LCS),ROUGE-L 计算的时候使用了机器译文C和参考译文S的最长公共子序列:🍉🍉🍉

如果len(C )=6,S=7;则LCS=6

3、作者提出了一种加权最长公共子序列方法 (WLCS),给连续翻译正确的更高的分数。🍉🍉🍉

虽然Y1,Y2与 X 的最长公共子序列一样,但明显Y1更多连续匹配,应该权重加大。

4、ROUGE-S 也是对 N-gram 进行统计,但是其采用的 N-gram 允许"跳词 (Skip)",即单词不需要连续出现。例如句子 “I have a cat” 的 Skip 2-gram 包括 (I, have),(I, a),(I, cat),(have, a),(have, cat),(a, cat)。🍉🍉🍉


机器翻译、文章摘要评价、问答生成 代码 rouge、meteor

==================rouge====================
from nltk.translate.bleu_score import sentence_bleu
from nltk.translate.rouge_score import rouge_n, rouge_scorer

def gouge(evaluated_sentences, reference_sentences):
    """
    :param evaluated_sentences: 生成的摘要句子列表
    :param reference_sentences: 参考摘要句子列表
    :return: GOUGE指标
    """
    scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rouge    3', 'rouge4'])
    scores = scorer.score(' '.join(evaluated_sentences), 
                          ' '.join(reference_sentences))
    rouge_n_scores = [scores[f'rouge{i}'].precision for i in range(1, 5)]
    return np.exp(np.mean(np.log(rouge_n_scores)))
=================meteor=====================
import nltk
from nltk.translate.meteor_score import meteor_score
#METEOR指标的计算需要使用外部知识源,因此需要下载相应的资源
nltk.download('wordnet')
nltk.download('wordnet_ic')
# 生成机器翻译的文本和参考翻译文本
generated_text = "I love going to the park on sunny days."
reference_text = "I enjoy visiting park when the weather is nice."

# 计算METEOR指标
score = meteor_score([reference_text], generated_text)
print("METEOR score:", score)
==============================

机器翻译任务指标3

4、METEOR
meteor(Metric for Evaluation of Translation with Explicit ORdering)综合考虑了精确度和召回率,并使用外部知识源来解决同义词和形态变化问题。❤️🧡💛
METEOR引入了显式排序的方式来考虑生成翻译与参考翻译之间的语序一致性,从而可以一定程度上解决语序不一致的问题。

1、 计算unigram下的精确率P和召回率R(计算方法与BLEU、ROUGE类似),得到调和均值F值。


2、 使用chunk概念计算惩罚因子:候选译文和参考译文能够对齐的、空间排列上连续的单词形成一个 chunk。chunk 的数目越少意味着每个 chunk 的平均长度越长,也就是说候选译文和参考译文的语序越一致。


chunks越小,Penalty越小,评估越好

如果参考译文是“我爱你”,而模型给出译文是“你爱我”,虽然每个uni-gram都能对应上,但这种应该受到很重的惩罚,告诉模型翻译不当
3、 METEOR值计算为对应最佳候选译文和参考译文之间的精确率和召回率的调和平均。

不足:对近义词和词汇选择的灵活性较低:METEOR主要基于精确匹配、部分匹配和词义相似性来评估单词和短语的匹配程度,而对于生成翻译与参考翻译之间的近义词和词汇选择的灵活性较低。这可能导致在某些情况下,即使生成翻译在语义上与参考翻译相近,但由于词汇选择不同,METEOR得分较低。
==============================

图像字幕生成评价指标

5、CIDEr
Consensus-based Image Description Evaluation)是 BLEU 和向量空间模型的结合。 ❤️🧡💛
它把每个句子看成文档,然后计算 TF-IDF 向量(只不过 term 是 n-gram 而不是单词)的余弦夹角,据此得到候选句子和参考句子的相似度,同样是不同长度的 n-gram 相似度取平均得到最终结果。CIDEr指标的得分范围通常在0到几十之间,越高表示生成模型生成的图像描述与人工参考描述越一致,质量越好。

CIDEr指标在计算一致性时,会对候选描述和参考描述中的词汇进行词频权重计算,并将候选描述和参考描述的词频权重与一致性权重相乘得到一致性贡献。在计算一致性权重时,CIDEr指标可以通过引入惩罚因子来对非关键词进行降权,从而减少它们对一致性计算的贡献。(常用惩罚因子参考下面的TF-IDF)

举例:考虑一个图像描述任务,其中参考描述为:“A black cat is sitting on a red sofa.”(一只黑猫坐在一张红色沙发上。)而生成的候选描述为:“A cat is sitting on a sofa.”(一只猫坐在一张沙发上。)如果直接使用词频权重计算一致性,那么由于候选描述中缺少了"black"和"red"这两个关键词(就是非关键词),会导致一致性得分较低。然而,这两个关键词实际上并不是任务中最关键的词汇,因为它们只是描述图像中的一些颜色信息。

TF-IDF:
Term Frequency(词频)和Inverse Document Frequency(逆文档频率)。
1.TF:特定的word在文档中出现的次数/文档长度
2.IDF:log(语料库中总共的文档数/包含有特定的word的文档数)
TF-IDF值越大,表示词在当前文档中的重要性越高,且在其他文档中出现的频率越低。

在CIDEr中:如果一些n元组频繁地出现在描述图像的参考标注中,TF对于这些n元组将给出更高的权重,而IDF则降低那些在所有描述语句中都常常出现的n元组的权重。

图像字幕生成评价代码 CIDEr

==================CIDEr===================
import json
import numpy as np
from nltk.translate.bleu_score import sentence_bleu
from pyciderevalcap.ciderD.ciderD import CiderD

# 加载参考描述和生成描述
with open('reference.json', 'r') as f:
    ref = json.load(f)

with open('generated.json', 'r') as f:
    gen = json.load(f)

# 将描述转换成单词序列
ref_tokens = [[sent.strip().split() for sent in desc] for desc in ref]
gen_tokens = [sent.strip().split() for sent in gen]

# 计算N-gram重叠度
n = 4
ciderd = CiderD(ref_tokens)
scores = np.array([ciderd.compute_score({i: [gen_tokens[i]]})[0] for i in range(len(gen_tokens))])
score = np.mean(scores)

print("CIDEr score:", score)
6、Edit Distance
编辑距离(Edit Distance),也称为Levenshtein距离,是一种用于衡量两个字符串之间的相似度的指标。它定义为将一个字符串转换为另一个字符串所需的最小编辑操作数,其中编辑操作包括插入(Insertion)、删除(Deletion)和替换(Substitution)字符。

用处:
1、拼写纠错:可以使用编辑距离来计算输入的单词与词典中的单词之间的相似度,从而进行拼写错误的自动修正。
2、文本匹配:可以使用编辑距离来计算两段文本之间的相似度,从而进行文本匹配、相似性搜索等任务。

编辑距离的计算方法通常使用动态规划算法。算法通过创建一个二维矩阵,其中矩阵的每个元素表示从一个字符串的前缀转换到另一个字符串的前缀所需的最小编辑操作数。通过填充矩阵并计算最右下角的元素,我们可以得到两个字符串之间的编辑距离。后面采用回溯,从最后一个单元格开始(即最大行和最大列的单元格),跟随回溯指针的方向回溯该矩阵,从最后单元格开始到第一个单元格的每一条完整路径都代表一个最小比对距离。

举例:假设我们有两个字符串:“kitten” 和 “sitting”,我们想计算它们之间的编辑距离。
首先,我们创建一个二维矩阵,其中行表示 “kitten” 的每个字符,列表示 “sitting” 的每个字符。矩阵的大小为 (6+1) x (7+1),因为字符串的长度分别为 6 和 7,我们在每个字符串前面添加了一个空字符作为起始字符。
然后,我们从矩阵的左上角开始,按行和列遍历矩阵,并计算从一个字符转换到另一个字符的编辑操作数。我们可以使用以下三种操作:插入(I)、删除(D)和替换(R)。

如果两个字符相同,那么当前位置的编辑操作数等于左上角位置的编辑操作数,表示无需操作。
如果两个字符不同,那么当前位置的编辑操作数等于左上角、左边和上边位置的编辑操作数的最小值加1,表示需要执行一次编辑操作。
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
最终填充整个矩阵

最右下角的值 3 即为 “kitten” 和 “sitting” 之间的编辑距离,表示从字符串 “kitten” 转换到 “sitting” 需要执行的最少编辑操作数,即替换 “k” 为 “s”,删除 “e”,和插入 “i”,共计 3 次编辑操作。

不足:计算复杂度较高,特别是对于较长的字符串,会占用较多的计算资源。另外,编辑距离只考虑了单个字符的编辑操作,不考虑上下文和语义信息,因此在某些应用场景下可能不够精确。

文本匹配,词相似度计算 代码 Edit Distance

from nltk.metrics.distance import edit_distance
str1 = "kitten"
str2 = "sitting"
distance = edit_distance(str1, str2)
print("编辑距离:", distance)
=========Levenshtein===========
from Levenshtein import distance
distance = distance(str1, str2)
1
2
3
4
5
6
7
8
以上均为笔者在学习和研究过程中参考过的资料,并非原创,在此表明。笔者目前也正在学习和研究NLP,对此领域还不太熟练,欢迎与我讨论,提出宝贵的意见和建议。如果文章对您有所帮助,还请点赞支持,谢谢!笔者将不断更新更多与NLP相关的内容,敬请期待!

 

NLP评估指标之ROUGE - 知乎

 文本生成:自动摘要评价指标 Rouge_rouge评价指标_SunnyGJing的博客-CSDN博客

文本生成评估指标详解及计算(BLEU)_bleu越大越好_arv1nChen的博客-CSDN博客

百度安全验证

一文带你理解|NLP评价指标 BLEU 和 ROUGE(无公式) - 知乎

在机器翻译任务中,BLEU 和 ROUGE 是两个常用的评价指标,BLEU 根据精确率(Precision)衡量翻译的质量,而 ROUGE 根据召回率(Recall)衡量翻译的质量

BLEU(Bilingual Evaluation Understudy): BLEU是一种用于评估机器翻译结果质量的指标。 它主要侧重于衡量机器翻译输出与参考翻译之间的相似程度,着重于句子的准确性和精确匹配。BLEU通过计算N-gram(连续N个词)的匹配程度,来评估机器翻译的精确率(Precision)。
ROUGE(Recall-Oriented Understudy for Gisting Evaluation): ROUGE是一种用于评估文本摘要(或其他自然语言处理任务)质量的指标。与BLEU不同,ROUGE 主要关注机器生成的摘要中是否捕捉到了参考摘要的信息,着重于涵盖参考摘要的内容和信息的完整性。ROUGE通过计算N-gram的共现情况,来评估机器生成的摘要的召回率(Recall)。
简而言之, BLEU侧重于衡量翻译的准确性和精确匹配程度,更偏向于Precision,而ROUGE侧重于衡量摘要的信息完整性和涵盖程度,更偏向于Recall。这两个指标在不同的任务和应用场景中都有其重要性,因此在评估自然语言处理模型时,经常会同时使用它们来 综合考虑模型的表现

理解什么是n-gram?

n代表连续的n个词的组合。"n"可以是1、2、3,或者更高。

  • 1-gram:也称为unigram,是指单个的词语。例如,在句子 "我喜欢学习自然语言处理。" 中的1-gram为:["我", "喜欢", "学习", "自然语言处理", "。"]
  • 2-gram:也称为bigram,是指两个连续的词语组合。例如,在句子 "我喜欢学习自然语言处理。" 中的2-gram为:["我喜欢", "喜欢学习", "学习自然语言处理", "自然语言处理。"]
  • 3-gram:也称为trigram,是指三个连续的词语组合。例如,在句子 "我喜欢学习自然语言处理。" 中的3-gram为:["我喜欢学习", "喜欢学习自然语言处理", "学习自然语言处理。"]

  • n-gram在自然语言处理中是一种常用的技术,特别在机器翻译、文本摘要和语言模型等任务中广泛使用。使用n-gram可以捕捉一定长度的上下文信息,有助于更好地理解文本和评估翻译质量。例如,在机器翻译中,使用n-gram可以帮助评估系统生成的翻译与参考翻译之间的相似程度。

一个例子理解BLEU 和ROUGE的计算过程

让我们通过一个简单的例子来解释BLEU(Bilingual Evaluation Understudy)和ROUGE(Recall-Oriented Understudy for Gisting Evaluation)指标的计算过程。

假设我们有两个句子,一个是参考翻译(Reference Translation),另一个是系统生成的翻译(Candidate Translation)。

参考翻译: "今天天气晴朗。"

系统生成的翻译: "今天的天气是晴朗的。"

我们将使用这两个句子来计算BLEU和ROUGE指标。

  • BLEU指标计算过程:

a. 首先,我们将参考翻译和系统生成的翻译拆分成n-gram序列。n-gram是连续n个词的组合。

参考翻译的1-gram:["今天", "天气", "晴朗", "。"]

系统生成的翻译的1-gram:["今天", "的", "天气", "是", "晴朗", "的", "。"]

b. 接下来,我们计算系统生成的翻译中n-gram与参考翻译中n-gram的匹配数。例如,1-gram中有3个匹配:["今天", "天气", "晴朗"]

c. 计算BLEU的精确度(precision):将系统生成的翻译中的匹配数除以系统生成的翻译的总n-gram数。在这里,精确度为3/7。

d. 由于较长的翻译可能具有较高的n-gram匹配,我们使用短文本惩罚(brevity penalty)来调整精确度。短文本惩罚可以防止短翻译在BLEU中得分过高。

e. 最后,计算BLEU得分:BLEU = 短文本惩罚 * exp(1/n * (log(p1) + log(p2) + ... + log(pn)))

其中,p1, p2, ..., pn是1-gram, 2-gram, ..., n-gram的精确度,n是n-gram的最大长度。

  • ROUGE指标计算过程:着重于信息完整性和涵盖程度

a. ROUGE指标是用于评估文本摘要任务的,因此我们将参考翻译和系统生成的翻译视为两个文本摘要

b. 首先,我们计算系统生成的翻译中包含的n-gram在参考翻译中出现的次数。

c. 接下来,计算召回率(recall):将匹配的n-gram总数除以参考翻译中的总n-gram数。例如,1-gram中有3个匹配,参考翻译总共有4个1-gram,因此召回率为3/4。

d. ROUGE得分可以根据需要使用不同的n-gram大小,通常使用ROUGE-1、ROUGE-2和ROUGE-L。

ROUGE-1 = 召回率(系统生成的1-gram匹配数 / 参考翻译中的1-gram总数)

ROUGE-2 = 召回率(系统生成的2-gram匹配数 / 参考翻译中的2-gram总数)

ROUGE-L = 最长公共子序列(Longest Common Subsequence,LCSS)的长度 / 参考翻译的总长度

请注意,这里的计算过程只是为了帮助理解,实际上,BLEU和ROUGE指标的计算还涉及一些调整和平滑方法,以便更好地评估翻译和文本摘要的质量

1.机器翻译评价指标

使用机器学习的方法生成文本的翻译之后,需要评价模型翻译的性能,这就要用到一些机器翻译评价指标,其中比较常见的评价指标有 BLEU 和 ROUGE。这两个指标具有比较旧的历史,BLEU 是 2002 年提出的,而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题,但是仍然是比较主流的机器翻译评价指标。

一般用C表示机器翻译的译文,另外还需要提供 m 个参考的翻译S1,S2, ...,Sm。评价指标就可以衡量机器翻译的C和参考翻译S1,S2, ...,Sm的匹配程度。

2.BLEU

BLEU 的全称是 Bilingual evaluation understudy,BLEU 的分数取值范围是 0~1,分数越接近1,说明翻译的质量越高。BLEU 主要是基于精确率(Precision)的,下面是 BLEU 的整体公式。

BLEU 需要计算译文 1-gram,2-gram,...,N-gram 的精确率,一般 N 设置为 4 即可,公式中的 Pn 指 n-gram 的精确率。Wn 指 n-gram 的权重,一般设为均匀权重,即对于任意 n 都有 Wn = 1/N。BP 是惩罚因子,如果译文的长度小于最短的参考译文,则 BP 小于 1。BLEU 的 1-gram 精确率表示译文忠于原文的程度,而其他 n-gram 表示翻译的流畅程度。2.1 n-gram 精确率计算

假设机器翻译的译文C和一个参考翻译S1如下:

C: a cat is on the table

S1: there is a cat on the table

则可以计算出 1-gram,2-gram,... 的准确率

直接这样子计算 Precision 会存在一些问题,例如:

C: there there there there there

S1: there is a cat on the table

这时候机器翻译的结果明显是不正确的,但是其 1-gram 的 Precision 为1,因此 BLEU 一般会使用修正的方法。给定参考译文S1,S2, ...,Sm,可以计算C里面 n 元组的 Precision,计算公式如下:

2.2 惩罚因子

上面介绍了 BLEU 计算 n-gram 精确率的方法, 但是仍然存在一些问题,当机器翻译的长度比较短时,BLEU 得分也会比较高,但是这个翻译是会损失很多信息的,例如:

C: a cat

S1: there is a cat on the table

因此需要在 BLEU 分数乘上惩罚因子

3.ROUGE

ROUGE 指标的全称是 (Recall-Oriented Understudy for Gisting Evaluation),主要是基于召回率 (recall) 的。ROUGE 是一种常用的机器翻译和文章摘要评价指标,由 Chin-Yew Lin 提出,其在论文中提出了 4 种 ROUGE 方法:

ROUGE-N: 在 N-gram 上计算召回率ROUGE-L: 考虑了机器译文和参考译文之间的最长公共子序列ROUGE-W: 改进了ROUGE-L,用加权的方法计算最长公共子序列3.1 ROUGE-N

ROUGE-N 主要统计 N-gram 上的召回率,对于 N-gram,可以计算得到 ROUGE-N 分数,计算公式如下:

公式的分母是统计在参考译文中 N-gram 的个数,而分子是统计参考译文与机器译文共有的 N-gram 个数。

C: a cat is on the table

S1: there is a cat on the table

上面例子的 ROUGE-1 和 ROUGE-2 分数如下:

如果给定多个参考译文 Si,Chin-Yew Lin 也给出了一种计算方法,假设有 M 个译文 S1, ..., SM。ROUGE-N 会分别计算机器译文和这些参考译文的 ROUGE-N 分数,并取其最大值,公式如下。这个方法也可以用于 ROUGE-L,ROUGE-W 和 ROUGE-S。

3.2 ROUGE-L

ROUGE-L 中的 L 指最长公共子序列 (longest common subsequence, LCS),ROUGE-L 计算的时候使用了机器译文C和参考译文S的最长公共子序列,计算公式如下:

公式中的 RLCS 表示召回率,而 PLCS 表示精确率,FLCS 就是 ROUGE-L。一般 beta 会设置为很大的数,因此 FLCS 几乎只考虑了 RLCS (即召回率)。注意这里 beta 大,则 F 会更加关注 R,而不是 P,可以看下面的公式。如果 beta 很大,则 PLCS 那一项可以忽略不计。

3.3 ROUGE-W

ROUGE-W 是 ROUGE-L 的改进版,考虑下面的例子,X表示参考译文,而Y1,Y2表示两种机器译文。

在这个例子中,明显 Y1的翻译质量更高,因为 Y1 有更多连续匹配的翻译。但是采用 ROUGE-L 计算得到的分数确实一样的,即 ROUGE-L(X, Y1)=ROUGE-L(X, Y2)。

因此作者提出了一种加权最长公共子序列方法 (WLCS),给连续翻译正确的更高的分数,具体做法可以阅读原论文《ROUGE: A Package for Automatic Evaluation of Summaries》。

3.4 ROUGE-S

ROUGE-S 也是对 N-gram 进行统计,但是其采用的 N-gram 允许"跳词 (Skip)",即单词不需要连续出现。例如句子 "I have a cat" 的 Skip 2-gram 包括 (I, have),(I, a),(I, cat),(have, a),(have, cat),(a, cat)。

4.参考文献

B: a method for automatic evaluation of machine translation

ROUGE: A Package for Automatic Evaluation of Summaries

参考(想要更加深挖公式)

机器翻译与自动文摘评价指标 BLEU 和 ROUGE

Zimix:NLP评估指标之ROUGE

文本生成:自动摘要评价指标 Rouge

本文结构概览

Rouge的全名是Recall-Oriented Understudy for Gisting Evaluation,单看名字就会发现Rouge是由召回率演变而来的指标,用于衡量模型生成摘要文本的质量。我们常说的Rouge其实是一组评价指标的统称,包含Rouge-N, Rouge-L, Rouge-W, Rouge-S四个指标,它们的计算方式和适用场景有所不同。本文首先介绍了它们各自的适用场景和计算方式,并给出了简洁可用的代码示例,最后写下了一点个人思考。

不同的摘要任务下,选择合适的Rouge指标
  • 单文档摘要任务中,ROUGE-2ROUGE-LROUGE-W, 以及ROUGE-S表现很好
  • 在短摘要/标题式摘要任务中,ROUGE-1ROUGE-LROUGE-W,
    ROUGE-SU4, 以及ROUGE-SU9表现很棒
  • 在多文档摘要任务中,当停用词被排除在匹配之外时,ROUGE-1ROUGE-2ROUGE-S4ROUGE-S9ROUGE-SU4, 以及ROUGE-SU9表现不错
  • 排除停用词通常能改善相关性评估
  • 使用多个reference(ideal 摘要)可以改善相关性评估。
Rouge-N的理解与示例

n-gram召回率,Co-Occurrence Statistics

rouge-n = pred与ideal的n-gram重叠数量 ideal的n-gram数量 \text{rouge-n}=\frac{\text{pred与ideal的n-gram重叠数量}}{\text{ideal的n-gram数量}}rouge-n=ideal的n-gram数量pred与ideal的n-gram重叠数量​

分母是ideal字符串的n-gram个数,因为Rouge更关心recall值。(而BLEU更关心precision值)

简单地说,Rouge-n统计了pred和ideal两个字符串的n-gram重叠单元的数量,并计算了重叠单元在ideal字符串中的占比,作为召回率。

以短摘要/title摘要任务为例:
ideal摘要:“武汉长江大桥”
pred摘要:“武汉市长江大桥”

N-gram摘要内容单元数量Rouge-N
1-gram武 / 汉 / 长 / 江 / 大/ 桥
武 / 汉 / 市 / 长 / 江 / 大/ 桥
ideal:6
重叠:6
Rouge-1 = 6 6 = 1 \text{Rouge-1}=\frac{6}{6}=1Rouge-1=66​=1
2-gram武汉 / 汉长 / 长江 / 江大 / 大桥
武汉 / 汉市 / 市长 / 长江 / 江大 / 大桥
ideal:5
重叠:4
Rouge-2 = 4 5 = 0.8 \text{Rouge-2}=\frac{4}{5}=0.8Rouge-2=54​=0.8

注:如有多个ideal摘要,怎么计算?
分别计算每个ideal摘要和pred摘要的Rouge值,并取其中最大值,作为当前pred摘要的Rouge值。
rouge-n m u l t i = a r g m a x i {rouge-n ( i d e a l i , p r e d ) } \text{rouge-n}_{multi} = argmax_i \text{\{rouge-n}(ideal_i, pred)\}rouge-nmulti​=argmaxi​{rouge-n(ideali​,pred)}

Rouge-L的理解与示例

最长公共子序列,Longest Common Subsequence(LCS)

  • LCS和最长公共子串不同,不要求连续,保序即可
  • Rouge-N 只关注匹配单元的数量,像词袋一样,不关注词序
  • Rouge-L 关注词序

R l c s = l c s 长 度 i d e a l 字 符 串 长 度 , P l c s = l c s 长 度 p r e d 字 符 串 长 度 , F l c s = ( 1 + β 2 ) R l c s P l c s R l c s + β 2 P l c s R_{lcs} = \frac{lcs长度}{ideal字符串长度}, P_{lcs}=\frac{lcs长度}{pred字符串长度}, F_{lcs}=\frac{(1+\beta^2)R_{lcs}P_{lcs}}{R_{lcs}+\beta^2P_{lcs}}Rlcs​=ideal字符串长度lcs长度​,Plcs​=pred字符串长度lcs长度​,Flcs​=Rlcs​+β2Plcs​(1+β2)Rlcs​Plcs​​

注:lcs经过了去重

以文档摘要任务为例:
ideal摘要:“矿泉水和纯净水的所含物质不同”
pred摘要:“矿泉水含有丰富的矿物质元素,纯净水不含矿物质”

-摘要内容lcs内容Rouge-L
句子1ideal:矿泉水和纯净水所含物质不同
pred:矿泉水含有丰富物质元素
矿 泉 水 的 物 质
句子2ideal:矿泉水和纯净水的所含物质不同
pred:纯净水物质
纯 净 水 含 物 质
合并去重ideal长度: 14
pred长度: 21
矿 泉 水 纯 净 水 的 含 物 质
lcs长度:10
R l c s = 10 14 = 0.714 R_{lcs}=\frac{10}{14}=0.714Rlcs​=1410​=0.714
P l c s = 10 21 = 0.476 P_{lcs}=\frac{10}{21}=0.476Plcs​=2110​=0.476
代码示例(char粒度 计算摘要的Rouge值)
from rouge import Rouge

pred = '武汉市长江大桥'
ideal = '武汉长江大桥'

# Rouge()按空格分隔gram,所以要在中文的字和字之间加上空格
pred, ideal = ' '.join(pred), ' '.join(ideal)

# 计算字粒度的rouge-1、rouge-2、rouge-L
rouge = Rouge()
rouge_scores = rouge.get_scores(hyps=pred, refs=ideal)

结果如下

>>> pred
'武 汉 市 长 江 大 桥'
>>> ideal
'武 汉 长 江 大 桥'
>>> rouge_scores
[{'rouge-1': {'r': 1.0, 'p': 0.8571428571428571, 'f': 0.9230769181065088}, 
'rouge-2': {'r': 0.8, 'p': 0.6666666666666666, 'f': 0.7272727223140496}, 
'rouge-l': {'r': 1.0, 'p': 0.8571428571428571, 'f': 0.9230769181065088}}]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
代码示例(word粒度 计算摘要的Rouge值)
from rouge import Rouge
import jieba

pred = '武汉市长江大桥'
ideal = '武汉长江大桥'

# 采用jieba分词
pred = ' '.join(jieba.cut(pred, HMM=False))
ideal = ' '.join(jieba.cut(ideal, HMM=False))

# 计算词粒度的rouge-1、rouge-2、rouge-L
rouge = Rouge()
rouge_scores = rouge.get_scores(hyps=pred, refs=ideal)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果如下,

>>> pred
'武汉市 长江大桥'
>>> ideal
'武汉长江大桥'
>>> rouge_scores
[{'rouge-1': {'r': 0.0, 'p': 0.0, 'f': 0.0}, 
'rouge-2': {'r': 0.0, 'p': 0.0, 'f': 0.0}, 
'rouge-l': {'r': 0.0, 'p': 0.0, 'f': 0.0}}]
个人思考

word粒度的Rouge计算有两个缺点:

  • 受jieba分词的影响,分词错误就会评估错误。
  • 降低了长词的重要性,这样一来,模型更倾向于拟合容易预测的短词。

word粒度的Rouge也有明显的优点:

  • 更好地评估模型对专有名词的拟合程度。

在苏神的文章中,看到了一个结合了字粒度Rouge和词粒度Rouge各自优点的方法,简单来说,还是以词为匹配单位,把词的长度作为权重,为Rouge做一个加权即可。比如上文的“武汉长江大桥”,如果匹配对了,就给6分,而不是1分。这个方法需要自己实现Rouge计算函数。

Reference

热门文章

中文文本摘要指标-ROUGE

机器自动摘要常见的参考指标rouge有若干个优化版本,核心是通过统计机器候选摘要句子和标准摘要句子重叠的单元n-gram,来评判摘要的质量。

ROUGE

  • ROUGEN
  • ROUGE-1
  • ROUGE-2
  • ROUGE-3
  • ROUGE-L
  • ROUGE-W
  • ROUGE-S
  • ROUGE-SU
  • 中文摘要代码

1.ROUGE-N

共现的字词个数摘要个数ROUGE−N=共现的字/词个数摘要个数

对应的N即为连续字个数。例如:

人工y:文章内容新颖 (6个字)
机器x:这篇文章内容是新颖的(10个字)
重叠的部分是6个字

候选句子摘要句子是x,人工摘要句子是y

precision 两个句子重叠部分的n-gram/len(x) 6/10

recall 两个句子重叠部分的n-gram/len(y) 6/6

可以看出来机器生成的把人工的全部召回了,但是实际上机器生成的太多。此时精度就是来限制句子的关联程度的。

对应的range-2计算

人工y:文章内容新颖- 文章 章内 内容…… 共5个
机器x:这篇文章内容是新颖的(10个字)- 这篇 篇文 文章 …… 共9个
重叠的部分是5个词

precision 为5/9

recall 为5/5

优点:简洁且有词序

缺点:区分度不高,随着N的增大,值变小如上示例6/10 -> 5/9

2.ROUGE-L

最长公共子序列的重合率计算。

S是人工摘要,C是机器摘要

RLCS 表示召回率,而 PLCS 表示精确率,FLCS 就是 ROUGE-L。一般 beta 会设置为很大的数,因此 FLCS 几乎只考虑了 RLCS (即召回率)

优点:反应句子级别顺序,不需要制定n-gram的长度

缺点:只考虑了最长子序列的长度,忽略了其他子序列

适用于短摘要提取

3.ROUGE-W

基于LCS的加权LCS统计信息,即连续LCSES。

X是人工摘要,Y1,Y2分别是机器摘要两个结果,可以看出Y1优于Y2,因为Y1连续。所以rouge-W是考虑了连续最长公共子序列应该有更大的权重。

4.ROUGE-S

使用了skip-gram计算重合率,字符要按照在原始句子中的顺序,需要设置窗口大小,避免出现大量无意义的词组。

例如:“我认真写文章”,设定最多跳2个字。对应skip可以是这样词组,“我认 我真 我写……”

优点:按照词序统计词对

缺点:要制定跳跃字数

5.ROUGE-SU

跳字模型以及 1 元模型 (unigram) 的匹配程度

中文摘要代码:

pip install rouge

from rouge import Rouge
rouge.get_scores(' '.join(list('这篇文章内容是新颖的')), ' '.join(list('文章内容新颖')))

对应的结果如下:

[{'rouge-1': {'f': 0.7499999953125, 'p': 0.6, 'r': 1.0},
  'rouge-2': {'f': 0.5714285668367348, 'p': 0.4444444444444444, 'r': 0.8},
  'rouge-l': {'f': 0.7499999953125, 'p': 0.6, 'r': 1.0}}]

注:这里直接按照字粒度进行,同时在某些样本下,可能会按照词粒度,比如:人工摘要是:“青椒土豆丝好吃”。机器摘要是:“青椒肉丝好吃”,如果按照字粒度,单独看召回是:5/7,如果按照专有组合词组,“青椒土豆丝、好吃”和“青椒肉丝、好吃”,召回是1/2

在中文摘要时排除stopwords,通常能够提高相关性

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值