【NLG】(二)文本生成评价指标—— METEOR原理及代码示例

前奏:

【NLG】(一)文本生成评价指标——BLEU原理及代码示例


1.METEOR原理

2004年,卡内基梅隆大学的Lavir提出评价指标中召回率的意义,基于此研究,Banerjee和Lavie(Banerjee and Lavie, 2005)发明了基于单精度的加权调和平均数和单字召回率的METEOR度量方法,目的是解决BLEU标准中的一些固有缺陷。简单说,该指标考虑了基于整个语料库上的准确率和召回率,而最终得出测度。

METEOR扩展了BLEU有关“共现”的概念,提出了三个统计共现次数的模块:

  • 一是“绝对”模块("exact" module),即统计待测译文与参考译文中绝对一致单词的共现次数;
  • 二是“波特词干”模块(porter stem module),即基于波特词干算法计算待测译文与参考译文中词干相同的词语“变体”的共现次数,如happy和happiness将在此模块中被认定为共现词;
  • 三是“WN同义词”模块(WN synonymy module),即基于WordNet词典匹配待测译文与参考译文中的同义词,计入共现次数,如sunlight与sunshine。

同时METEOR将词序纳入评估范畴,设立基于词序变化的罚分机制,当待测译文词序与参考译文不同时,进行适当的罚分。最终基于共现次数计算准确率、召回率与F值,并考虑罚分最终得到待测译文的METEOR值。

该算法首先计算 unigram 情况下的准确率P和召回率R(计算方式与BLEU、ROUGE类似),得到调和均值F值:

Meteor的特别之处在于,它不希望生成很“碎”的译文:比如参考译文是“A B C D”,模型给出的译文是“B A D C”,虽然每个unigram都对应上了,但是会受到很严重的惩罚。惩罚因子的计算方式为: 

在评价句子流畅性的时候,用了 chunk 的概念(候选译文和参考译文能够对齐的、空间排列上连续的单词形成一个 chunk,这个对齐算法是一个有点复杂的启发式 beam serach),chunk 的数目越少意味着每个 chunk 的平均长度越长,也就是说候选译文和参考译文的语序越一致。 unigrams_matched表示匹配上的unigram个数。

最后,METEOR计算为对应最佳候选译文和参考译文之间的准确率和召回率的调和平均:

用于机器翻译评测时,通常取afa=3,γ=0.5,sita=3.

2.优缺点

优点:

  • 考虑了基于整个语料库上的准确率和召回率
  • 考虑了句子流畅性
  • 考虑同义词对语义的影响

缺点:

  • BLEU和METEOR对于长度是比较敏感的.

3.如何算METEOR

这个指标的计算仍然采用nltk工具包自带的功能函数。

一 安装nltk

pip install nltk

二 数据形式:

这里的输入数据,要求按字分开。模仿英文状态下的输入形式,我们知道,英文每个单词之间会有空格儿做分割,而我们汉字是没有的,所以对句子做一些简单处理:给字之间加上空格儿。

代码demo:

from nltk.translate.meteor_score import meteor_score

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

输出:
0.4725

 

参考:

1.论文:http://www.cs.cmu.edu/~alavie/METEOR/pdf/Banerjee-Lavie-2005-METEOR.pdf

2.meteor的来源:https://zhuanlan.zhihu.com/p/100942429

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
当涉及到自然语言生成NLG)时,循环神经网络(RNN)是一个常见的选择。下面是一个简单的RNN模型,用于生成一段文本: ``` import numpy as np import tensorflow as tf # 定义超参数 num_epochs = 10 batch_size = 32 learning_rate = 0.001 # 准备数据 data = [...] # 假设已经准备好了数据 vocab_size = len(set(data)) # 计算词汇表大小 # 将数据转换为数字序列 data_as_int = [char_to_idx[c] for c in data] # 创建输入和输出序列 input_seq = data_as_int[:-1] output_seq = data_as_int[1:] # 将数据分成批次 num_batches = len(input_seq) // batch_size input_batches = np.split(np.array(input_seq[:num_batches * batch_size]), num_batches, axis=0) output_batches = np.split(np.array(output_seq[:num_batches * batch_size]), num_batches, axis=0) # 定义模型 model = tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size, 64, mask_zero=True), tf.keras.layers.SimpleRNN(64), tf.keras.layers.Dense(vocab_size, activation='softmax') ]) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate), loss='sparse_categorical_crossentropy') # 训练模型 for epoch in range(num_epochs): for i in range(num_batches): loss = model.train_on_batch(input_batches[i], output_batches[i]) if i % 100 == 0: print('Epoch {} Batch {} Loss {:.4f}'.format(epoch + 1, i, loss)) # 生成文本 def generate_text(model, start_string): # 将起始字符串转换为数字序列 input_eval = [char_to_idx[s] for s in start_string] input_eval = tf.expand_dims(input_eval, 0) # 初始化隐藏状态 hidden_state = model.reset_states() # 生成文本 text_generated = [] for i in range(1000): # 预测下一个字符 predictions, hidden_state = model(input_eval, hidden_state) predictions = tf.squeeze(predictions, 0) predicted_id = tf.random.categorical(predictions, num_samples=1)[-1, 0].numpy() # 将预测的字符添加到生成文本中 text_generated.append(idx_to_char[predicted_id]) # 将预测的字符作为下一步的输入 input_eval = tf.expand_dims([predicted_id], 0) return (start_string + ''.join(text_generated)) # 生成一段文本 generated_text = generate_text(model, start_string='The quick brown fox') print(generated_text) ``` 这个模型使用一个简单的RNN层来生成文本。首先,我们将数据转换为数字序列,并将其分成批次。然后,我们定义了一个简单的RNN模型,其中包括一个嵌入层、一个RNN层和一个全连接层。我们使用`sparse_categorical_crossentropy`作为损失函数,因为我们的输出是一个整数序列,而不是一个独热编码序列。 在训练模型时,我们使用`train_on_batch`方法来逐批训练模型。在每个时代和每个批次之后,我们记录损失并生成一段文本。最后,我们使用训练好的模型来生成一段文本,该文本以给定的起始字符串开头。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值