読者です 読者をやめる 読者になる 読者になる

らこらこブログ

唐揚げとアニメとプログラミングが大好きです

最後まで書いた後でとても実装する気が起きなくなった

自然言語処理

PCFGを使って形態素解析器の学習データを作る計画

ツイッターとかネット上のテキストとか、とてもじゃないけど手動でいちいち辞書追加してたら新しい単語についていけないので自動で学習させたい。品詞も自動で与えたい

kuromoji.jsで「艦これって何」の形態素解析の結果

f:id:laco0416:20150108211631p:plain

品詞列で言うと["名詞", "名詞", "助詞", "名詞"]になってる。CFGの文法はすでに完成してるという前提で、この場合適用すべき文法は

f:id:laco0416:20150108212220p:plain

  • NP => N P
  • S => NP N

の2つだけであるべきで、上の文章を無理やり受理しようとすると

  • N => N N

再帰的な文法が必要になる。構文解析の前処理として名詞の結合とかやってもいいけど名詞以外だとそうもいかん。「ごちうさ」を名詞にできない

f:id:laco0416:20150108212910p:plain

「ごちうさ」はこの品詞列だと文として成立しようがないので、CFG的には非受理になる。非受理になったCFGの計算過程で、「もしこの節の品詞が~~だったら」という仮定をガンガン回すとそのうち受理できるようになるはず

f:id:laco0416:20150108213822p:plain

「ごちうさ」から導かれて最終的に受理できそうなパターンはまあ無限にありそうだけど尤度高そうなのはこれ。

  • 赤の「ごちうさ」(一つの名詞)
  • 青の「ごちう」「さ」(形容詞+名詞接尾辞) 「明るさ」みたいな感じ
  • 緑の「ご」「ちうさ」(接頭辞+名詞) 丁寧語になるパターン

あとはこれを適当に確率振って、PCFGで教師データと合わせてやって確率再計算すればわりかしいい感じに行きそうなんだけど、「ごちうさ」が文章に混じってるときつそう。「今日はごちうさの日」は多分こんな感じで非受理になる。

f:id:laco0416:20150108214820p:plain

ここで、トップダウンで品詞推定していけると思う。S <= ◯ + □ の文法と確率を元に一段下に進む。多分 S <= NP + N とか S <= NP + V とか入ってくる。次にそのNPとかNとかを導く文法と確率を掛けていって、最終的に文法が見つからないノードが出てくるはず。それを新しい品詞として辞書に登録すればいけるんじゃねえかと思う。どうだろう

これを実行するにあたって必要なのが完全な文法リストで、それがまた問題である。手入力で文法作るのは実際網羅しきれないのである程度基本的なのを与えたあとは自動獲得させたい。多分学習のルーチンとしては

  1. 今ある語彙で教師コーパスを元に文法獲得
  2. 獲得した文法を元に適当なコーパスを元に新しい語彙獲得
  3. 新しい語彙で教師コーパスを元に文法獲得
  4. 以後ループ

になりそう。とても実装する気が起きない。