Поиск по сайту:

Как рассчитать BLEU Score в Python?


Оценка Bleu в Python — это метрика, которая измеряет качество моделей машинного перевода. Хотя изначально он был разработан только для моделей перевода, теперь он используется и для других приложений обработки естественного языка.

Оценка BLEU сравнивает предложение с одним или несколькими эталонными предложениями и показывает, насколько хорошо предложение-кандидат соответствует списку эталонных предложений. Он дает выходной балл от 0 до 1.

Оценка BLEU, равная 1, означает, что предложение-кандидат полностью соответствует одному из эталонных предложений.

Эта оценка является общей метрикой для моделей с субтитрами к изображениям.

В этом руководстве мы будем использовать функцию  sentence_bleu() из библиотеки nltk. Давайте начнем.

Вычисление оценки Bleu в Python

Чтобы рассчитать оценку Bleu, нам нужно предоставить ссылку и предложения-кандидаты в виде токенов.

В этом разделе мы узнаем, как это сделать и вычислить балл. Начнем с импорта необходимых модулей.

from nltk.translate.bleu_score import sentence_bleu

Теперь мы можем ввести эталонные предложения в виде списка. Нам также нужно создать токены из предложений, прежде чем передавать их в функцию Offering_bleu().

1. Введите и разделите предложения

Предложения в нашем справочном списке:

    'this is a dog'
    'it is dog
    'dog it is'
    'a dog, it is'

Мы можем разделить их на токены, используя функцию разделения.

reference = [
    'this is a dog'.split(),
    'it is dog'.split(),
    'dog it is'.split(),
    'a dog, it is'.split() 
]
print(reference)

Выход :

[['this', 'is', 'a', 'dog'], ['it', 'is', 'dog'], ['dog', 'it', 'is'], ['a', 'dog,', 'it', 'is']]

Вот так предложения выглядят в виде токенов. Теперь мы можем вызвать функцию offer_bleu() для подсчета очков.

2. Рассчитайте оценку BLEU в Python

Для расчета оценки используйте следующие строки кода:

candidate = 'it is dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate)))

Выход :

BLEU score -> 1.0

Мы получаем высшую оценку 1, так как предложение-кандидат принадлежит эталонному набору. Давайте попробуем другой.

candidate = 'it is a dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate)))

Выход :

BLEU score -> 0.8408964152537145

У нас есть предложение в нашем эталонном наборе, но оно не является точным совпадением. Вот почему мы получаем 0,84 балла.

3. Полный код для реализации BLEU Score в Python

Вот полный код из этого раздела.

from nltk.translate.bleu_score import sentence_bleu
reference = [
    'this is a dog'.split(),
    'it is dog'.split(),
    'dog it is'.split(),
    'a dog, it is'.split() 
]
candidate = 'it is dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate )))

candidate = 'it is a dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate)))

4. Расчет n-граммового показателя

При сопоставлении предложений вы можете выбрать количество слов, которые вы хотите, чтобы модель сопоставляла одновременно. Например, вы можете выбрать слова, которые будут сопоставляться по одному (1 грамм). Кроме того, вы также можете выбрать соответствие слов парам (2 грамма) или тройкам (3 грамма).

В этом разделе мы узнаем, как рассчитать эти оценки n-грамм.

В функцию предложения_bleu() вы можете передать аргумент с весами, соответствующими отдельным граммам.

Например, для индивидуального расчета количества граммов можно использовать следующие веса.

Individual 1-gram: (1, 0, 0, 0)
Individual 2-gram: (0, 1, 0, 0). 
Individual 3-gram: (1, 0, 1, 0). 
Individual 4-gram: (0, 0, 0, 1). 

Код Python для того же приведен ниже:

from nltk.translate.bleu_score import sentence_bleu
reference = [
    'this is a dog'.split(),
    'it is dog'.split(),
    'dog it is'.split(),
    'a dog, it is'.split() 
]
candidate = 'it is a dog'.split()

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: 0.500000
Individual 4-gram: 1.000000

По умолчанию функция предложения_bleu() вычисляет совокупный 4-граммовый балл BLEU, также называемый BLEU-4. Веса для BLEU-4 следующие:

(0.25, 0.25, 0.25, 0.25)

Давайте посмотрим код BLEU-4:

score = sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25))
print(score)

Выход :

0.8408964152537145

Это точная оценка, которую мы получили без добавления n-граммовых весов.

Заключение

Это руководство было посвящено вычислению оценки BLEU в Python. Мы узнали, что это такое и как рассчитать индивидуальные и кумулятивные оценки n-грамм Bleu. Надеюсь, вам было интересно учиться вместе с нами!