跳至主要内容

BLEU

什麼是 BLEU

BLEU (Bilingual Evaluation Understudy) 是一種常用於機器翻譯系統的評估方法,用來衡量生成的翻譯文本與參考翻譯文本之間的相似程度。它是一種自動化的評估指標,能夠快速給出翻譯質量的評分。

BLEU 的基本概念

  • N-gram: BLEU 評分基於 n-gram(n 元語法)。n-gram 是由文本中連續 n 個單詞組成的子序列。例如,"the cat is on the mat" 的 1-gram 有 ["the", "cat", "is", "on", "the", "mat"],而 2-gram 有 ["the cat", "cat is", "is on", "on the", "the mat"]。
  • 精確度: 精確度是指生成的翻譯中有多少 n-gram 出現在參考翻譯中。舉個例子,如果生成翻譯的 2-gram 有 50% 出現在參考翻譯中,那麼 2-gram 精確度就是 50%。
  • 平滑處理: 為了避免一些極端情況,例如沒有任何匹配的 n-gram 導致精確度為 0,BLEU 使用了一些平滑技術來處理這種情況。
  • brevity penalty (BP): 為了避免生成過短的翻譯,BLEU 引入了簡短懲罰。如果生成翻譯的長度比參考翻譯短很多,會受到懲罰。

N-gram

在使用 BLEU 分數時,選擇使用 1-gram 或 2-gram 甚至更高的 n-gram 取決於你的應用場景和你希望評估的翻譯質量的細緻程度。

1-gram(Unigram)

使用 1-gram 評估翻譯主要關注的是單詞級別的匹配。這種方法簡單且計算量小,適合於以下情況:

  • 初步評估翻譯質量。
  • 翻譯生成的句子較短。
  • 只關注基本詞彙的正確性,而不考慮詞序和上下文。

2-gram(Bigram)及更高的 n-gram

使用更高的 n-gram 評估翻譯會考慮詞序和短語的正確性,能夠更準確地反映翻譯的流暢度和上下文的正確性。適合於以下情況:

  • 需要更精確地評估翻譯質量。
  • 翻譯生成的句子較長。
  • 需要考慮上下文和詞序。
  • 翻譯質量要求較高。
# n-gram individual BLEU
from nltk.translate.bleu_score import sentence_bleu
reference = [['this', 'is', 'a', 'test']]
candidate = ['this', 'is', 'a', 'test']
print('Individual 1-gram: %f' % sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)))
print('Individual 2-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 1, 0, 0)))
print('Individual 3-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 1, 0)))
print('Individual 4-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 0, 1)))

Cumulative BLEU

累積 BLEU 分數則是綜合考慮多個不同 n-gram(例如,1-gram 到 4-gram)的精確度,並將這些精確度的幾何平均作為最終分數。這種方法能夠更全面地評估翻譯質量,既考慮了單詞級別的精確度,也考慮了短語級別的連貫性。

# cumulative BLEU scores
from nltk.translate.bleu_score import sentence_bleu
reference = [['this', 'is', 'small', 'test']]
candidate = ['this', 'is', 'a', 'test']

# weights 表示 1-gram 到 4-gram 的權重分數
# (1,1,0,0) 表示 1-gram 分數佔 50%, 2-gram 分數佔 50%,3-gram 佔 0%,4-gram 佔 0%,以此類推
print('Cumulative 1-gram: %f' % sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)))
print('Cumulative 2-gram: %f' % sentence_bleu(reference, candidate, weights=(0.5, 0.5, 0, 0)))
print('Cumulative 3-gram: %f' % sentence_bleu(reference, candidate, weights=(0.33, 0.33, 0.33, 0)))
print('Cumulative 4-gram: %f' % sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25)))

N-gram 和 Cumulative BLEU 比較

特性N-gram BLEU累積 BLEU
優點- 簡單且計算量小
- 容易理解和實現
- 綜合考慮多個 n-gram 的精確度
- 更全面地反映翻譯質量
- 使用平滑技術處理零精確度
缺點- 只關注特定 n-gram 的精確度
- 忽略其他 n-gram 的貢獻
- 計算複雜度較高
- 對重複出現的詞彙懲罰不足
- 忽視語義和語法
情境- 初步評估翻譯質量
- 翻譯生成句子較短
- 關注基本詞彙的正確性
- 綜合評估整體翻譯質量
- 對比不同翻譯系統的性能
- 更高的翻譯質量要求

什麼是平滑函數

當我們在計算 BLEU 分數時,有時會遇到某個 n-gram 完全不存在於生成的翻譯中,這會導致其對應的精確度為 0。由於 BLEU 分數計算公式中使用了對數,任何一個 為 0 都會使整個 BLEU 分數變為 0,這對於實際評估來說是不合理的。為了解決這個問題,我們使用了平滑函數(Smoothing Function)。

平滑函數的基本概念

平滑函數的目的是在計算 n-gram 精確度時,避免出現零精確度的情況。它會給那些原本為 0 的 n-gram 精確度賦予一個小的非零值,從而使得整個 BLEU 分數更加穩定和可靠。

常見的平滑方法

以下是幾種常見的平滑方法:

  1. Add-one Smoothing(加一平滑):在計算 n-gram 的時候,給每個 n-gram 出現次數加一,這樣即使某個 n-gram 沒有出現,其計數也不會為零。
  2. Lin's Smoothing(林氏平滑):這是一種更複雜的平滑方法,專門針對 BLEU 分數進行設計,能夠根據 n-gram 的頻率動態調整平滑參數。
  3. Method 1 平滑:NLTK 庫中的 `SmoothingFunction().method1 是一種簡單而有效的平滑方法,適合於大多數情況。

參考資料