BLEU
101 BLEU score trong Xử lý văn bản

Giả sử bạn đang trong một tình huống: bạn là một phiên dịch viên thử việc, bạn được giao cho công việc dịch một danh sách các câu từ tiếng Anh sang tiếng Việt. Dịch xong xuôi bạn nộp cho sếp, đến tối về nhà bạn nhận được mail của anh sếp, anh bảo bạn có thể ở nhà từ mai rồi. Bạn buồn, bạn chán, bạn thất vọng, bạn không biết tại sao mình bị cho nghỉ, bạn cũng thắc mắc là anh ấy “chấm” bài của bạn kiểu gì ? Có thể anh ấy đã dùng BLEU đó.

Giới thiệu

BLEU là viết tắt của Bilingual Evaluation Understudy.

BLEU thường được sử dụng trong bài toàn dịch máy (Machine Translation) như một độ đo hay một hệ số điểm khi so sánh một bản dịch (candidate translation) với một hay nhiều bản dịch tham khảo (reference translation). Mặc dù vậy, BLEU cũng có thể được sử dụng để đánh giá cho các bài toán sinh văn bản (text generation) như:

Nói một cách nôm na thì bạn cần chấm điểm một câu, biết trước một câu mẫu thì bạn dùng BLEU. BLEU có giá trị trong khoảng . tức là perfect match, đúng hoàn toàn, còn tức là perfect mismatch, bạn không đúng tí nào cả.

Các ưu điểm của BLEU có thể kể đến là:

Phương pháp tính

Cách tính của BLEU cũng khá đơn giản. Phương pháp đếm số matching n-grams của candidate và reference (hoặc match trên bất kỳ reference nào nếu như có nhiều reference), kết quả sẽ là số match chia cho số từ của candidate. Các match này không phụ thuộc vào vị trí, do vậy BLEU không sử dụng word order. Càng match nhiều tức là càng tốt.

Tuy nhiên, nếu chỉ đếm số từ match thông thường sẽ nảy sinh ra việc một từ match với reference nhưng được lặp lại nhiều lần trong candidate (gọi là overgenerate “resonable” words trong paper BLEU: a Method for Automatic Evaluation of Machine Translation).

# overgenerated example
reference = 'this is an example'
candidiate = 'this this this this'

Do đó, khi đếm matching n-grams cần chú ý cả số lần xuất hiện của từ trong reference, một từ trong reference khi được match rồi thì không nên match nữa.

BLEU còn được dùng để đánh giá một corpus (tập hợp của các sentence, hay một đoạn văn) khá là tốt. Đầu tiên là tính số match với từng câu. Cộng các số này rồi chia cho tổng số n-gram từ các câu là ra modified precision score cho test corpus

Không có gì là hoàn hảo nên cũng không có bản dịch hoàn hảo. Điểm của người dịch cũng không phải lúc nào cũng là . Điểm BLEU phụ thuộc vào số lượng cũng như chất lượng của của các reference, đây cũng là những yếu tố có thể gây ra khó khăn cho việc tính điểm trên dataset.

Tính BLEU với NLTK

Python Natural Language Toolkit library (NLTK) cung cấp cho bạn một số hàm để tính toán BLEU bao gồm cả sentence và corpus

# two references for one sentence
from nltk.translate.bleu_score import sentence_bleu
reference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']]
candidate = ['this', 'is', 'a', 'test']
score = sentence_bleu(reference, candidate)
print(score) # output: 1.0

# two references for the 1st sentence and one reference for the 2nd sentence
from nltk.translate.bleu_score import corpus_bleu
references = [[['this', 'is', 'a', 'test'], ['this', 'is' 'test']], [['this', 'is', 'my', 'blog']]]
candidates = [['this', 'is', 'a', 'test'], ['this', 'is', 'my', 'house']]
score = corpus_bleu(references, candidates)
print(score) # output: 0.7231269021297695

Cumulative and Individual BLEU

NLTK cho phép bạn có thể đặt các trọng số (weights) khác nhau cho các n-grams khác nhau để tính điểm BLEU cuối cùng. Dựa và trọng số này ta chia ra cumulative và individual BLEU.

# 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)))
# Individual 1-gram: 1.000000
# Individual 2-gram: 1.000000
# Individual 3-gram: 1.000000
# Individual 4-gram: 1.000000

weights là 1 tuple thể hiện trọng số tương ứng với từng i-gram score ở vị trí i-th.

Thông thường, trong các bài báo nghiên cứu, để so sánh các kiến trúc khác nhau trên một benchmark dataset, cumulative BLEU-1, BLUE-2, BLEU-3, BLEU-4 được sử dụng với các weight như sau:

# cumulative BLEU scores
from nltk.translate.bleu_score import sentence_bleu
reference = [['this', 'is', 'small', 'test']]
candidate = ['this', 'is', 'a', 'test']
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)))
# Cumulative 1-gram: 0.750000
# Cumulative 2-gram: 0.500000
# Cumulative 3-gram: 0.632878
# Cumulative 4-gram: 0.707107

Bạn có thể đọc thêm paper BLEU: a Method for Automatic Evaluation of Machine Translation, Work examples trong bài gốc để hiểu rõ hơn về BLEU.

References

A Gentle Introduction to Calculating the BLEU Score for Text in Python

BLEU - Wikipedia

BLEU: a Method for Automatic Evaluation of Machine Translation

*****
Written by Trung Nghia Nguyen on 16 February 2019