ツイッター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・・・
つづく・・・