天天看點

【NLG】(一)文本生成評價名額——BLEU原理及代碼示例

關于名額:

評價算法的效果,給模型效果進行量化,這樣可以跟有同樣功能的模型比較好壞。是以名額在定義的時候,也跟模型的解決的問題有關系。比如分類模型,評估模型效果時,會看其準招率;推薦模型會看auc、NDCG等名額,每個名額有自己的優缺點,想使用該名額,也得接受它不足的地方。

當然,你也可以自己定義名額的計算方式i,至于業界是否認,那就不好說了。

自然語言生成(Natural Language Generation,NLG),經常使用的無監督自評估方法如下(這裡隻展示一部分):

  1. bleu:比較真實評論和生成評論裡的n-gram的重合程度
  2. meteor:考慮了基于整個語料庫上的準确率和召回率而得出測度
  3. entropy:生成評論所包含的資訊量
  4. kl_divergence:生成評論與真實評論兩個分布之間的不同
  5. diversity:評價生成評論用詞的多樣性
  6. rouge:

1.BLEU原理

Bleu 全稱為 Bilingual Evaluation Understudy(雙語評估研究),意為雙語評估替換,是衡量一個有多個正确輸出結果的模型的精确度的評估名額。比較候選譯文和參考譯文裡的 n-gram 的重合程度。多用于翻譯品質評估。

可以說是所有評價名額的鼻祖,它的核心思想是比較候選譯文和參考譯文裡的 n-gram 的重合程度,重合程度越高就認為譯文品質越高。unigram用于衡量單詞翻譯的準确性,高階n-gram用于衡量句子翻譯的流暢性。 實踐中,通常是取N=1~4,然後對進行權重平均。

BLEU 需要計算譯文 1-gram,2-gram,...,N-gram 的精确率,一般 N 設定為 4 即可,公式中的 Pn 指 n-gram 的精确率。

【NLG】(一)文本生成評價名額——BLEU原理及代碼示例

其中,Wn 指 n-gram 的權重,一般設為均勻權重,即對于任意 n 都有 Wn = 1/N。BP 是懲罰因子,如果譯文的長度小于最短的參考譯文,則 BP 小于 1。lc機器翻譯的長度,lr最短的參考譯文的長度。

BLEU 的 1-gram 精确率表示譯文忠于原文的程度,而其他 n-gram 表示翻譯的流暢程度。不過BLEU對詞重複和短句有着非常不好的表現,是以改進的BLEU分别使用改進的多元精度(n-gram precision) 和短句懲罰因子進行了優化。

BLEU評分的範圍是從0到1。很少有翻譯得分為1,除非它們與參考翻譯完全相同。

考慮評估建議的響應和實際響應之間的字重疊量的度量.

2.優缺點

優點

  • 它的易于計算且速度快,特别是與人工翻譯模型的輸出對比,結果比較接近人類評分;
  • 它應用範圍廣泛,這可以讓你很輕松将模型與相同任務的基準作對比。

缺點

  • 它不考慮語義,句子結構,不考慮語言表達(文法)上的準确性;
  • 不能很好地處理形态豐富的語句(BLEU原文建議大家配備4條翻譯參考譯文),測評精度會受常用詞的幹擾;
  • BLEU 名額偏向于較短的翻譯結果(brevity penalty 沒有想象中那麼強),短譯句的測評精度有時會較高;
  • 沒有考慮同義詞或相似表達的情況,可能會導緻合理翻譯被否定;

BLEU本身就不追求百分之百的準确性,也不可能做到百分之百,它的目标隻是給出一個快且不差的自動評估解決方案。

3.如何算BLEU

查找了一些參考代碼,最後采用了一個最簡單的計算方法。

一 安裝nltk

pip install nltk
           

二 計算BLEU

手動計算的例子:

待續

資料形式:

這裡的輸入資料,要求按字分開。每個字作為一個字元串,一句話組成一個元素為str的list,作為輸入資料。

代碼demo:

通過weights參數來控制n-gram的值。

from nltk.translate.bleu_score import corpus_bleu, sentence_bleu
from nltk.translate.bleu_score import SmoothingFunction
smooth = SmoothingFunction()  # 定義平滑函數對象
labels = ['我', '是', '誰']
predicts = ['我', '是', '貓']
corpus_score_2 = corpus_bleu(labels, predicts, weights=(0.5, 0.5, 0, 0), smoothing_function=smooth.method1)
corpus_score_4 = corpus_bleu(labels, predicts, smoothing_function=smooth.method1)
           

源碼邏輯:

待續

參考:

1.評估名額的代碼:https://github.com/Maluuba/nlg-eval

2.BLEU:https://zhuanlan.zhihu.com/p/100942429

繼續閱讀