だいぶ間が空いてしまいましたが、メカウーサー誕生秘話その2です。
今回は特にメカウーサーの実装についてお話したいと思います。
メカウーサーのエンジンはいわゆる「マルコフ遷移」を使ったタイプのエンジンです。
他にも保存している発言の名詞、動詞などを入れ替える方式がありますが、あえてメカウーサーではマルコフ遷移のエンジンにこだわっています。
初めてマルコフ遷移という言葉を聞いた方に、簡単にその原理を説明します。
ある単語「例:メカウーサー」とその次の単語「例:は」(助詞とします)の間には、共に共起しやすい(一緒に出やすい)2単語もあれば、逆に一緒には出にくい2単語の場合もあります。
そこでメカウーサーコーパス(うーさーさんが用意してくださった、1MBに及ぶ言語資料)から、すべての単語について、その次に出やすい単語の集合を求めます。このとき1回でも一緒に出現した2単語の間には「接続可能性」があるとして、これをPythonのハッシュ内に納めておきます。
{ u'メカウーサー': {u'は', u'の', u'には', ...}}
そして、前件(前の単語)でハッシュを引くと、次にくる単語の集合が得られるようにしておきます。
文章生成のときは、まず、文頭の単語の全集合から任意の単語を抽出し、その単語でハッシュを引いて、次の単語候補を選びます。
次の単語候補の集合が得られたら、その中からランダムに次の単語を選びます。
これを、「。」が来るまで繰り返します。これが初期のメカウーサーのエンジンの仕様です。
実際には一番出やすい単語をスコアを付けて保存するのですが、メカウーサーの初期のバージョンではあえて、接続するもの全てを許して、やや口語っぽい表現も出やすくしていました。また、最近のバージョンではPythonのdictをcPickleしたものを文章生成時に取り出していましたが、昔はBerkeley DBへのバインディングを使ってKey-Value pairのデータベースファイルにアクセスしていました。
実際のメカウーサーでは前件を2単語、後件を1単語からなる「単語トライグラム(trigram)」を使って文章生成を行っていました。また、文長の制御や句読点の密度を調整する関数を使って、丁度よいあんばいになるように、文章の加工を行って出力していました。
ここまでがVer.3.14と呼ばれているバージョンの主な実装になります。
コーパスの文章を単語に分割するのはMeCabと呼ばれる処理系を使いました。実装はPythonで行いました。最終的に python twitterと呼ばれるライブラリでtwitterにポストしていました。
CS4では係り受けの結果を利用しました。具体的には前件、後件に単語ではなく文節をあてて、文章生成を行いました。結果3.14のときよりもさらに日本語らしい文章の生成に成功しました。
より日本語らしい文章になったというコメントをいただいたCS5は、実は単語分割した表層(文字面)しか使っていません。しかしあれだけの精度の高い文章が生成可能です。実はとあるライブラリを使って文章生成を行っています。これはいまのところ、秘密です☆
共起のしやすさも考慮しています。
なお現在ではtwitterへのポストをtweepyと呼ばれるOAuth投稿可能なライブラリに変更しています。
実際の運用はMac Miniで行っています。少し古いですが、Hudsonで投稿の成功/失敗を管理しています。現在4つのタスクがHudsonには登録されていて、その内二つはkimrin専用の「寝坊したらBossにメールするw」アプリが、また残り二つのうち一つがメカウーサーで、もう一つは秘密のメカウーサー試験用アカウントへの投稿を行っています。
以上こんな感じになります。ではちゃお〜(文責:kimrin)