多参考句场景下基于集合去重的n-gram precision计算是否正确?
BLEU分数多参考句场景下n-gram精度计算的疑问与解答
我在理解BLEU分数的计算逻辑时发现,当存在多个参考句且需要计算n-gram精度时,将所有内容转换为集合去重似乎更为合理。n-gram内部的词序会被保留,但单个n-gram的顺序无关紧要,因此确实可以仅使用集合来计算假设句相对于多个参考句的n-gram精度。具体步骤如下:
- 生成两个集合,一个是所有参考句的n-gram集合的并集,另一个是假设句的所有n-gram集合,均需去除重复项;
- 计算两个集合的交集,交集中的n-gram数量除以假设句集合中的n-gram数量即为n-gram精度。
我认为这一思路也得到了BLEU score的nltk实现的支持,并附上相关代码:
# Extracts all ngrams in hypothesis # Set an empty Counter if hypothesis is empty. counts = Counter(ngrams(hypothesis, n)) if len(hypothesis) >= n else Counter() # Extract a union of references' counts. # max_counts = reduce(or_, [Counter(ngrams(ref, n)) for ref in references]) max_counts = {} for reference in references: reference_counts = ( Counter(ngrams(reference, n)) if len(reference) >= n else Counter() ) for ngram in counts: max_counts[ngram] = max(max_counts.get(ngram, 0), reference_counts[ngram]) # Assigns the intersection between hypothesis and references' counts. clipped_counts = { ngram: min(count, max_counts[ngram]) for ngram, count in counts.items() }
请问我是否存在理解偏差,或是这种计算n-gram precision的方式是正确的?
你的理解存在偏差,这种基于集合去重的计算方式不符合BLEU分数的标准n-gram精度逻辑。
BLEU的n-gram精度核心是统计n-gram的出现次数,而非仅判断n-gram是否存在:
- 假设句中某个n-gram重复出现多次时,不能直接去重,需要考虑参考句中该n-gram的最大出现次数(即代码里的
max_counts),然后对假设句的次数做“截断”(取假设句次数和参考句最大次数的最小值,也就是clipped_counts) - 最终的n-gram精度是所有clipped_counts的总和,除以假设句中所有n-gram的总出现次数,而不是集合交集大小除以假设句集合的元素数量。
举个直观的例子:
- 假设句:
I love love love you,2-gram总出现次数为4,集合去重后仅3个 - 参考句1:
I love you,2-gram各元素出现次数为(I,love):1、(love,you):1 - 参考句2:
I love love you,2-gram各元素出现次数为(I,love):1、(love,love):1、(love,you):1
按照你的集合思路,交集是3个,除以3得1.0;但按照BLEU的标准逻辑:max_counts中各2-gram的最大次数是(I,love):1、(love,love):1、(love,you):1clipped_counts总和是1+1+1=3,除以假设句总次数4,得到0.75,这才是正确的n-gram精度。
再看你贴的NLTK代码:
counts是统计假设句中每个n-gram的出现次数(不是集合)max_counts是遍历所有参考句,取每个n-gram在参考句中的最大出现次数clipped_counts是对假设句的每个n-gram次数做截断,取和参考句最大次数的最小值
这些逻辑都是基于次数统计,而非集合去重,所以你的思路和标准BLEU逻辑不符。
内容的提问来源于stack exchange,提问作者Yuirike
相关产品推荐
相关产品推荐

