Last Updated on 2021-07-11 by Clay
BLEU 是一種評估文字相似度的演算法,經常用於評估『機器翻譯』與『人工翻譯』之間的相似度。最近由於有比對文句之間相似度與否的需求,故在他人推薦之夏稍微研究了一下 BLEU 的原理,同時試用了 NLTK 中提供的 BLEU 函式。
以下不會紀錄太複雜的數學,僅僅只是介紹 BLEU 以及該怎麼使用 NLTK 的工具。畢竟我一直相信著,能試著不重複造輪子的人才能真正有效率地開發程式 —— 即便自己從頭寫起感覺十分安心、十分有成就感。
N-gram
談到 BLEU,就不得不提及所謂的 "N-gram"。 N-gram 是一種語言模型,能夠將一句話的 N 個詞彙搭配組合起來來表達這個句子的特徵。N 則是一組特徵中所看見的詞彙數量。
這樣的解釋有點含糊,假設我們有以下這樣一個句子:
Today is a nice day.
那麼,所謂的 1-gram,就是以下的表達方式:
['Today', 'is', 'a', 'nice', 'day']
那麼,2-gram 則是:
[['Today', 'is'],
['is', 'a'],
['a', 'nice'],
['nice', 'day']]
依此類推。而這就是 N-gram 的表達方式。
BLEU 的使用方法
BLEU 的計算方法大致上為:
若有計算 BLEU 的需求時,推薦可以使用 NLTK 裡的工具。若是沒有 NLTK 套件,先使用以下指令安裝:
pip3 install nltk
以下是個最簡單的範例:
# coding: utf-8 from nltk.translate import bleu sent_a = 'Today is such a nice day'.split() sent_b = 'Today is such a good day'.split() print(bleu([sent_a], sent_b))
Output:
0.537284965911771
References
- https://www.researchgate.net/figure/Score-Calculation-Formula-in-BLEU-Here-m-is-number-of-words-from-the-candidate-that-are_fig1_224771080
- https://stackoverflow.com/questions/44324681/variation-in-bleu-score