読者です 読者をやめる 読者になる 読者になる

ブラウザでマルコフ連鎖を用いた文章を要約できる要約器を作った

ブラウザでマルコフ連鎖を用いた文章を要約できる要約器を作った

作ったもの

ブラウザでマルコフ連鎖(Website)

hubotでマルコフ連鎖(Twitter)

hubotはこんな感じのことを10分毎にツイートしている。

使用したもの

今回、要約器や要約スクリプトを作成するにあたって、markov-chain-kuromojiを作成した。

kuromoji.jsは、mecabと違ってJavaScriptのみで記述されているので、hubotへの組み込みが容易。

ソースコード

hubotのスクリプトは次の通り

cronJob = require('cron').CronJob
MarkovChain = require('markov-chain-kuromoji')

Twit = require 'twit'
client = new Twit({
  consumer_key: process.env.HUBOT_TWITTER_KEY
  consumer_secret: process.env.HUBOT_TWITTER_SECRET
  access_token: process.env.HUBOT_TWITTER_TOKEN
  access_token_secret: process.env.HUBOT_TWITTER_TOKEN_SECRET
})

module.exports = (robot) ->
  cronjob = new cronJob(
    cronTime: "00 00,10,20,30,40,50 * * * *"
    start:    true
    timeZone: "Asia/Tokyo"
    onTick: ->
      client.get 'statuses/home_timeline', {count: 200}, (err, tweets, response) =>
        if !err
          input = null
          for i in tweets
            input += "#{i.text}。"
          input = input.replace /。。/g, '。'
          input = input.replace /(https?:\/\/[\x21-\x7e]+)/g, ''
          input = input.replace /(@[\x21-\x7e]+)/g, ''
          input = input.replace /\s*/g, ''
          markov = new MarkovChain(input)
          markov.start(1, (output) =>
            robot.send {room:'Twitter'}, "#{output}"
          )
        else
          console.log err

  )

hubotの作成手順はこちら

uraway.hatenablog.com

  • node-cron : 10分ごとにツイートし、同時にホームライムラインのツイートの取得。15分に15回程度だったと思うが、TwitterAPIの制限[rate limit exceeded]に引っかかるかもしれないので適度に取得回数を調節する。
  • twit : ホームタイムラインのツイートを最大200件取得できる。

あとは適当に要らない記号等を正規表現で取り除いて、マルコフ連鎖モジュールで要約している。

タイムラインから取得したツイートやマルコフ連鎖モジュール内の要約用の辞書をデータベースに保存すれば、もっといろいろな文章ができそう。