關于名額:
評價算法的效果,給模型效果進行量化,這樣可以跟有同樣功能的模型比較好壞。是以名額在定義的時候,也跟模型的解決的問題有關系。比如分類模型,評估模型效果時,會看其準招率;推薦模型會看auc、NDCG等名額,每個名額有自己的優缺點,想使用該名額,也得接受它不足的地方。
當然,你也可以自己定義名額的計算方式i,至于業界是否認,那就不好說了。
自然語言生成(Natural Language Generation,NLG),經常使用的無監督自評估方法如下(這裡隻展示一部分):
- bleu:比較真實評論和生成評論裡的n-gram的重合程度
- meteor:考慮了基于整個語料庫上的準确率和召回率而得出測度
- entropy:生成評論所包含的資訊量
- kl_divergence:生成評論與真實評論兩個分布之間的不同
- diversity:評價生成評論用詞的多樣性
- 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 的精确率。
其中,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