PythonでBLEUスコアの計算やN-gramの実装方法を解説する

スポンサーリンク

今回は、PythonでのBLEUスコアの実装に焦点を当てます。

では、さっそく始めましょう

こちらもご覧ください。

スポンサーリンク

BLEUスコアとは?

機械学習モデリング、深層学習、自然言語処理の分野では、文字列入力に対して構築されたモデルを評価できる、特定のエラーメトリクスが必要です。

BLEUスコアは、機械翻訳モデルやシステムの効率を推定することができるそのようなメトリックの1つです。

今日、これは自然言語処理モデルやアプリケーションで広く使用されています。

BLEUスコアは、候補文と参照文を比較し、候補文が参照文にどの程度なじんでいるかを評価します。

このようにして、それぞれ0〜1の範囲で点数をつける。

PythonによるBLEUスコアの計算

BLEUスコアを実装するために、sentence_bleu()関数からなるNLTKモジュールを使用します。

この関数では、参照文と候補文を渡すことができる。

そして、候補文を参照文と照合します。

完全に一致した場合はBLEUスコアとして1が返される。

全く一致しない場合は0を返す。

部分一致の場合、BLUEスコアは0から1の間になる。

BLEU スコアの導入

以下の例では

  1. NLTKライブラリとsentence_bleuサブモジュールをインポートしています。
  2. さらに、参照文のリストを生成し、オブジェクトref.を介してそれらを指し示す。
    1. テスト文を作成し、sentence_bleu()を用いてref.に対するテスト文を作成します。
  3. その結果、近似的に1という出力が得られる。
    1. 次に、test01文を作成し、関数に渡す。
    1. この文は、参照文の一部である月光を構成しているが、参照文と完全に一致するわけではないので、0に近い近似値を返す。
from nltk.translate.bleu_score import sentence_bleu
ref = [
    'this is moonlight'.split(),
    'Look, this is moonlight'.split(),
    'moonlight it is'.split()
]
test = 'it is moonlight'.split()
print('BLEU score for test-> {}'.format(sentence_bleu(ref, test)))
 
test01 = 'it is cat and moonlight'.split()
print('BLEU score for test01-> {}'.format(sentence_bleu(ref, test01)))

結果は以下の通りです。

BLEU score for test-> 1.491668146240062e-154
BLEU score for test01-> 9.283142785759642e-155

PythonでN-gramスコアを実装する

上で見たように、デフォルトでは、sentence_bleu()関数は参照文の中から1つの単語を検索して一致させる。

参照文に対して検索する単語を複数キューに入れることができる。

これはN-gramと呼ばれる。

  • 1-gramの場合 1-gram:1つの単語
  • 2-gram:単語のペア
  • 3-gram:3つ組の単語、など

N-gramを実装するために、sentence_bleu()関数に以下のパラメータを渡すことができる。

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

例えば、以下の様になります。

以下の例では、後述の参考文refを用いて、候補文test01の2-gram BLEUスコアを、2-gramスコア用の重み(0,1,0,0)を渡して、sentence_bleu()関数で計算しています。

from nltk.translate.bleu_score import sentence_bleu
ref = [
    'this is moonlight'.split(),
    'Look, this is moonlight'.split(),
    'moonlight it is'.split()
]
test01 = 'it is cat and moonlight'.split()
print('2-gram:' sentence_bleu(ref, test01, weights=(0, 1, 0, 0)))

を結果を出力すると、以下の様になります。

2-gram: 0.25

まとめ

ここまでで、このトピックは終了です。

何か疑問があれば、お気軽にコメントください。

Pythonプログラミングに関連するこのような記事のために、私たちと一緒にご期待ください。

ではでは、Happy learning!

タイトルとURLをコピーしました