NLP笔记:生成问题常用metrics整理

本文介绍了自然语言处理中生成任务的质量评估方法,包括无监督的ppl和有监督的bleu、rouge、bleurt等指标,并通过实例详细解释了这些指标的计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 生成问题的评估方法

nlp中的生成问题大致可以涵盖以下一些部分:

  1. 语言模型;
  2. 文本翻译;
  3. 内容概括 & 扩写;
  4. ……

本质而言,他就是要对一段机器生成的文本来评估其生成质量的好坏。

有关这部分内容,他又可以分为有监督的和无监督的,前者已经有了一些参考的生成结果可以比对,后者完全没有任何参考文本,只能通过文本本身来评估生成质量。

其中有监督的部分我们还可以将其进一步细分,传统的评估方式大都是通过纯字符匹配的方式来对生成文本与参考文本进行比对,比如bleu,rouge等,其优点在于速度快,但是缺点在于无法真正理解语意,因此与真实的质量评估上总是存在一个不小的gap。

基于此,后来就衍生出了使用模型本身来对文本质量进行评估的评估模型,比如bleurt,他们在文本评估方面会更为准确,但是需要大量的训练数据,而且运行起来速度会比较慢。

综上所述,我们可以将其概括为如下:

  1. 无监督
    • ppl
  2. 有监督
    1. 纯字符匹配方式
      • bleu
      • rouge
      • ……
    2. 模型指标学习
      • bleurt
      • ……
  3. 人工评判方式

下面,我们来逐次对其进行考察。

2. 常用metrics

1. ppl

ppl的全称为perplexity,他表示一句话中每一个词出现的概率倒数的均方平均,用公式表达如下:

p p l = ∏ w i 1 p ( w i ∣ w 0 , w 1 , . . . , w i − 1 ) n ppl = \sqrt[n]{\prod_{w_i} {\frac{1}{p(w_i|w_0,w_1,...,w_{i-1})}}} ppl=nwip(wiw0,w1,...,wi1)1

因此,由定义我们就可以看到:

  • 通常而言,ppl越小,表示文本的上下连贯度越高,文本越通顺。

但是,由于n-gram的概率计算复杂度太高,通常而言,我们都会使用马尔可夫假设,即当前输出词汇只与上一个词汇相关,这样就可以大大地简化问题。

但是,同样,这样带来的问题就是,ppl指标只能表征词汇的通顺度,但是在语义上是无法做出什么保证的。

例如:

  • New York is human being.

上面这句话的ppl值大概率就会很小,但是语义上确实完全不合理的。

2. bleu

bleu全称bilingual evaluation understudy,它以及后续的rouge指标是最常用的评价有监督生成问题(比如翻译、内容概括、内容生成等)的自动化统计指标。

他们的核心思想都在于比较生成文本与参考文本间的字符串重合度。

下面,我们首先给出bleu指标的计算公式,

B L E U = B P × e x p ( ∑ n = 1 N w n × l o g p n ) BLEU = BP \times exp(\sum_{n=1}^{N}{w_n \times log p_n}) BLEU=BP×exp(n=1Nwn×logpn)

其中, B P BP BP是句长惩罚因子, w n w_n wn是权重因子, p n p_n pn是n-gram字符匹配精度指标,也是bleu指标中最重要的一个指标。

我们来具体考察一下各个指标的计算。

1. 句长惩罚因子BP

句长惩罚因子 B P BP BP的计算相对简单一些,他的核心思想就是:

  • 参考译文越长, p n p_n pn的评估就会越靠近真实文本质量,惩罚因子就越接近1;
  • 而参考译文越短,生成质量往往越差,且 p n p_n pn往往更容易失真,因此需要乘以一个较小的数使之更加可信。

据此,我们给出BLEU指标中句长惩罚因子BP的公式表达如下:

B P = { 1 c > r e 1 − r / c c ≤ r BP = \begin{cases} 1 & \text{c > r} \\ e^{1- r/c} & \text{c ≤ r} \end{cases} BP={1e1r/cc > rc ≤ r

其中 r r r表示参考文本的文本长度, c c c表示生成文本的文本长度。

2. n-gram字符匹配精度与权重因子

现在,我们来考察n-gram的字符匹配精度计算公式。

他的核心思想是:

  • 统计生成文本中的n-gram词汇在参考文本中出现的比例(精度)。

同样的,我们首先给出定义公式,而后结合定义公式进行考察。

p n = ∑ C ∈ c a n d i d a t e s ∑ n − g r a m ∈ C C o u n t c l i p ( n − g r a m ) ∑ C ′ ∈ c a n d i d a t e s ∑ n − g r a m ∈ C ′ C o u n t ( n − g r a m ) p_n = \frac{\sum_{C \in candidates}\sum_{n-gram \in C}Count_{clip}(n-gram)}{\sum_{C' \in candidates}\sum_{n-gram \in C'}Count(n-gram)} pn=CcandidatesngramCCount(ngram)CcandidatesngramCCountclip(ngram)

其中, C C C以及 C ′ C' C分别表示生成文本集合中的文本以及参考文本集合中的文本;n-gram表示连续n个词汇, C o u n t Count Count函数就是普通的计数函数, C o u n t c l i p Count_{clip} Countclip函数表示对计数结果进行上截断,只取其在参考译文以及生成译文中的最大值。

3. 样例说明

我们给出一个例子来进行具体的计算说明如下:

  • 生成文本:明天天天气好
  • 参考文本:今天天气真的好

可以计算得到: p 1 = 2 + 1 + 1 6 = 2 3 p_1 = \frac{2 + 1 + 1}{6} = \frac{2}{3} p1=62+1+1=32 p 2 = 2 5 p_2 = \frac{2}{5} p2=52 p 3 = 1 4 p_3 = \frac{1}{4} p3=41 p 4 = 0 3 p_4 = \frac{0}{3} p4=30

另一方面,可以计算 B P = e x p ( 1 − r c ) = e − 1 6 BP = exp(1-\frac{r}{c}) = e^{-\frac{1}{6}} BP=exp(1cr)=e61

总即可以得到:

B L E U = e − 1 6 × 1 4 × ( 2 3 + 2 5 + 1 4 + 0 ) ≃ 0.28 BLEU = e^{-\frac{1}{6}} \times \frac{1}{4}\times (\frac{2}{3} + \frac{2}{5} + \frac{1}{4} + 0) ≃ 0.28 BLEU=e61×41×(32+52+41+0)0.28

3. rouge

rouge指标与bleu指标极其相似,但是,相较于bleu关注于生成的精度,rouge更看重生成的召回。

他的核心思想是:

  • 考察参考文本中的n-gram词汇在模型生成文本中的出现比例。

除此之外,rouge没有句长惩罚因子,他的公式可以直接表达为如下形式:

R o u g e − n = ∑ C ∈ c a n d i d a t e s ∑ n − g r a m ∈ C C o u n t c l i p ( n − g r a m ) ∑ C ′ ∈ r e f e r e n c e s ∑ n − g r a m ∈ C ′ C o u n t ( n − g r a m ) Rouge-n = \frac{\sum_{C \in candidates}\sum_{n-gram \in C}Count_{clip}(n-gram)}{\sum_{C' \in references}\sum_{n-gram \in C'}Count(n-gram)} Rougen=CreferencesngramCCount(ngram)CcandidatesngramCCountclip(ngram)

根据n的取值不同,rouge可以分为rouge-1, rouge-2等等。

另外还有常用的rouge指标还有rouge-l,他是rouge-n的一种变体:

  • 它的分母还是参考文本的长度,他的分子则是生成文本与参考文本的最长公共子序列。

用公式表达如下:

R o u g e − L = L C S ( c a n d i d a t e , r e f e r e n c e ) l e n ( r e f e r e n c e ) Rouge-L = \frac{LCS(candidate, reference)}{len(reference)} RougeL=len(reference)LCS(candidate,reference)

同样的,我们使用上文中的例子来进行计算说明:

  • 生成文本:明天天天气好
  • 参考文本:今天天气真的好

则有:

{ r o u g e − 1 = 4 / 7 ≃ 0.57 r o u g e − 2 = 2 / 6 ≃ 0.33 r o u g e − L = 4 / 7 ≃ 0.57 \left\{ \begin{array}{lr} rouge-1 = 4/7 ≃ 0.57 \\ rouge-2 = 2/6 ≃ 0.33 \\ rouge-L = 4/7 ≃ 0.57 \end{array} \right. rouge1=4/70.57rouge2=2/60.33rougeL=4/70.57

4. bleurt

bleurt来源于文献:BLEURT: Learning Robust Metrics for Text Generation

他的思想事实上也是比较简单的:

  • 经验已经证明大规模的统计机器学习模型具有很强的特征抓取能力,因此,我们就直接基于大量的数据来训练一个生成文本与参考文本间的评估质量模型,用这个模型来进行生成文本质量的评估。

通过这种方式,上述文献中的文本质量评价结果足以碾压bleu以及rouge指标,直逼人类的真实评估水平。

但是,同样的,就如所有的机器学习模型一样,这种方式强烈依赖于训练数据,且评估成本很大,耗时很长,因此目前还没有看到业内有大量的使用迹象。

3. 参考链接

  1. 语言模型评价指标Perplexity
  2. 一种机器翻译的评价准则——Bleu
  3. 机器翻译自动评估-BLEU算法详解
  4. 自动文摘评测方法:Rouge-1、Rouge-2、Rouge-L、Rouge-S
  5. 发布 BLEURT,用于评估自然语言生成模型
### 深学习与自然语言处理中的文本向量化 #### ### 1. 文本向量化的基础概念 在自然语言处理NLP)领域,文本向量化是将文本数据转换为数值形式的过程,以便机器能够理解和处理这些数据。早期的方法包括独热编码(One-Hot Encoding),但这种方法会导致维灾难,即当词汇表规模较大时,生成的向量维会非常高,计算和存储成本显著增加[^1]。 为了解决这一问题,研究者提出了词嵌入(Word Embedding)技术,它将高维的独热向量映射到低维的稠密向量空间中。这种低维表示不仅减少了维,还能够捕捉词语之间的语义关系[^2]。 #### ### 2. 常见的文本向量化方法 以下是几种常见的文本向量化方法及其特点: - **独热编码**:每个词用一个唯一的向量表示,向量的长等于词汇表的大小,仅有一个位置为1,其余位置为0。虽然简单直接,但存在维灾难的问题。 - **词袋模型(Bag of Words, BoW)**:统计文档中每个词的出现频率,并将其作为特征向量。BoW 忽略了词序信息,可能丢失上下文含义[^4]。 - **TF-IDF**:基于词频(Term Frequency, TF)和逆文档频率(Inverse Document Frequency, IDF)来衡量词的重要性。相比 BoW,TF-IDF 更加注重区分性特征[^4]。 - **词嵌入(Word Embedding)**:通过训练神经网络模型得到的低维稠密向量表示,能够有效捕捉词语间的语义关系。常用的词嵌入方法包括 Word2Vec、GloVe 和 FastText 等[^3]。 #### ### 3. 基于深学习的文本向量化方法 随着深学习的发展,越来越多的模型被应用于文本向量化任务中。以下是一些典型的深学习模型: - **循环神经网络(RNN)**:RNN 能够处理序列数据,适用于建模句子或文档等具有顺序结构的文本数据。然而,标准 RNN 存在梯消失和梯爆炸的问题。 - **长短时记忆网络(LSTM)**:LSTM 是一种改进版的 RNN,通过引入门控机制解决了长期依赖问题,能够更好地捕捉长距离依赖关系。 - **卷积神经网络(CNN)**:尽管 CNN 最初用于图像处理,但在 NLP 中也表现出色。通过滑动窗口提取局部特征,CNN 可以快速捕获短语级别的模式[^1]。 - **Transformer 模型**:Transformer 使用自注意力机制(Self-Attention Mechanism)代替传统的 RNN 结构,能够在并行化训练的同时有效建模全局上下文信息。BERT、GPT 等预训练模型均基于 Transformer 架构[^3]。 #### ### 4. 实现文本向量化的代码示例 以下是一个使用 `gensim` 库实现 Word2Vec 的代码示例: ```python from gensim.models import Word2Vec # 示例句子 sentences = [["我", "喜欢", "自然", "语言", "处理"], ["深", "学习", "很", "有用"]] # 训练 Word2Vec 模型 model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4) # 获取词向量 vector = model.wv["自然"] print(vector) ``` #### ### 5. 预训练模型的应用 近年来,预训练模型如 BERT、GPT 等在 NLP 领域取得了显著成果。这些模型通过在大规模语料库上进行无监督学习,获得了丰富的语言知识。在具体任务中,可以通过微调预训练模型来快速适应特定场景,从而减少对标注数据的需求[^3]。 以下是一个使用 Hugging Face 的 `transformers` 库加载并微调 BERT 模型的示例: ```python from transformers import BertTokenizer, TFBertForSequenceClassification import tensorflow as tf # 示例文本和标签 texts = ["我喜欢这部电影", "这部电影很无聊"] labels = [1, 0] # 加载 tokenizer 和预训练模型 tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = TFBertForSequenceClassification.from_pretrained('bert-base-chinese') # 对文本进行编码 inputs = tokenizer(texts, return_tensors="tf", padding=True, truncation=True, max_length=128) # 创建数据集 dataset = tf.data.Dataset.from_tensor_slices((dict(inputs), labels)).batch(2) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=5e-5), loss=model.compute_loss, metrics=['accuracy']) # 训练模型 model.fit(dataset, epochs=3) ``` ####
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值