マルコフモデルを使った人工無能の作り方

2014/12/13 追記
このブログで参考にしていた絶版本の復刻版が出たようです。

追記ここまで

先日、チャットボットを作りました。

「恋するプログラム」という本を参考にしたのですが、この本、既に絶版になっていて、Amazonのマーケットプレイスではなんと定価の3倍以上の値段で売られています!

うーん、これだと手が出ない、けど内容知りたい、、という方のためにクラス図を描きました。本書には設計図がかかれてなかったので、持ってる人も確認する意味での役には立つかも知れませんし、Rubyは書けないよ!という方の参考にもなるかと思います。


本書で紹介している人工無能の最終形はこんな感じです。

Nobyというのが人工無能のキャラクター、Unmoが人工知能のメインクラスです。Emotionは感情のモデル、Responderが返答内容を作るクラスで、DictionaryやMorph、Guguluなどを参照しています。

これをシンプルに表すとこんな感じ。

以下、本書でどのように実装されているかを簡単に説明していきます。

感情

ここでは「機嫌」という一元で感情をモデル化しています。感情値はアルゴリズムにパラメータとして渡されます。

辞書

アルゴリズムで参照されます。また、ユーザーからのインプットを元に学習します。

アルゴリズム

WhatResponder

inputに「って何?」を付加しただけの返答を返します。

RondomResponder

定型文を返します。

PatternResponder

あるキーワードがあれば、それに対応した文を返します。
 一つのキーワードに対して複数の文章を保持します。

TemplateResponder

「○○は××です」というようなテンプレートを持ち、名詞を当てはめていきます。

MarkovResponder

単語のつながりを基にした「マルコフモデル」をもとに、文章を組み合わせて新たに作り出します。
マルコフモデルについては下で。

GoogleResponder

ユーザのインプットからキーワードを抜き出し、そのキーワードでGoogle検索をかけ、ヒットしたページから文章を抜き出し、マルコフモデルで文章を生成して返します。

マルコフモデルの実装

本書では形態素解析された2単語をプレフィックスとしてモデル化

私 は コード を 書き まし た

は以下のようにモデル化されます。

★私 は → コード
は コード → を
コード を → 書き
を 書き → まし
書き まし → た
まし た → END

 別の文章で

コード を 切っ て ください

というのがあった場合、

★私 は → コード
は コード → を
★コード を → 書き、 切っ
を 書き → まし
書き まし → た
まし た → END
を 切っ → て
切っ て → ください
て ください → END

★が付いてるのが文章のスタートポイントです。
最初に「私 は」を選んだとすると、次は「コード」。「は コード」で「を」「コード を」で「書き」か「切っ」のどちらかとなります。「切っ」の方が選ばれたとすると「を 切っ」で「て」、「切っ て」で「ください」、「て ください」でENDとなり、

私はコードを切ってください

となります。上の例は無理やり当てはめた感じですが、組み合わせが増えると意外な文章ができてなかなか面白くなりますよ!

課題

本書の最後に、今後の課題として以下があげられています

  • GuguleResponderのマルチスレッド化

現状ではキーワードで検索して、ウェブから文章を取ってきて、マルコフモデル化するまで待たされてしまいます。

  • 辞書の設計

辞書はテキストファイルとMarshalダンプしたファイルを使っています。MarshalされたものはRuby以外では扱えないのでメンテナンスツールが必要です。また、ファイルでの保存には限界があるのでDBを使ったほうがいいでしょう

  • 会話の質を高める

以下のような方法で、会話の質をより高めることができるかもしれません

    • 文脈という概念を取り入れる
    • キーワードAとBは関連する、といった情報を辞書に盛り込む
    • ネットからニュース、天気など様々な情報を取ってくる
  • 様々なインターフェースで

本書ではスタンドアローンの会話ボットを紹介していましたが、チャット、掲示板、ブログなど様々なものに応用可能です。そういう意味ではこれはその一例ですね。

最後に、本書の紹介です。最初に書いたとおり、絶版ですが、、、

復刻版!