ジャストシステムの人工無能バトル(ハッカソン)に挑戦したつぼ(2015/12/12,13)
皆様こんにちはつぼ.
今回ハッカソンに参加することで初めてbotを作ってきたつぼ.これが,まるで,子どもが生まれたみたいで不思議な気持ちなのであった.そのうち自分一人でもbotを作って育てたい.参加してやったこと・学んだこと,botの紹介,感想を書く(カチカチ).
twitterのチャットbotを作った
私たちのが作ったbotはこのポテトちゃん(イモ) twitter.com
ちなみに一定量会話をすると,いろいろなポイントがたまって画像がver2, ver3に変化し,それに合わせて語尾や性格も替えているのでver2, ve3に進化するのが楽しみだったりする. ちなみにキャラは10個用意されていて,チーム毎に選択した. 私たちのチームは,つぼ→カスタネット→カスタネットがついたお姉さん
0段階目:つぼ(全チーム共通)
1段階目:カスタネット(謎)
2段階目:カスタネットがついたお姉さん二人(最高)
世話好きで,オノマトペっぽいことをよく使う設定になってます.
名前の由来
実はbot完成時点で名前が決まっておらず,どうしようか考えていたところで,bot本人に聞いてみたらいいのでは?ということで本人にリプライで名前を聞いたところ,「ほにゃらららら〜〜ポテト」と自分で名乗ったのでポテトちゃんにしました.自分の名前を自分で決めるあたりは優秀(なお,それ以後自分のことはポテトだと言わない).
ハッカソンで用意されていたもの
チームサーバ
- tweet4000k行
- 確か1行1単語で,品詞体系はJMATのものっぽい
- rubyのサンプルコード
- これを叩けばとりあえず何かでる
NLPサーバ
Markov連鎖生成
- キーワードを入力とし,キーワードを中心としたマルコフ連鎖によって生成した文を出力する
- キーワードが無い場合は,BOS(開始記号)から自動で何か生成する
- モデル学習済み
形態素列書き換え器
- ルールを用意することで,入力したものの一部を書き換えて出力する
- ルールは基本的には自分で書く
シナリオ検出器
- 自分でルールを用意することで,あるキーワードを入力で受け取ったときにそれにマッチした文を出力する
- ルールは基本的には自分で書く
tweet DB
- あるキーワードを入力にすると,それとマッチしたtweetを出力する
- 同義語検索が自動で行われていたっぽいのですごい
というわけで,ここまで読んだ方は気付いたかも知れないが,状況が全てが理解できれば,初めの時点で何か文が出力できるところまで用意されていた.いろいろエラーもあったが,かなりすごい(こなみ).これをうまく使って楽しいハッカソンがはじまったのである.
うちのチームがやったこと
まずハッカソンの長さだが,オープニングイベントもいろいろ盛りだくさんで,実質作業時間は1日(9時間)+3時間程度で,1日目の夜には飲み会も入っており,非常に短かかった. なので一日目(16:00~19:00)はチームで役割を決めて,現状の使えるもの確認や,とりあえずbotで出力が出せるように整備をしたり,rubyのサンプルコードをpythonに書き直して終わった.
二日目(9:30~18:30)は,辞書・規則生成班と,コード書く班に分かれて作業を行った. 辞書・規則生成班は,ひたすらキャラに合わせた出力を作り続け,他にはリプライ以外にも定期的につぶやくtweetなども全部準備してくれた. うちの班は5人だったが,実質3人はこの辞書・規則生成班.これは,規則さえ書いてしまえばある程度良い出力が出せる,というのがパン田一郎たちの話である程度わかっていたので,悪くなかった.(結局ここ次第でかなりよくなるのであった.) 残りの2人でコードを書いていたのだが,私はword2vec,深層学習を採用する係で,残りの一人がその他全てを担う優秀な仲間だった.
私がやったこと
結論から言うと,形態素解析器に惑わされて,時間のロスがかなり多かった.はじめはmecab(IPA)で形態素解析をしてword2vecを学習したのだが,今回はジャストシステム独自の形態素解析器(JMAT?)があらかじめ導入されていたので,システム側の形態素解析は全部それで行われていた.はじめはMeCabで学習してもJMATで学習してもどうせ名詞,動詞あたりは同じ分かち書きだろうし,問題ないと甘く見ていた.だが実際にword2vecの意味表現が必要になるときは,入力となるtweetにまともにターゲットになりそうな単語がない場合であった.もしキーワードっぽい単語がある場合は,もともとあるtweetのDBからある程度の出力が返ってくるので,入力文内に未知語・少数語のみ,もしくは内容語がない場合にword2vecが欲しくなってくるのであった.そうなってくると,ちょっとした語尾とかの形態素解析の違いでベクトル表現が得られないのはかなりマイナスなように感じ,JMATで単語分割をしてword2vecを学習することを決意.
他にもちょくちょくやることはあり,この時点でお昼.
午後になりNLPサーバに入っているJMATに文を投げ始めて,衝撃を受けたのが,1秒で5~10文くらいしか返ってこないことであった.この状況で残り数時間でJMAT形式でword2vecを学習するのは諦め,かつ,サーバとwindowsを使ってる人も半分いた関係で,mecabも使わないことを決めた...なので,学習したのと対話のデータ集合はmecabの分かち書きだが,クエリとして新しく入ってくる文はJMATで単語分割するかたちになった.その結果,分割の違いのせいで(?)word2vecなのにあんまり似てない文もくるときがあるような,ちょっと心残りのある感じになってしまった.他にもなんだかんだやっているうちに,2日目の5時になり,本番環境に移すことになった. ここからのほうが個人的には問題だった気がするが,サーバにgccをうまく入れることができず,gensimを入れることができなかった.6時半過ぎには強制撤退となり,dev環境では動いていたword2vecのモデルが,test環境ではまだ動いていないという感じで2日目を終了した(涙). もうすでにチャットbotは動いていて,こちらではコードを替えることができないので,本当にただの他力本願にはなるのだが,メンターの石原さんがgensimを入れて,コメントアウトした5行くらいを解放してくれることを祈るだけである.
という感じで2日間はあっという間に終わり,始まる前はディープラーニング実装してやるぜ〜〜〜とか言ってたわりにディープのデの字の来ないまま終わりを迎えた(笑)
感想
出力のあるようなNLPの応用分野は,やはりかなり面白く,生成ともなると一日中試しながら遊んでいられそうだった.今回の人工無能バトル(チャットbotバトル)はある程度ベースが作られている分,各チームのやることがだいたい一緒になるのでは?とも思ったのだが,時間が短いおかげで,それぞれ一番実装したかった点が実装され,チームの特徴が出たのかもしれない.おみくじを作ったり,言語モデルで利ランキングをしたり,word2vecを使ったり,クイズを出したりと,それぞれチームの特徴が出たように思う. その点で言うと私たちのチームの特徴は,天気予報をしてくれるのと(test環境にはない)word2vecだと言える. 天気予報は全ての分岐に入る前に「天気」の文字列と一致したら天気を出力するので,「脳天気ですね」などと言っても天気を教えてくれる優れものになっている.
チームメンバーについて触れると,みんな優しくいい雰囲気だったため,楽しんでハッカソンができた.今回は規則を書くのもかなり重要で,役割分担が少し難しかったが,間違えなくみんなで作りあげたチャットbotである.1/15にはこれについの評価としてジャストシステムで勉強会が行われるので,またみんなに会えるのが楽しみである.ちなみに評価は,どれだけリプライをもらえたか,どれだけ単語を引き出せたか,なので,是非みな様ポテトちゃんと話してください.(土下座)
個人的な感想としては,いろいろとまだ実装したさはあったので,暇が出来たら自分でもチャットbotを作ってディープに話させたい.後は言語処理以外の実装の勉強もある程度していきたい.