これは Hubot Advent Calendar 2014 の 5 日目の記事です。が、その流れにうまく乗れているのかいないのか。1週間ほど前に自分の書いた「Hubot ping の日本語化」に引き続き、Hubot を日本語で楽しく使おうという話です。Advent Calendar の前日(4日)の記事の最後のほうでも、メッセージを日本語化するとより親しみがわく(あるいは腹が立つ)というお話でしたね。
さてさて、存在確認(ping)以外にもう少し会話的なものを楽しみたいのですが、大量の質問と答を仕込むのは労力の割に楽しくなさそうだし、人口無能みたいなものを組み込むのはこちらの技量からして難しいし……と考えあぐねていたところに、docomo Developer support 提供のAPI「雑談対話」というものを見つけました。しかもちょうど開発用APIキー有効期間の制限が廃止され、特に本申請をせずともよくなりました。
「hubot-docomo-dialogue をつくった」を参考にしました。そこでは、すべての発言に反応するよう
... robot.hear /.*/, (res) -> ...
となっていました。しかし、これではまじめな話をしているところに割り込んできてうっとうしいので robot.respond
にしたいところです。さりとて、コマンドを日本語化したとしても
user> わぷー 雑談 今日は寒かったね。
というのも無粋というか興ざめです(「わぷー」というのは bot の名前です。hubot の起動時に bin/hubot --name wapuu --alias わぷー
として起動して、日本語名を与えています)。
“敬称”をコマンドに
ちょっと思案して、敬称の「さん」をコマンドにしてみました。
... robot.respond /さん(?:、)?\s*(.*)/, (res) -> ...
使用する時は、bot名とコマンドのあいだの空白は実はなくても大丈夫なので、
user> わぷーさん、今日は寒かったね。
と、ずいぶん自然な文体にすることができます。「わぷー」がbot名、「さん、」がコマンド、「今日は寒かったね。」が処理に渡されるパラメータと解釈されます。
Hubot のほかのちゃんとしたコマンドのときは呼び捨て、雑談したいときは「さん」付け、と使い分けることになります。
Wikipedia「敬称」にあるものを適当に詰め込み、読点をつけてもつけなくてもいい(ただし呼び捨てに読点を付けると雑談になる)ようにしました。
雑談対話 API
雑談対話 API には“会話の継続”というものがあります。いったん言葉(リクエスト)を投げかけ、返答に含まれる「コンテキストID」を次のリクエストにつければ継続的な対話になるというものです。この機能も組み込むことにしました。これでしりとりもできるようになりました(「わぷー、りんご」みたいにいちいち呼びかけなければなりませんが)。そして、2分あいだをあけると継続としないことにしました。
できた script は
です。
試してみましたが、しりとりは確かに上手にできます。しかし継続対話は期待ほどではなく、的外れなものになりがちでした。API の向こう側の対話能力は今後バージョンアップされるのでしょうか。
同様の docomo API 「知識Q&A」を利用するための docomo-knowledge.coffee も作ってみました。
こちらも試してみましたが、うーん、あんまり実用的な答は返ってきませんね。
user> わぷー教えて、ロスはいま何時? wapuu> ロサンゼルスの今の時刻は15時35分です。
がちょっと便利なくらいです。