arcanum_jp’s blog

おっさんの日記

Twitter botが作りたい。(人工無能/IF THEN ルール)

 ツイッターBOTを運用していると、BOTなのに話しかけてくる人がいる。「BOTですよぉ」って匂わせても話しかけてくる。多分分かっているんだろうなぁと思いつつ、BOT人工無能化をたくらむ。単にメンションに反応すればいいだけだし。それまでもメンションに含まれる「おはよう」だの「おやすみ」だのには反応していたのでそれを強化する形だ。そこで人工無能について調査してみた。(Webを見るといまさら〜な感のする日付が出てくる。)

種類

 大きく分けて3つぐらいに分かれる

ランダム

 発言内容に関わらず、ランダムな言葉を返答として返す。

IF THENルール

 発言の中に含まれる特定のキーワードを探し、そのキーワードに対応する文を返答として返す。たとえば、ツイート内に「こんにちは」ときたら「こんにちは、元気です」「ヨーグルトですか?」と来たら「いえ、ケフィアです」と返答するとか。古!

テンプレート

 過去の発言から似たような発言(返答)を探し、その返答に今回の発言のキーとなる言葉を当てはめたものを返す。

 この「似たような発言」が曲者で、日本語の文章をどうやって似たようなものか判断するんやねん!ってなるが、文章と文章から抜き出された各々の「名詞」「動詞」「形容詞」が70%以上同じものとか、文の構造「動詞+助詞+...」が同じものを探すという意味。

マルコフ連鎖

 複数の文から助詞の切れ目でつなげていき新しい文章を作る。例文は少なければ少ないほどいいらしい。不思議〜

今回はIF THENルールを作る。

 今までメンションに反応していたIF THENが5つぐらいだったから、延々と100でも1000でもプログラムを変更していけばいい・・・簡単だ・・・タンポポを乗せるより簡単だ!そうして僕は遠くを見つめる。多くの人工無能の作者がしているように、これは検索ワードと返答文章の2つを持ったファイル(データベース)として表現可能。例えば、<<メンションテーブル>>

検索ワード 返答
おはよう おはようさぎ
こんばんは こんばんわに
arcanum_jp   :よう、@tomiyabot_mk2 こんばんは
tomiyabot_mk2:こんばんわに @arcanum_jp よう、こんばんは


 単一の検索ワードに対し、複数の返答の中からランダムに返すパターンもこのように表現可能。同じ検索ワードの返答リストを作り、そこからランダムに返す。基本的には返す文の種類が複数だろうが1つだろうが、このロジックで表現可能。

検索ワード 返答
おはよう おはようさぎ
おはよう もうこんな時間だ!
こんばんは こんばんわに
arcanum_jp   :@tomiyabot_mk2 おはよう
tomiyabot_mk2:おはようさぎ
arcanum_jp   :@tomiyabot_mk2 おはよう
tomiyabot_mk2:もうこんな時間だ!


 検索ワードは単純な単語ではなくて、正規表現にしておくと良いらしい。例えば下記のようにしておけば「おはよう」でも「おっは」でもおはようの挨拶と判断できる。

検索ワード 返答
.*(おはよう|おっは).* おはようさぎ
.*(こんばんは|おばんでがす).* こんばんわに

 今までは単一のキーワードに対して、返答が固定の文章の場合だったが、返答が可変(例えば返答に話しかけてきた人の名前を入れるとか)になる場合はどうするか。JavaScriptなら返答の文字列にコードを書いてeval( )を使えばできそうだ。でもJavaにはそんな素敵で便利な機能は無い。うーん・・・と悩んでいるときに天の声が聞こえた。Groovy・・・

 つづく・・・