文章生成
N-gramモデルをベースにする
想定されるデータモデル(「今日は雨です」)
{ w1: "今日", w2: "は", w3: "雨" }, { w1: "は", w2: "雨", w3: "です" }
確率の推定
w3がw2, w1から生起する確率
「w1,w2,w3と並んだ回数」と「w1,w2と並んだ数」の比により、「w1,w2の次にw3が来る確率」が推定できる。
N-gramモデルの利点
- 学習データ中に存在する連結しか発生しないので、文の精度がある程度保証される
- 実装が楽
欠点
ループは文字列長、もしくは連結回数でぶった切らないとツイートできなくなるので、なるべくループ発生確率減らしたい。
ゼロ頻度問題はスムージングで補正しないといけないけど、精度の高いスムージングしようとすると計算量が結構大きくなって、botの応答には使いにくい。かと言って加算スムージングだとあまりにも雑なので加減が難しい。線形補間が落とし所かなあと思ってる。
改善案としてのN-POSモデル
POS(品詞)のN-gramを使い、生成された品詞列に後から表層型を適用する
想定されるデータモデル(「今日は雨です」)
N-POS用
{ pos1: "名詞,副詞可能,*,*,*,*", pos2: "助詞,係助詞,*,*,*,*", pos3: "名詞,一般,*,*,*,*" }, { pos1: "助詞,係助詞,*,*,*,*", pos2: "名詞,一般,*,*,*,*" pos3: "助動詞,*,*,*,特殊・デス,基本形" }
単語生起用
{ pos: "名詞,副詞可能,*,*,*,*", word: "今日" }
確率の推定
\(pos_3\)が\(pos_2\), \(pos_1\)から生起する確率
「\(pos_1,pos_2,pos_3\)と並んだ出現回数」と「\(pos_1,pos_2\)と並んだ出現回数」の比により、「\(pos_1,pos_2\)の次に\(pos_3\)が来る確率」が推定できる。
\(pos_3\)が\(w_3\)になる確率
「\(pos_3\)である\(w_3\)の出現回数」と「\(pos_3\)の出現回数」の比により、「\(pos_3\)が\(w3である確率」が推定できる
\(pos_2,pos_1\)から\(w_3\)が生起する確率
利点
- 実装の手間はN-gramと対して変わらない
- 品詞情報により特に助詞や動詞の生起確率の精度がぐんと増すはず
- 品詞の種類は単語に比べると圧倒的に少ないので確率の計算量が少ない
- 学習データに存在しない単語列を生み出すことができる
- 多分だけど、ループ発生率低い
欠点
- 品詞の取得に失敗すると文の精度が悪くなる
- データモデルから表層型が失われ、文脈情報が完全に消える
2つを線形補間したらいいんじゃないか
- まずN-POSモデルで、学習データ中から、生起確率の高い単語の上位3位くらいを選出する。
- 次に、その上位候補にN-gramモデルでの生起確率を線形補間する。
- 最終的に最尤判定する
式にするとw1(pos1), w2(pos2)からw3が生起する確率\( P(w_3|w_2,w_1) \)は
は補正係数で、どれくらいN-gramで補正するか与えなきゃいけない
この方法だと
- N-POSモデルによって構文的な精度が上がる
- N-gramモデルによって文脈的な精度が上がる
- 実装が楽
N-gramのゼロ頻度問題もだいぶスムージングされそうな雰囲気感じてるけどどうだろうか。大きな欠点とかなければいいが・・・