tubone

tubone

Boyaki makes a new world


 Recent posts  6 / 52

SepOctNovDecJanオムロン HV-F312で腰の痛みをなくすGithub Actionを使って、簡単CIを作ってみるChromeDriverがGoogleChrome v76 に対応していないらしい。Googleデータポータルを触ってみるHyper-vにMetasploitableの仮想マシンを立ててみるNightwatch.jsでE2Eテストを回したときにうまく動かないたった一つの理由particles.jsをVue.jsで使ってかっこいいページを作るGitPitchを使ってMarkdownからプレゼンテーションを作ってBadgeをレポジトリに貼るSentryを使ってフロントエンドのエラーを確認するJSON Resume + API With GitHubを使って、さくっと職務経歴書チックなもののAPIなど作ってみるGitHubに30日間草を生やし続けた感想Netlify Formを使って、簡易Contact Formを作ってみる10/1は天下一品の日Ansible + Serverspecを使ってMacの環境構築を自動でする (Ansible編)Ansible + Serverspecを使ってMacの環境構築を自動でする (Serverspec編)今日のラーメン台風の時の我が家のセンサー(netatmo)の値をZabbixで見る究極の謝罪はSlackのスタンプを活用しよう! ~明日から使えるSlackスタンプスニペット集~ハロウィーンはえちえちでチンパンジーなイベントじゃない。GitHubと向き合うイベントだ昔ながらのラーメンたべたい珠玉の一杯。たくさん残業した日はこのラーメンを食べろ!スープの衝撃!ここまでうまいスープはあるのか!?なラーメンGitHubに草を生やし続け90日が経ったので感想を書くGoでAWS Lambdaを動かして、GitHubAPIv4(GraphQL)を叩いてみた感想Hadoopゾウさんについて本気出して考えてみたNuxt.jsでparticles-bg-vueを使うNuxt.jsのmodulesをCompositionAPIで使ってみる(@nuxtjs/toast編)くろおびらーめん with チャーシュー飯Nuxt.jsのmodulesをCompositionAPIで使ってみる(@nuxtjs/toast Global Option編)Nuxt.js + Composition APIでVuexのStateをReactiveに使う方法【初学者】Juliaを使って円周率を求める初めてプログラミングをした時のゴミソース見つけた面倒なことはPythonにやらせよう@GitHub API v4を使ったリリース実績取得Gatsby.jsで作ったブログに読み終わるまで○○分を追加した話Google広告設定でみる属性情報であなたをもっと知ろう!Blog用に新しいLogo作った話今年1年を振り返ってGoのEchoでJaegerを使ってボトルネックを調査するGatsby.jsで作ったBlogの投稿をGitHubの草にして表示させるWeb Developer Roadmap 2020を眺めながら今年の目標(Frontend)をだらだら考えるの会AWS X-RayでLambdaのトレースをしつつ、Datadog APMに連携するMonWedFri
AWS X-RayでLambdaのトレースをしつつ、Datadog APMに連携するWeb Developer Roadmap 2020を眺めながら今年の目標(Frontend)をだらだら考えるの会Gatsby.jsで作ったBlogの投稿をGitHubの草にして表示させるGoのEchoでJaegerを使ってボトルネックを調査する今年1年を振り返ってBlog用に新しいLogo作った話


 SearchBox

Search your interesting by Algolia in this blog.


 All 143 Tags

ぼやき 19JavaScript 12GitHub 7ラーメン 6Vue.js 6TypeScript 6デブ活 5Nuxt.js 4React 3Gatsby.js 3Ansible 3Serverspec 3Mac 3自動テスト 3AWS 3Python 3Auto Provisioning 3GitHub Action 2Netlify 2Lambda 2Go 2GraphQL 2ChromeDriver 2Chainer 2Write Code Every Day 2CompositionAPI 2toast 2test 1particle.js 1GitPitch 1GitHub Badges 1Azusa Colors 1GitHubAction 1Sentry 1監視 1JSON Resume 1GitHub Pages 1Resume 1CV 1 1weed 1CI 1Netlify Form 1健康 1Contact Form 1Travis 1天下一品 1腰痛 1Gatsby 1E2E Test 1Selenium 1GoogleChrome 1Azure Devops Build Pipeline 1netatmo 1台風 1IoT 1センシング 1Google Apps Script 1API FLASH 1SlackAPI 1Clasp 1Headless CMS 1Jest 1Unit Test 1Slack 1Stamp 1ハロウィーン 1Nim 1docopt 1CLI 1昆布 1Googleデータポータル 1BI 1Google Analytics 1仮想化 1AWS認定ソリューションアーキテクトプロフェッショナル 1資格 1勉強法 1Hyper-v 1metasploitable 1RNN 1LSTM 1Chat BOT 1アイマス 1デレマス 1Hadoop 1ゾウ 1ひなこのーと 1Deep Learing 1OpenCV 1機械学習 1CNN 1分類学習 1顔認識 1powerShell 1particles-bg-vue 1particle 1Proton 1particles.js 1E2Eテスト 1Nightwatch.js 1チャーシュー飯 1Composition API 1Vuex 1ストアパターン 1ギター 1DTM 1エフェクター 1ATELIERZ 1Caparison 1VOCALOID 1Julia 1円周率 1初心者 1The Gauss–Legendre algorithm 1Leibniz formula for π 1かわいい 1恐竜時代 1ことり隊 1早稲田 1GitHub API v4 1リリース実績 1Estimated Reading Time 1あと何分 1Google広告設定 1Google 1属性情報 1Persolal Data 1Server 1Seti@Home 1Logo 1SVG 1振り返り 1Echo 1Jaeger 1ボトルネック調査 1React Calendar Heatmap 1Frontend 1Web Developer Roadmap 2020 1X-Ray 1Datadog 1APM 1modules 1
この記事は274文字1.4で読めます

(過去ブログからの移転した記事です)

なるべくコードはかかない。

何の気なしに機械学習とかの仕事はないものかと、ネットの海をさまよっていたら、

LSTMで自然な受け答えができるボットをつくった という記事を見つけ、何となく読んで、やってみようかなと思ってやってみましたが、Chianer周りとか色々上手くいかなかった。というのがそもそもの始まりです。

Chainer周りで日本語の受け答えができますよ、的な記事は2015年頃のものが多く、Chainerがバージョンアップしたため、色々動かないことがありましたので、少しそちらに修正を加えてChainer 1.6.1でもまともに動くように修正していこうと思います。

自分でコードを一から書くのは嫌なので、あくまでもコードは書かない。

微修正にとどめるをモットーにがんばるぞい。

Table of Contents

参考にさせていただいたコードやサイト

サーバを用意する

学習にも、会話にも自宅サーバを用います。

ああ、電気代。

学習に必要なPython環境とコーパスを整える

Chainer界隈のコードはなぜかPython2 が多く、Python3 は少ないので、直接Python2をインストールしてもいいのですが…。

なんかOS環境を変に汚したくないので今回はPyenvとVirtualenvを使って実施していきます。

学習用のコーパスをダウンロードするスクリプトはどうやらPython 3.4.1で実装されているようなので Python 3.4.1Python2.7 の2種類の環境を作っていきたいと思います。

そして、3.4.1の環境にて学習用のコーパスをダウンロードします。

PyenvとVirtualenvはあらかじめインストール済みとしてすすめます。

PyenvとVirtualenvのインストール方法はこちらの記事が参考になると思います。(pyenvとvirtualenvで環境構築)

まず、Pythonの環境を作ります。

$ pyenv install 3.4.1

$ pyenv install 2.7

$ pyenv rehash

$ virtualenv -p ~/.pyenv/versions/3.4.1/bin/python3.4 my_env3.4.1

$ virtualenv -p ~/.pyenv/versions/2.7/bin/python2.7 my_env2.7

続いてコーパスをダウンロードします。

今回はChainerで学習した対話用のボットをSlackで使用+Twitterから学習データを取得してファインチューニングを参考にダウンロードします。

コーパスデータはたぶん二次配布とかNGだと思うので、何とか自分でダウンロードしてください。

対話破綻検出チャレンジ

ダウンロードしたあとは展開したJSONデータ全部、devフォルダを作成してその中に入れて、listファイル(JSONファイルのパスを記載したやつ)をdata_load.pyと同じところに作っておきます。

こんな感じでlistファイルを作ります。

../dev/1404365812.log.json
../dev/1407143708.log.json
../dev/1407143981.log.json
../dev/1407149923.log.json
../dev/1407208809.log.json
../dev/1407209083.log.json
…… 

Linuxのコマンド(bash)で

ls -1 ../dev > list

で作成できるはず。

学習データを作っていきます。

$ source my_env3.4.1/bin/activate

$ git clone https://github.com/SnowMasaya/Chainer-Slack-Twitter-Dialogue.git

$ cd chainer-slack-twitter/utils

$ python data_load.py

player1.txt , player2.txt というテキストファイルができます。

統合する前にmecabを使って分かち書きをしておきます。

分かち書きにmecab-ipadic-NEologdを使うと学習が進むそうですので入れてない方は導入しましょう。

めんどくさい人は ただのMeCabでも大丈夫だと思います。

さて、分かち書きします。今回は mecab-ipadic-NEologd を利用します。

mecab –Owakati –d /usr/local/lib/mecab/dic/mecab–ipadic–neologd player_1.txt > player_1_wakati.txt

mecab –Owakati –d /usr/local/lib/mecab/dic/mecab–ipadic–neologd player_2.txt > player_2_wakati.txt

次に使う Chainer-char-rnn 用に一つのinput.txt に統合していきます。統合の際に、player1 と player2の会話ごとに空行を入れておきます。

$ paste -d “\n” player_1_wakati.txt player_2_wakati.txt | awk(NR%2==0){$0=$0\n”}{print}> input.txt

こちらのinput.txtをコーパスデータとして利用します。

学習させる

学習にはyusuketomoto/chainer-char-rnnを使わせていただきます!

Chainer 1.4.1 で実行しようとしたら微妙に実装が変わっていた用なので、こちらに合わせて今回の学習は、Chainer 1.6.1 で実施していきます。(Chainer周りのコードを読んで修正するより、後に使うTornado周りの修正の方がまだわかるからというスキル不足によるもの)

さきほど作っておいたPython 2.7用に切り替えます。Pip でChainer1.6.1 を入れてからChainer-char-rnnを実行していきます。

$ source my_env2.7/bin/activate

$ pip install chainer==”1.6.1″

$ git clone https://github.com/yusuketomoto/chainer-char-rnn.git

$ cd chainer-char-rnn

$ mkdir -p data/chat

$ mkdir -p cv/chat

$ cp ../chainer-slack-twitter/input.txt data/chat

$ python train.py –data_dir data/chat –checkpoint_dir cv/chat –rnn_size 1024

しばらく待ちます。全部が終わるのは途方もない時間がかかります。

学習が進むごとにCheckpointとして Chainer modelファイルがcv/chat 配下にできますので、適当なEpochのところのものを次の「APIで話す」に使ってもいいですし、学習の最新ファイルである

latest.chainermodel を使ってもいいです。もちろん、最後まで待ってからlatest.chainermodelを使ってもいいです。

ひとまず数時間回したところのlatest.chainermodelを使ってみます。

APIで話す

LSTMで自然な受け答えができるボットをつくったよりJapanese Talk APIを作っていきます。

この回では少々コードの改変がありますのでForkしたものをGitHubにあげました。

japanesetalkapi_1.6.1

こちらのmodelsディレクトリにChainer modelを投入します。

$ git clone https://github.com/tubone24/japanese_talk_api/tree/chainer1.6.1.git

$ mkdir japanese_talk_api/tornado/models

$ cp chainer-char-rnn/cv/chat/latest.chainermodel japanese_talk_api/tornado/models

Chainerの他にTornadoも必要になるのでPipでインストールします。

そしてAPIを8787ポートで起動します。

$ pip install tornado

$ python japanese_talk_api/tornado/app.py –port=8787 –debug=True

あとは起動を待ってからcurlやブラウザなどで

http://localhost/?q=こんにちは

で受け取れるようにはずです。

学習用input.txtにないことばとか出すとたまにエラー吐きます。

ビンビンビンビンビンビンビンビン… チクッ あ・あ・あぁ・ぁああああ↑↑ アーッ…イクッ チ~ン 問いかける言葉には気をつけよう!

付属のHubot Scriptで遊んでみよう!

LSTMで自然な受け答えができるボットをつくったのHubotScriptをお借りして遊んでみましょう。

あらかじめ比較として同じコーパスを利用しているDocomoの雑談APIをHubotに仕込んであります。

発言の上がDocomoAPI 下が今回作ったAPIです。

ちなみに我が家のHubotはSlack上に「智絵里ちゃん」として君臨しております。

智絵里ちゃんマジ天使 I love you

img

DocomoAPIに比べると天然というか、不思議系というか… バカですね(直球)

お借りした多くのコードや参考にさせていただいた多くのサイト・記事に改めて感謝しつつ、智絵里ちゃんとのラブラブライフを送りますね。

˚