我在计算中文句子的BLEU分数时发现了零值。在
候选句是c
,两个引用是r1
和{
c=[u'\u9274\u4e8e', u'\u7f8e\u56fd', u'\u96c6', u'\u7ecf\u6d4e', u'\u4e0e', u'\u8d38\u6613', u'\u6700\u5927', u'\u56fd\u4e8e', u'\u4e00\u8eab', u'\uff0c', u'\u4e0a\u8ff0', u'\u56e0\u7d20', u'\u76f4\u63a5', u'\u5f71\u54cd', u'\u7740', u'\u4e16\u754c', u'\u8d38\u6613', u'\u3002']
r1 = [u'\u8fd9\u4e9b', u'\u76f4\u63a5', u'\u5f71\u54cd', u'\u5168\u7403', u'\u8d38\u6613', u'\u548c', u'\u7f8e\u56fd', u'\u662f', u'\u4e16\u754c', u'\u4e0a', u'\u6700\u5927', u'\u7684', u'\u5355\u4e00', u'\u7684', u'\u7ecf\u6d4e', u'\u548c', u'\u8d38\u6613\u5546', u'\u3002']
r2=[u'\u8fd9\u4e9b', u'\u76f4\u63a5', u'\u5f71\u54cd', u'\u5168\u7403', u'\u8d38\u6613', u'\uff0c', u'\u56e0\u4e3a', u'\u7f8e\u56fd', u'\u662f', u'\u4e16\u754c', u'\u4e0a', u'\u6700\u5927', u'\u7684', u'\u5355\u4e00', u'\u7684', u'\u7ecf\u6d4e\u4f53', u'\u548c', u'\u8d38\u6613\u5546', u'\u3002']
代码是:
^{pr2}$但我得到了一个结果。当我进入bleu
过程时,我发现
try:
s = math.fsum(w * math.log(p_n) for w, p_n in zip(weights, p_ns))
except ValueError:
# some p_ns is 0
return 0
上面的程序转到except ValueError
。但是,我不知道为什么返回错误。如果我尝试其他句子,我可以得到一个非零值。在
似乎您在NLTK实现中发现了一个bug!此
try-except
在https://github.com/alvations/nltk/blob/develop/nltk/translate/bleu_score.py#L76处出错长:
首先,让我们看看BLEU分数中的
p_n
是什么意思:注意:
Count_match(ngram)
是基于具有较高计数的引用的(参见https://github.com/alvations/nltk/blob/develop/nltk/translate/bleu_score.py#L270)。在因此,默认的BLEU分数使用
n=4
,其中包括从unigram到4grams的unigram。对于每个ngram,让我们计算p_n
:注意BLEU score中}输出。现在,我们可以清楚地看到分子和分母。在
_modified_precision
的最新版本,因为这个https://github.com/nltk/nltk/pull/1229一直使用Fraction
而不是{现在让我们验证一下来自
_modified_precision
的unigram的输出。在假设中,粗体字出现在参考文献中:有9个令牌与1重叠,其中9个是重复出现的两次。在
^{pr2}$现在让我们检查一下这些重叠词在参考文献中出现的次数。取来自不同引用的“组合”计数器的值作为
p_1
公式的分子。如果同一个单词出现在两个引用中,则取最大计数。在现在对于分母来说,只是假设中出现的单数形式:
因此得到的分数是
8/18 -> 4/9
,我们的_modified_precision
函数可以检查出来。在现在让我们来看看完整的BLEU公式:
根据这个公式,我们现在只考虑求和的指数,即
exp(...)
。它也可以简化为我们之前计算的各种p_n
的对数之和,即sum(log(p_n))
。这就是它在NLTK中的实现方式,参见https://github.com/alvations/nltk/blob/develop/nltk/translate/bleu_score.py#L79暂时忽略BP,让我们考虑将
p_n
相加并考虑它们各自的权重:啊哈!这就是出现错误的地方,当将日志放入
math.fsum()
时,这些日志的总和将返回一个ValueError
。在要更正实现,
the try-except
应该是:参考文献:
公式来自于描述BLEU的一些敏感性问题的http://lotus.kuee.kyoto-u.ac.jp/WAT/papers/submissions/W15/W15-5009.pdf。在
相关问题 更多 >
编程相关推荐