マルコフ連鎖モデルで台詞生成するプログラム

昔から、会話できる人工知能プログラムを作ってみたいと思っていました。しかし、当然ながらそれはとてもハードルが高く、実現可能なレベルへのダウンサイジングを続けた結果、学習させた情報からマルコフ連鎖モデルに基いて文章を生成する、という内容でした。

実際に作ったものは下記です。自分が作って楽しいもの、ということで、アイカツ!を題材にしました。

学習させる際の形態素解析の機能は、さすがに自前で用意できないので、mecabを使います。その他に必要となるスクリプトは、勉強を兼ねてPythonを選びました。Perl、PHP、Rubyはこれまで趣味プロで使ったことがあったので、新しいものを触ってみたかったのです。Pythonは2.0系と3.0系がかなり別物ですが、今から始めるならと思い、3.0系にしています。データベースは、データをファイル単位で管理できる方が規模的にも都合が良かったので、Sqlite3にしました。

  • mecab
  • Python3.0
  • sqlite3

いざ作ってみると、最初は慣れないPythonなので、言語仕様上のミスに悩まされます。それが落ち着いてくると、今度は設計上の問題点が見えてきたりしました。基本的な思想はマルコフ連鎖モデルですが、実装レベルに落とすと細かい問題も出てくるので、色々細かい調整を入れています。

そしてコンソールスクリプトとしては、ほぼ完成したので、Webサーバ経由で公開できるように、cgiとして動かしてみました。すると新たな問題が発生。文字コード絡みで特に悩まされました。コンソール環境では自動的に上手く解決されていた部分が、Webサーバ経由だと問題として顕在化するようです。Python内ではUnicode型で扱ったり、外部との入出力時にはエンコード及びデコード指定が必要だったり。特にmecabを起動する際に外部プロセスにforkして、そこでマルチバイト文字列を渡すのですが、これがWebサーバ経由だと上手くいきません。UnicodeEncodeErrorになってしまいます。未だに原因が分かっていません。この機能はコンソール限定することで、回避しました。

他にも細かいバグ修正をして、プログラムとしては、想定通りに出来上がりました。この後に出てくるのは、運用上の問題。まずmecabで形態素解析する際に、固有名詞の辞書登録が不十分であったため、期待外の単位で分割されることがあります。他には、単純マルコフ連鎖であるため、生成した文章のつながりが明らかに不自然なケースが目立つことです。N階マルコフ連鎖にする必要があったかもしれません。本来は設計を改善すべきですが、そこまでの気力はないので、運用カバーしています。

何だかんだでちまちまと、1年くらい掛けて、ようやく形になったので、少し感慨深いですね。仕事のようなペースでやれば、1周間も掛からない内容ですけど。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする