知识图到文本的生成——拾贰

2021SC@SDUSC

我们继续分析evaluate()函数的剩余的关键代码。

 final_scores = self.score(ref, hypo)

这里的final_scores保存的是最终的评价得分,根据上篇博客提到的三种评价方法。这里调用了score函数,它是Evaluate的类函数,代码如下:

    def score(self, ref, hypo):
        final_scores = {}
        for scorer, method in self.scorers:
            score, scores = scorer.compute_score(ref, hypo)
            if type(score) == list:
                for m, s in zip(method, score):
                    final_scores[m] = s
            else:
                final_scores[method] = score

        return final_scores

参数ref和hypo是两个集合,循环进行评价打分,调用compute_score函数,在三个评价方法里都有compute_score,让我们先看BLEU:

    def compute_score(self, gts, res):

        bleu_scorer = BleuScorer(n=self._n)
        for id in sorted(gts.keys()):
            hypo = res[id]
            ref = gts[id]
            assert(type(hypo) is list)
            assert(len(hypo) == 1)
            assert(type(ref) is list)
            assert(len(ref) >= 1)

            bleu_scorer += (hypo[0], ref)
        score, scores = bleu_scorer.compute_score(option='closest', verbose=0)
        return score, scores

BleuScorer是一个类,里面的参数和函数都很复杂,大体理解了下,就是对BLEU这个评价方法的实现,最终得到BLEUn。

对于一个待翻译句子,候选译文(也即机翻译文) 可以表示为Ci,对应的参考译文可以表示为Si={Si1, Si2, Si3, ……}(多组参考答案)。BLEU的计算方法如下:

知识图到文本的生成——拾贰_第1张图片

 参考博文:

机器翻译评价标准小总结 - 知乎

Rouge的compute_score函数代码如下:

    def compute_score(self, gts, res):
        score = []
        for id in sorted(gts.keys()):
            hypo = res[id]
            ref  = gts[id]

            score.append(self.calc_score(hypo, ref))
            assert(type(hypo) is list)
            assert(len(hypo) == 1)
            assert(type(ref) is list)
            assert(len(ref) > 0)

        average_score = np.mean(np.array(score))
        return 100*average_score, np.array(score)

最后返回的是百分比的。简单地来说,ROUGE-L主要计算的是最长公共子序列(LCS)的F-measure,下图就是ROUGE-L的计算方法。X,Y表示的是模型生成句子和参考译文。m,n分别表示它们的长度。当有多个参考译文时,挑选最高分数作为最终的评判分数。

知识图到文本的生成——拾贰_第2张图片

参考论文:[1]ROUGE: A Package for Automatic Evaluation of Summaries Chin-Yew Lin Information Sciences Institute University of Southern California 4676 Admiralty Way Marina del Rey, CA 90292 [email protected]https://aclanthology.org/W04-1013.pdficon-default.png?t=LA92https://aclanthology.org/W04-1013.pdf

 Meteor的compute_score代码如下:

    def compute_score(self, gts, res):
        imgIds = sorted(list(gts.keys()))
        scores = []

        eval_line = 'EVAL'
        self.lock.acquire()
        for i in imgIds:
            assert(len(res[i]) == 1)

            hypothesis_str = res[i][0].replace('|||', '').replace('  ', ' ')
            score_line = ' ||| '.join(('SCORE', ' ||| '.join(gts[i]), hypothesis_str))

            self.meteor_p.stdin.write(score_line + '\n')
            stat = self.meteor_p.stdout.readline().strip()
            eval_line += ' ||| {}'.format(stat)

        self.meteor_p.stdin.write(eval_line + '\n')

        for i in range(len(imgIds)):
            score = float(self.meteor_p.stdout.readline().strip())
            scores.append(score)

        final_score = 100*float(self.meteor_p.stdout.readline().strip())
        self.lock.release()

        return final_score, scores

这里主要是用meteor方法进行评分,涉及了很多Meteor类中的类函数,并非evaluate本身的关键代码,主要就是根据meteor方法完成的代码。我们在模型生成句子和参考答案句子中作出word-to-word的映射,映射准则有以下3种: 相同词映射、词干映射、同义词映射。

我们采取任意一个准则进行映射,但是要列出所有映射结果。如果“computer”这个词在模型生成的句子中出现1次,而在参考句子中出现两次,那么我们要连出2条线。在获得了所有的映射结果后,我们要挑选一组合法的映射结果,也即我们只允许一个词语最多有一根线相连(这个有一点像算法里的二分图匹配,求出最大匹配)。当有好几种方案最大匹配数都一样时,我们选取这个二分图中连线交叉数量最小的方案。METEOR是分阶段来建立映射关系的。默认的来说,分作3个阶段:第一阶段采用相同词映射(exact)来连线,第二阶段采用词干映射(porter stem),第三阶段采用同义词映射(WN synonymy)。后一阶段只针对前一阶段来进行映射补充,并不会修改前一阶段的映射决策。从这里的默认阶段顺序也可以看出,后一阶段的映射建立条件总是比前一阶段更加宽松。

参考论文:[2]METEOR: An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments Satanjeev Banerjee Alon Lavie Language Technologies Institute Language Technologies Institute Carnegie Mellon University Carnegie Mellon University Pittsburgh, PA 15213 Pittsburgh, PA 15213 [email protected] [email protected]

三类方法评价完之后,得到最终得分final_scores,就完成了对生成文本的评估。

你可能感兴趣的:(逻辑回归,算法,机器学习)