mecab-pythonで7月7日に関するキーワードを抽出して可視化する

2019.07.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データインテグレーション部改めデータアナリティクス事業本部・インテグレーション部の貞松です。
長いので今後はDA事業本部で押し通す所存です。

7月7日はクラスメソッドの創立記念日だったようなので、強引に絡めたエントリーを書こうと考えた結果とても微妙なネタになりましたが、せっかくやってみたので書き残しておこうと思います。

実行環境

  • macOS Mojave 10.14.5
  • Homebrew 2.1.6
  • Python 3.6.8

MeCabをインストールする

HomebrewでMeCabの本体と辞書をインストールします。

brew install mecab
brew install mecab-ipadic

mecab-pythonをインストールする

事前に依存関係のあるパッケージをHomebrewでインストールしておきます。

brew install swig

python3.xの場合は、mecab-python3を使用します。
pipでmecab-python3をインストールします。

pip install mecab-python3

Wikipediaの「7月7日」ページからキーワードを抽出する

7月7日に関するテキストデータを得るためにWikipediaの「7月7日」ページを利用します。 7月7日 - Wikipedia このページのテキストを適当なテキストファイルとして保存します(ここでは'wikipedia_7_7.txt'とします)

上記のテキストファイルからキーワードを抽出するコードを記述します。

処理の流れは以下の通りです。

  • コマンド引数渡しでテキストを読み込む
  • python-mecabでMeCabを呼び出して形態素解析を行う。
  • 得られた形態素を一般名詞で絞り込んだ単語のリストを抽出する。
  • リスト内の単語をカウントして、単語, カウント数の形式で出力する。
# python_mecab_word_count.py

import MeCab
import sys
import re
from collections import Counter

# テキストファイルの読み込み
cmd, infile = sys.argv
with open(infile) as f:
    data = f.read()

# MeCabを使用してテキストを形態素解析
mecab = MeCab.Tagger()
parse = mecab.parse(data)
lines = parse.split('\n')
items = (re.split('[\t,]', line) for line in lines)

# 一般名詞をリストに格納
words = [item[0]
         for item in items
         if (item[0] not in ('EOS', '', 't', 'ー') and
             item[1] == '名詞' and item[2] == '一般')]

# 適当なヘッダ行を付けて、カウントの降順で出力(カンマ区切り)
print('word, count')
counter = Counter(words)
for word, count in counter.most_common():
    print("%s, %d" % (word, count))

引数にテキストファイルを指定して、適当なCSVファイルとして出力するように実行します。

python python_mecab_word_count.py wikipedia_7_7.txt > result.csv

以下のように、結果のCSVファイルが出力されました。

せっかくだからQuicksightに載せてみる

文字と数字の羅列だと味気ないので、グラフ化します。
Excelで読み込んでグラフ化、でも問題ないですが、敢えてAWSサービスを絡めてみようということでQuicksightにデータをアップロードして可視化してみます。

QuicksightのHome画面で「Connect to another data source or upload a file」をクリックします。

ローカルのCSVファイルを使用するので「Upload a file」を選択します。

アップロードされるファイルの内容を確認してアップロードします。

あとは、データセットから項目を選択してグラフ化します。
一般名詞だけだと面白みがなかったので、固有名詞をカウントしたデータもアップロードしてみました。
(コードとしては item[2] == '一般' のところを item[2] == '固有名詞' に書き換えるだけです)

やはりWikipediaのデータだと、7月7日生まれの有名人、キャラクターの情報、あとは世界的な事件の情報が多いようです。

注目は一般名詞の「特撮」、固有名詞の「ウルトラマン」「円谷」ですね。ピンポイントでウルトラマン関連のワードが比較的上位にきており、なぜだろうと調べてみたら「ウルトラマンA(エース)」は7月7日にまつわる事項が多いということがわかりました(主人公2人の誕生日や物語中に発生する事件など)

こういった意外な特徴が見つかるのがテキスト分析の醍醐味ですね。

まとめ

クラスメソッドの創立記念日である7月7日に絡めて、mecab-pythonを使ったキーワード抽出をやってみました。

今回使用したmecab-pythonとQuicksightの組合せで色々とテキスト分析+可視化できそうなので、今後も実験的にやっていきたいと思います。