人工無能の作り方
この文書はinajobが学生時代に書いたものです
2008年、大学大学院1年かな?
残念ながら文字コードの設定が正しくないようでブラウザから見ることが出来なかったので、ここにサルベージしました。
- 所属していたX680x0同好会の「会誌」のアーカイブから発掘、自分の記事以外も面白いものがたくさんあります。
人工無能とは?
人間っぽく話すプログラムのこと。会話を理解しているというよりは、なんかそれっぽいことを話すだけのものが多い。
今回は「日本語のようなものを話す人工無能」を作ってみたので、その簡単な仕組みと工夫した点について少し書いてみることにする。
動機
うちのサークルのメンバーがよく集まってるチャット。とてもマニアックな どうしようもない 会話が繰り広げられているわけだが、ちょっと物足りない。
そうだ! 萌キャラがいないじゃないか!
「ないなら作ればいいじゃない?」
材料
MeCab
形態素解析エンジン 難しいことは知らなくても問題ない。
「私は変な人ではない」
↓
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
変 名詞,形容動詞語幹,*,*,*,*,変,ヘン,ヘン
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
人 名詞,一般,*,*,*,*,人,ヒト,ヒト
で 助詞,格助詞,一般,*,*,*,で,デ,デ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
ない 形容詞,自立,*,*,形容詞・アウオ段,基本形,ない,ナイ,ナイ
こういうことをやってくれます。
日本語は英語と違って単語で区切るのも一苦労。でもMeCabがあれば安心!
Python
スクリプト言語の一種。他にPerlやRuby等もある。C言語に比べ様々な操作が簡単に記述できる。特に文字列操作に便利な機能が多くある。Pythonを選んだのはただの趣味。
仕組み
覚える
1.大量の会話文章を集めてくる。
2.全部をMeCabに通して形態素に分解する
3.形態素のつながり方を記録する
3.の手順は
僕→は→今日→ねむい
等という文章があったとき 「僕」の次は「は」 「は」の次は「今日」 ・・・のように数えていく。
こうして「形態素のつながり方データ」を作る
しゃべる
1.適当に一つ単語を選ぶ
2.その単語からなるべく多くつながっていた単語を一つ選んでつなげる
3.さっき選んだ単語を使って2を続ける
「僕」という単語を選んだとする。 先ほど記憶した形態素のつながり方データから「僕」につながっている単語の中で最も多いものを選ぶ。 「が」 という単語が選ばれたとする。
次は「が」につながっている単語の中で最も大きいものを探す。 「犯人」という単語が選ばれたとする。
以下同じように続けることで「日本語っぽい」文章を生成することが出来る。
僕→が→犯人→かも
この手法は、携帯電話の予測変換機能で、第一候補を選び続ける作業とほとんど同じである。
こうやって、作った人工無能は「覚える」の時に読み込ませる文章で、ずいぶんとしゃべり方が変わる。
そこで、すごく偏った文章を読ませることで性格をつけたり、あるキャラクターのように振舞うことが出来るのではないかと考えた。
キャラクタのセリフを大量に集めるために2chのなりきり板のログを利用することにした。
その際に様々な問題が発生し、その都度細かい改造を加えることで、よりそれらしい人工無能になるようにしていった。ここにその問題と解決策について示す。
おもしろそういえば
読み込ませた文章の中に「おもしろそう」「そういえば」という文句がいくらかあった。
その結果「おもしろそういえば」というなぞの言葉が生成されてしまった。
これを防ぐために一つ前の単語だけでなく二つ前の単語も調べることにした。
こなた病
一人称や、ひらがなの名前(たとえば「わっち」や「こなた」など)が文章に含まれると、MeCabがおかしな切り方をすることがある。
このような名前が入っている文章はMeCabでうまく解析できない。
こなたは俺の嫁
↓
こ 動詞,自立,*,*,カ変・クル,未然形,くる,コ,コ
な 助動詞,*,*,*,特殊・ナイ,ガル接続,ない,ナ,ナ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
俺 名詞,代名詞,一般,*,*,*,俺,オレ,オレ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
嫁 名詞,一般,*,*,*,*,嫁,ヨメ,ヨメ
おかげで
「こんなふうになた」
なたって・・・
また方言のような特殊なしゃべり方についても同様の問題が発生した。
ある程度は仕方がないが一応の対策として、共起度を求めてスコアリングすることにした。
利用したのは「同じ文章中に2つの単語が現れる頻度」。実際に人工無能が作った文に含まれる単語がもとの文中でも同じくらい使われていれば高い点数がつくようにし、いくつかの文を作り、得点の大きいものを選ぶようにした。
MeCabの辞書に手を入れるという作戦もあるが、新しいキャラクタを作るたびに辞書をいじるのはエレガントではないと判断した。
べっ別に、
ある単語から次々すすめていく方式だと、頭になにか特殊な言い回し(たとえば「べっ別に、」など)を付加することが難しかった。
そこである単語から後ろ向きにも同じ方式で文章を作ることにした
「別←に←ねむく→ない→って→ば」
今後の課題
まだまだ意味不明な発言が多いので、個別に対応していきたい。
また
- 返答エンジンを搭載する(今は返答できない ただしゃべるだけ)
- 呼応を学習し利用する。(もし~ならば など)
といった新しい機能も付け加えていきたい。