GeekFactory

int128.hatenablog.com

Hubotでkuromoji.jsによる形態素解析を試す

Hubotでkuromoji.jsを使って形態素解析を行う方法を調べてみました。形態素解析のライブラリは node-mecab-async も有名ですが、Mecabのバイナリを用意する必要があります。kuromoji.jsはPure JavaScriptの実装なので、Herokuに簡単にデプロイできます。

yo hubot

YeomanでHubotのテンプレートを生成します。

npm install -g yo generator-hubot
mkdir -p hubot-learn
cd hubot-learn
yo hubot

kuromoji.jsを依存関係に追加します。

npm install --save kuromoji

これから scripts/main.coffee にコードを書いていきます。

形態素解析器を使う

kuromoji.jsを初期化します。kuromoji.builder() に辞書のパスを渡して build() を実行すると、コールバックで解析器のインスタンスが返されます。

kuromoji = require 'kuromoji'

class Tokenizer
  constructor: ->
    kuromoji
    .builder(dicPath: 'node_modules/kuromoji/dist/dict/')
    .build (err, tokenizer) => @_tokenizer = tokenizer

  tokenize: (text, cb) ->
    if @_tokenizer then cb @_tokenizer.tokenize text

tokenizer = new Tokenizer()

何か聞こえたら適当な単語をピックアップして返すようにしてみましょう。解析器に文字列を渡すとトークンの配列が返されます。ここで品詞を判定すれば名詞のみ抜き出すといったことも可能です。

module.exports = (robot) ->
  robot.hear /(.+)/, (msg) ->
    tokenizer.tokenize msg.message.text, (tokens) ->
      filtered = tokens.filter (token) -> token.pos == '名詞'
      words = filtered.map (token) -> token.surface_form
      msg.send msg.random words

Herokuにデプロイする

ここではHerokuにデプロイします。Slackと連携する場合は、Slackの設定画面でトークンを取得します。

heroku create --stack cedar
heroku ps:scale web=1
heroku addons:add rediscloud
heroku config:add HUBOT_SLACK_TOKEN=  #Slack連携の場合
heroku config:add HUBOT_HEROKU_KEEPALIVE_URL=http://your-app.herokuapp.com
git push heroku master

SlackでHubotに話しかけてみましょう。まずはDirect Messageで話しかけてみるとよいでしょう。

うまく動かない場合はログを確認します。

heroku logs