1. ホーム
  2. nlp

[解決済み] Stupid Backoffの実装の明確化

2022-02-05 22:34:47

質問

こんにちは。 バカなバックオフ (2ページ目、式5)の平滑化手法を担当しているプロジェクトで、その実装について質問させてください。これはNLPで使用される平滑化アルゴリズムで、Good-Turingは最もよく知られた類似のアルゴリズムだと思います。

アルゴリズムを簡単に説明すると ある文に単語が出現する確率を求める場合、まずn-gramレベルでその単語の文脈を探し、そのサイズのn-gramがない場合は(n-1)-gramに再帰してそのスコアに0.4を乗算します。この再帰は1-gramで停止する。

つまり、"a sunny day"の文脈における"day"の確率を求める場合、まずトライグラムの"a sunny day"がコーパスに存在するかを調べ、存在しなければビッググラムの "sunny day" で試して、最後に "day" をコーパスサイズ(学習データ中の単語総数)で割って頻度を得れば良いのである。

私の疑問は N-gramのサイズを小さくするたびに、スコアに0.4を乗算すればよいのでしょうか?

つまり、上記の例では、tri-gramやbi-gramを見つけることができなかった場合、最終的なスコアは次のようになります。

0.4 * 0.4 * 頻度(日) / corpus_size?

それとも、最終段階で一度だけ掛けて、バックオフの回数に関係なく、最終スコアに0.4を掛けるだけで良いのでしょうか?

解答方法を教えてください。

基本的には、上の数学で説明されているように、式5を読みます。

つまり、インスタンスが観測されなかった "a sunny day" について、S("day" | "a sunny") を計算することになります。 また、""a sunny day" "という三文型が見つからない場合は、式5のケース2を取り、S("day" "a sunny")をα * S("day" "sunny") と推定します。

もしまた、"sunny day"の観測がない場合、S("day" | "sunny") を alpha * S("day") と近似し、これは終止形 f("day") / N(観測した単グラムの数)であるとします。

αを0.4にすることで、上に書き出したとおりのものが得られます。

お役に立てれば幸いです。

-bms20