人工無脳と一言で言っても様々なものが過去開発されています。今回は「ログ型」と呼ばれる人工無脳「Reudy(ロイディ)」を試してみることにします。

人工無能 ロイディ

先日試してみた「傾聴型」人工無脳「Eliza(イライザ)」は1966年に作られましたが、そこから時代の推移を経て2003年にロイディは誕生しました。

製作者は当時、東京工業大学ロボット技術研究会に所属していた市川 宙さんです。人間同士のチャットのやり取りから文章を自動生成します。

このプログラムすごいなあと思うのは独自のアルゴリズムを元に単語解析を独自にプログラムに埋め込んでいるところです。

そこから抽出した単語を自動的に記録し、文章を生成していきます。ログ次第で返答が大きく変化するので育てる楽しさもある訳です。

( 参照:RubyKaigi2006Reudy.pdf

人工無能 Reudy (ロイディ) 1.9

10年以上前のものなのですが、現在でも利用できるよう改変したものが公開されています。mmasakiさんが大学生の頃作られたものがGitHubで公開されています。

mmasaki/Reudy19

こちらは最新版Rubyでも動かすことが出来ます。また、上記の様に独自で単語抽出している部分をオプションを利用することで形態素解析エンジン「mecab」を利用することが出来るようになっています。

使ってみる

Rubyで書かれているということで(全然分からない)難しそうだなと思っていたのですが、以下のブログ記事で導入を公開されているので、それに沿ってダウンロードしていけばhubotで利用することが出来ました。

口下手なチームメイトを1日で教育した話 - Qiita

こちらの記事内では「mecab」の辞書を直近の単語に対応させるため「はてなキーワード」と「Wikipedia日本語版」から単語抽出する方法も解説されています。

これによってロイディの覚える単語がより正確になります。こんな感じです。

1
2
3
4
5
6
7
8
9
10
11
$ mecab
そして父になる
そして 接続詞,*,*,*,*,*,そして,ソシテ,ソシテ
父 名詞,一般,*,*,*,*,父,チチ,チチ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なる 動詞,自立,*,*,五段・ラ行,基本形,なる,ナル,ナル
EOS
妖怪ウォッチ
妖怪 名詞,一般,*,*,*,*,妖怪,ヨウカイ,ヨーカイ
ウォッチ 名詞,一般,*,*,*,*,*
EOS

デフォルトの辞書だと通常の形態素に分類されてしまいますが、

1
2
3
4
5
6
7
$ mecab -u custom.dic
そして父になる
そして父になる 名詞,一般,*,*,*,*,そして父になる,*,*,wikipedia
EOS
妖怪ウォッチ
妖怪ウォッチ 名詞,一般,*,*,*,*,妖怪ウォッチ,*,*,wikipedia
EOS

オプションのカスタム辞書を利用することで作品タイトルが名詞として解析されます。

こちらの導入チュートリアルはlinux環境でhubotアダプターはHipChatを利用されています。今回はMac環境でアダプターはSlackを利用します。

ほぼそのままダウンロードやサンプルプログラムを利用させて頂けば導入出来るのですが、パスがちょっと違ったりするのでそこだけ注釈として残しておきます。

「mecab」の辞書生成インデックスはこちら

/usr/local/libexec/mecab/mecab-dict-index

「mecab」のデフォルト辞書「ipadic」はこちら

/usr/local/lib/mecab/dic/ipadic

「Reudy19」でカスタム辞書を使う際のパス(ここでは「Work」フォルダに設置しています)

/Users/ユーザー名/Work/Reudy19/mecab-dict/custom.dic

「hubot」のパス

/Users/ユーザー名/Work/reudy-hubot


その他ちょっとした注意点ですが、Mac環境で利用する際に必要なパッケージソフトなど列挙しておきます。

Homebrew-OS X 用パッケージマネージャー

mecabをクローンする際に必要になります。

Xcode-開発: Apple

mecabをRubyで利用する際に「gcc-c++」というC++言語をコンパイルするソフトが必要になるみたいです(ごめんなさい良く分かっていません)Macで利用する際は開発ツール「Xcode」をダウンロードすると使えるみたいです。

[Mac] nkf を Homebrew でインストール

Wikipedia、はてなキーワードをダウンロードする際にエラーが出ないよう必要になります。

設置が完了すれば、「Reudy19」のディレクトリでコマンドを実行すればこの様に返信されるはずです。

1
2
3
4
5
$ ruby -W0 stdio_reudy.rb -m
妖怪ウォッチばっかり見ないんだよ。
(単語「妖怪ウォッチ」を記憶した。)
(単語「ばっかり」を記憶した。)
こんにちは

ロイディにキーワードが登録されました。

Hubot・Slackで利用する

HubotをSlackで利用する詳細は省きます。hubot scriptに以下のように記述し、Hubotと同じディレクトリに設置したReudyをコマンドで実行します。

node.jsのchild_process.exec コマンドを利用します。

1
2
3
4
5
6
7
8
9
10
child_process = require('child_process')
module.exports = (robot) ->
robot.respond /(.*)/i, (msg) ->
text = msg.message.text.replace(/\n/g, "")
dirpath = '../Reudy19/'
cmd = "bash -c 'echo #{text} | ( cd \"#{dirpath}\"; ruby -W0 stdio_reudy.rb -m)'"
child_process.exec cmd, (error, stdout, stderr) ->
msg.reply(stdout)
return

こんな感じで投稿された文章をロイディに渡し、ロイディからの戻り値をslackに投稿します。


(単語「XX」を記憶した。) の表示を消すには、

Reudy19/lib/reudy/reudy.rb

528行目

1
@client.outputInfo("単語「#{wordStr}」を記憶した。")

をコメントアウトしてください。

まだ大した返事はしませんが。

public/log.yml にログが格納されているのが分かります。

まとめ

「ログ型」の人工無脳の面白さは、無脳の会話を学習させられるところだと思います。

通常だとTwitterなどのSNSで学習させるのだと思いますが、他に何か方法がありそうな気もするので色々試してみたいですね。