<p>以下是实际^{cd1>}<a href="https://www.nltk.org/_modules/nltk/translate/bleu_score.html" rel="nofollow noreferrer">source code</a>的稍微修改版本:</p>
<pre><code>def sentence_bleu_man(
references,
hypothesis,
weights=(0.25, 0.25, 0.25, 0.25)):
# compute modified precision for 1-4 ngrams
p_numerators = Counter()
p_denominators = Counter()
hyp_lengths, ref_lengths = 0, 0
for i, _ in enumerate(weights, start=1):
p_i = modified_precision(references, hypothesis, i)
p_numerators[i] += p_i.numerator
p_denominators[i] += p_i.denominator
# compute brevity penalty
hyp_len = len(hypothesis)
ref_len = closest_ref_length(references, hyp_len)
bp = brevity_penalty(ref_len, hyp_len)
# compute final score
p_n = [
Fraction(p_numerators[i], p_denominators[i],
_normalize=False)
for i, _ in enumerate(weights, start=1)
if p_numerators[i] > 0
]
s = (w_i * math.log(p_i) for w_i, p_i in zip(weights, p_n))
s = bp * math.exp(math.fsum(s))
return s
</code></pre>
<p>我们可以使用原始<a href="https://www.aclweb.org/anthology/P02-1040" rel="nofollow noreferrer">paper</a>中的示例:</p>
^{pr2}$
<p>输出:</p>
^{pr3}$