其他分享
首页 > 其他分享> > 如何从使用 nltk 计算 BLEU 转到 使用CocoEval 计算 BLUE、Cider、Meter、Rough、Spice、

如何从使用 nltk 计算 BLEU 转到 使用CocoEval 计算 BLUE、Cider、Meter、Rough、Spice、

作者:互联网

  仅对于Cider计算而言,nltk对输入的要求同Coco是不同的。

  前者仅要求输入的 reference 长度等于 hypotheses,并且要求 reference 为一维 List,要求 hypotheses 是二维 List。

  Coco则不同,他要求输入的 reference 长度等于 hypotheses,并且二者都是字典形式,对应的 reference = { “序号” , [ “文本” ] },hypotheses = { “序号” , [ “文本1”, “文本2” ···] }

  所以需要将模型得出的结果转为真正的字符串,这时候需要用到之前总结出的 wordmap。具体代码如下:

  对于 nltk 而言

            allcaps = allcaps[sort_ind]  # 每次 model 得出结果对应的参考值 hypotheses 
            #对应的一些处理 并存到总的 reference 中
            for j in range(allcaps.shape[0]):
                img_caps = allcaps[j].tolist()
                img_captions = list(
                    map(lambda c: [w for w in c if w not in {word_map['<start>'], word_map['<pad>']}],
                        img_caps))  # remove <start> and pads
                references.append(img_captions)

            # Hypotheses
            # 每次 model 得出的结果 reference 并进行处理
            _, preds = torch.max(scores_copy, dim=2)
            preds = preds.tolist()
            temp_preds = list()
            for j, p in enumerate(preds):
                temp_preds.append(preds[j][:decode_lengths[j]])  # remove pads
            preds = temp_preds
            hypotheses.extend(preds)
            assert len(references) == len(hypotheses)

  之后即可进行 nltk 的 BLEU 计算

from nltk.translate.bleu_score import corpus_bleu        
# Calculate BLEU-4 scores
bleu4 = corpus_bleu(references, hypotheses)

紧跟着,我们只需对此时的 reference 和 hypotheses 做少量处理 即可直接使用 Coco 计算

     # Load word map (word2ix) 读取 word map
        with open(args.word_map, 'r') as j:
             word_map = json.load(j)
        rev_word_map = {v: k for k, v in word_map.items()}  # ix2word
        
        hyp_list = hypotheses
        ref_list = references
        
        hyps = {}
        refs = {}        
        
        for iidx, hypid in enumerate(hyp_list):
            words = [rev_word_map[ind] for ind in hypid]
            temp = ''
            wordlist = []
            for word in words:
                if word != '<end>' and word != '<unk>':
                    temp += word + ' '
            wordlist.append(temp)
            hyps[str(iidx)] = wordlist
        
        for iidx, refid in enumerate(ref_list):
            wordlist = []     
            for ref in refid:
                temp = ''
                words = [rev_word_map[ind] for ind in ref]
                for word in words:
                    if word != '<end>' and word != '<unk>':
                        temp += word + ' '
                wordlist.append(temp)
            refs[str(iidx)] = wordlist
        tem_cider = cider(refs, hyps)
        tem_bleu  = bleu(refs, hyps)
        tem_rouge = rouge(refs, hyps)
        tem_spice = spice(refs, hyps)
        meteor(refs, hyps)

参考资料:

https://github.com/wangleihitcs/CaptionMetrics

https://blog.csdn.net/xiyou__/article/details/121494013

无用的资料:

https://github.com/Maluuba/nlg-eval

标签:BLEU,BLUE,word,reference,temp,map,Cider,hypotheses,preds
来源: https://www.cnblogs.com/bigcoding/p/16141197.html