今人工無能botである機械化らこ( @la0c )を稼働している。
現在はコーパスをlaco0416のタイムラインのツイートから得て、形態素解析を行った後にトライグラムのテーブルに保存して、
文章生成はマルコフ連鎖によって行っている。マルコフ連鎖を選んだのは実装が楽でわかりやすいからだったけども、マルコフ連鎖では形態素の情報(品詞など)が失われ、単なる表現文字列の前後関係だけで生成されるため、生成される文全体の構文が破綻する場合がほとんど。
これはせっかく形態素解析したのに勿体無いということで、構文解析のアルゴリズムを取り入れて、日本語として構文がまともな(とりあえずは簡単のために、まともな日本語=文脈自由文法で解釈できるという定義にしておく)文章を生成できるようにしようと思い立った。
というわけで自然言語処理の沼に足を踏み入れようとしているわけだけど、最初に検討したのがまず文脈自由文法と、Tree-Adjoining Grammar(TAG)の2つ。今のところ、前者のほうを選ぶつもりなんだけどもなんでそう思い立ったのかを備忘録代わりに思考過程をメモっておく
文脈自由文法の自分の中での解釈は、文はチョムスキー標準形によって書き換えられるという前提のもとで、文を非終端記号の二分木に分解し、末端の非終端記号にそれぞれの終端記号が対応しているという感じ 間違っていそう。文脈自由文法で受理できる文はチョムスキー標準形で表現できるし、チョムスキー標準形で表現できるならばそれは文脈自由文法で受理できるんだと思う。
TAGは、自分の中では文脈自由文法を拡張してある感じ。文をいくつかの細分化された構文木に分解して、構文木と構文木で接合していくんだと思う。Wikipediaを読むと、TAGではチョムスキー標準形から外れた文も解釈できるらしいんだけど、そもそも自然言語の中でチョムスキー標準形から外れる場合というのが特定の言語の特定の用法だけだったりするらしくてほぼ自然言語はチョムスキー標準形が適用できるらしい。つまり、日本語に限定すればTAGはちょっとオーバースペックで、文脈自由文法だけでほぼ全て解釈できるんじゃないかと思ったのが、文脈自由文法を採用しようと思った理由。
で、実際どうするんだとというところで、今は実装方法を考えているところ。botの学習的には
という形になると思われる。んで、文章の生成はトップダウン型になって、文全体から見て大きなくくりからランダムに、あるいは確率的に文の構造を選択して、細分化していき、最終的に品詞に対応した文字列をこれまたランダムあるいは確率的に選択して完成になると思う
具体的には
文→(主語)+(述語)→(名詞句)+(助詞)+(述語)→(名詞|代名詞)+(助詞)+(述語)→(名詞|代名詞)+(助詞)+(名詞句)+(述語動詞)
→(名詞|代名詞)+(助詞)+(名詞)+(助詞)+(述語動詞)→私+は+あずにゃん+が+好き→「私はあずにゃんが好き」
ができるんじゃないかと思っている。出来るんだろうか。
自然言語処理のこと考えるの楽しすぎて自然言語処理になりたい
アドバイスとか間違いの指摘とかここ見たら理解深まるよとかそういうのお願いします
[追記]
構文の生起確率(出現頻度の比から求めるつもり)を考慮しないといけない
終端記号への置き換え時にトライグラム情報から前後のつながりのもっともらしさを評価して置換可能にしたほうがいい