Twitterから(ほぼ)リアルタイム辞書生成

この記事は最終更新日から1年以上が経過しています。

先日社内の勉強会にてインターネット上に公開されているデータの収集方法について取り上げたため、
ここでは少し深掘りしてTwitterストリーミングデータの活用例についてまとめたいと思います。

MeCabと辞書について

昨今、機械学習というキーワードとともにデータを様々な分野で活用する事が期待されていますが、日本語のテキストを学習データとする場合に形態素解析という技術を用いて品詞の判別を行う事があります。形態素解析エンジンはその中に日本語の辞書を持っていて、デフォルトの辞書以外にユーザ定義の辞書を作成し新しい言葉を追加することで利用用途に応じた自分だけの辞書を作成できます。
今回は最も有名と思われるオープンソースの形態素解析エンジン「MeCab」の辞書を拡張したいと思います。

Twitter StreamingAPI + RethinkDBについて

TwitterのStreamingAPIは直近のTweetを取得できるAPIで検索APIなどと異なりTweet取得件数/回数の制限がない代わりに複数接続することはできません。そのためアプリケーションからStreamingAPIで取得したTweet情報を利用したい場合は直接StreamingAPIを呼び出すのではなく一旦どこかに格納した方が利用しやすいです。

今回はほぼリアルタイムということでデータベースに「RethinkDB」を選択しました。
RethinkDBはMongoDBなどと同様のドキュメント志向DBでスキーマレスでお手軽に利用できるだけでなくWebの管理コンソールが付いていたりすぐ使い始められるのが特徴です。もう一つ特徴としてはDBクライアントに更新をプッシュする機能を持っている点で、この機能によりStreamingAPIから取得したTweetをDBクライアントがpollingすることなく取得/処理することができます。

使い方としてはStreamingAPIから取得したTweetをRethinkDBへそのままInsertするアプリを動かしつつ、
別のアプリRethinkDBから必要な情報だけを抽出して利用するという方法を取ることで綺麗に役割分担できます。
この時、Tweetを利用するアプリを追加してもStreamingAPIへの接続を追加する必要が無いのが嬉しい点です。

MeCabでTweetを解析して未知の単語を抽出

ここからはTweetの内容を処理する話になります。
MeCabで文章を解析させると品詞が取得できますので、単純な戦略ですが「名詞」が連続して出現した場合は「未知の単語」と見做して辞書登録をします。

  1. 保存したTweetから連続する名詞を抽出する。(ソースはこちら)
  2. 抽出した名詞を出現頻度の降順で取得する。(ソースはこちら)

PythonからRethinkDBへの問い合わせは以下のようにします。
発生頻度の高い方が存在する可能性が高いという前提で出現回数を見ています。

コンソール出力結果

あとはこれを辞書コンパイラでコンパイルするだけです。(手順はMeCabの公式に載っているので省略)
コンパイルした辞書は「~/.mecabrc」に追加することで有効になります。

実行例

まとめ

Tweetを解析して辞書を生成する仕組みができましたので、あとは定期的に辞書の更新を繰り返し実行することでTweet上に現れた未知の単語をほぼリアルタイムにMeCabに追加することができます。

以下改善したい点です。

  • 意味のないものも辞書に登録されてしまう
  • 顔文字の判定くらいはできそう。あとは人の手で確認するしかない?
  • 読み方をどうするか
  • 辞書に「読み/発音」を登録できるが今はブランクで登録している
  • 元の単語の読みを設定することである程度は対応できそう
  • 「名詞」以外も辞書登録したい
  • 辞書にない言葉がどのように作られるのか日本語の勉強が必要そう

今回作成したソースはこちらに置きました。