文本生成:自动摘要评价指标 Rouge
本文結構概覽
- 不同的摘要任務下,選擇合適的Rouge指標
- Rouge-N的理解與示例
- Rouge-L的理解與示例
- 代碼示例(char粒度 計算摘要的Rouge值)
- 代碼示例(word粒度 計算摘要的Rouge值)
- 個人思考
- Reference
Rouge的全名是Recall-Oriented Understudy for Gisting Evaluation,單看名字就會發現Rouge是由召回率演變而來的指標,用于衡量模型生成摘要文本的質量。我們常說的Rouge其實是一組評價指標的統稱,包含Rouge-N, Rouge-L, Rouge-W, Rouge-S四個指標,它們的計算方式和適用場景有所不同。本文首先介紹了它們各自的適用場景和計算方式,并給出了簡潔可用的代碼示例,最后寫下了一點個人思考。
不同的摘要任務下,選擇合適的Rouge指標
- 單文檔摘要任務中,ROUGE-2, ROUGE-L, ROUGE-W, 以及ROUGE-S表現很好
- 在短摘要/標題式摘要任務中,ROUGE-1, ROUGE-L, ROUGE-W,
ROUGE-SU4, 以及ROUGE-SU9表現很棒 - 在多文檔摘要任務中,當停用詞被排除在匹配之外時,ROUGE-1, ROUGE-2, ROUGE-S4, ROUGE-S9, ROUGE-SU4, 以及ROUGE-SU9表現不錯
- 排除停用詞通常能改善相關性評估
- 使用多個reference(ideal 摘要)可以改善相關性評估。
Rouge-N的理解與示例
n-gram召回率,Co-Occurrence Statistics
rouge-n=pred與ideal的n-gram重疊數量ideal的n-gram數量\text{rouge-n}=\frac{\text{pred與ideal的n-gram重疊數量}}{\text{ideal的n-gram數量}}rouge-n=ideal的n-gram數量pred與ideal的n-gram重疊數量?
分母是ideal字符串的n-gram個數,因為Rouge更關心recall值。(而BLEU更關心precision值)
簡單地說,Rouge-n統計了pred和ideal兩個字符串的n-gram重疊單元的數量,并計算了重疊單元在ideal字符串中的占比,作為召回率。
以短摘要/title摘要任務為例:
ideal摘要:“武漢長江大橋”
pred摘要:“武漢市長江大橋”
| 1-gram | 武 / 漢 / 長 / 江 / 大/ 橋 武 / 漢 / 市 / 長 / 江 / 大/ 橋 | ideal:6 重疊:6 | Rouge-1=66=1\text{Rouge-1}=\frac{6}{6}=1Rouge-1=66?=1 |
| 2-gram | 武漢 / 漢長 / 長江 / 江大 / 大橋 武漢 / 漢市 / 市長 / 長江 / 江大 / 大橋 | ideal:5 重疊:4 | Rouge-2=45=0.8\text{Rouge-2}=\frac{4}{5}=0.8Rouge-2=54?=0.8 |
注:如有多個ideal摘要,怎么計算?
分別計算每個ideal摘要和pred摘要的Rouge值,并取其中最大值,作為當前pred摘要的Rouge值。
rouge-nmulti=argmaxi{rouge-n(ideali,pred)}\text{rouge-n}_{multi} = argmax_i \text{\{rouge-n}(ideal_i, pred)\} rouge-nmulti?=argmaxi?{rouge-n(ideali?,pred)}
Rouge-L的理解與示例
最長公共子序列,Longest Common Subsequence(LCS)
- LCS和最長公共子串不同,不要求連續,保序即可
- Rouge-N 只關注匹配單元的數量,像詞袋一樣,不關注詞序
- Rouge-L 關注詞序
Rlcs=lcs長度ideal字符串長度,Plcs=lcs長度pred字符串長度,Flcs=(1+β2)RlcsPlcsRlcs+β2PlcsR_{lcs} = \frac{lcs長度}{ideal字符串長度}, P_{lcs}=\frac{lcs長度}{pred字符串長度}, F_{lcs}=\frac{(1+\beta^2)R_{lcs}P_{lcs}}{R_{lcs}+\beta^2P_{lcs}}Rlcs?=ideal字符串長度lcs長度?,Plcs?=pred字符串長度lcs長度?,Flcs?=Rlcs?+β2Plcs?(1+β2)Rlcs?Plcs??
注:lcs經過了去重
以文檔摘要任務為例:
ideal摘要:“礦泉水和純凈水的所含物質不同”
pred摘要:“礦泉水含有豐富的礦物質元素,純凈水不含礦物質”
| 句子1 | ideal:礦泉水和純凈水的所含物質不同 pred:礦泉水含有豐富的礦物質元素 | 礦 泉 水 的 物 質 | |
| 句子2 | ideal:礦泉水和純凈水的所含物質不同 pred:純凈水不含礦物質 | 純 凈 水 含 物 質 | |
| 合并去重 | ideal長度: 14 pred長度: 21 | 礦 泉 水 純 凈 水 的 含 物 質 lcs長度:10 | Rlcs=1014=0.714R_{lcs}=\frac{10}{14}=0.714Rlcs?=1410?=0.714 Plcs=1021=0.476P_{lcs}=\frac{10}{21}=0.476Plcs?=2110?=0.476 |
代碼示例(char粒度 計算摘要的Rouge值)
from rouge import Rougepred = '武漢市長江大橋' ideal = '武漢長江大橋'# Rouge()按空格分隔gram,所以要在中文的字和字之間加上空格 pred, ideal = ' '.join(pred), ' '.join(ideal)# 計算字粒度的rouge-1、rouge-2、rouge-L rouge = Rouge() rouge_scores = rouge.get_scores(hyps=pred, refs=ideal)結果如下
>>> pred '武 漢 市 長 江 大 橋' >>> ideal '武 漢 長 江 大 橋' >>> rouge_scores [{'rouge-1': {'r': 1.0, 'p': 0.8571428571428571, 'f': 0.9230769181065088}, 'rouge-2': {'r': 0.8, 'p': 0.6666666666666666, 'f': 0.7272727223140496}, 'rouge-l': {'r': 1.0, 'p': 0.8571428571428571, 'f': 0.9230769181065088}}]代碼示例(word粒度 計算摘要的Rouge值)
from rouge import Rouge import jiebapred = '武漢市長江大橋' ideal = '武漢長江大橋'# 采用jieba分詞 pred = ' '.join(jieba.cut(pred, HMM=False)) ideal = ' '.join(jieba.cut(ideal, HMM=False))# 計算詞粒度的rouge-1、rouge-2、rouge-L rouge = Rouge() rouge_scores = rouge.get_scores(hyps=pred, refs=ideal)結果如下,
>>> pred '武漢市 長江大橋' >>> ideal '武漢長江大橋' >>> rouge_scores [{'rouge-1': {'r': 0.0, 'p': 0.0, 'f': 0.0}, 'rouge-2': {'r': 0.0, 'p': 0.0, 'f': 0.0}, 'rouge-l': {'r': 0.0, 'p': 0.0, 'f': 0.0}}]個人思考
word粒度的Rouge計算有兩個缺點:
- 受jieba分詞的影響,分詞錯誤就會評估錯誤。
- 降低了長詞的重要性,這樣一來,模型更傾向于擬合容易預測的短詞。
word粒度的Rouge也有明顯的優點:
- 更好地評估模型對專有名詞的擬合程度。
在蘇神的文章中,看到了一個結合了字粒度Rouge和詞粒度Rouge各自優點的方法,簡單來說,還是以詞為匹配單位,把詞的長度作為權重,為Rouge做一個加權即可。比如上文的“武漢長江大橋”,如果匹配對了,就給6分,而不是1分。這個方法需要自己實現Rouge計算函數。
Reference
- ROUGE: A Package for Automatic Evaluation of Summaries
- 科學空間 - SPACES:“抽取-生成”式長文本摘要(法研杯總結)
總結
以上是生活随笔為你收集整理的文本生成:自动摘要评价指标 Rouge的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带你认识Proxy
- 下一篇: ML binning