GIS奮闘記

元GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Python で MeCab を使ってテキストの内容を形態素解析してみる ~小説内の頻出単語の抽出~

本日は MeCab を使ってみようと思います。MeCab については最近、以下エントリーでインストール方法と簡単な使い方を紹介しましたが、本エントリーではより実践的な使い方を紹介したいと思います。

www.gis-py.com

やってみること

  1. 「坊ちゃん」(夏目漱石)のテキストデータをダウンロード
  2. 正規表現で不要な文字を除去する(ここはなくても形態素解析が可能ですが、より正確に解析したかったので、この手順を入れました)
  3. MeCab を使用して頻出単語(名詞)TOP10を抽出する

データ入手先

青空文庫さんで色々な小説のテキストデータをダウンロードすることができます。

青空文庫 Aozora Bunko

坊ちゃんのデータはここですね。

図書カード:坊っちゃん

中身はこんな感じです。《にさんち》のようにフリガナが入っていたり、ヘッダーやフッターも除去する必要がありますね

f:id:sanvarie:20190727081956p:plain

実行環境

Windows10
Python3.6.5
Jupyter Notebook

正規表現のサンプル

こういう場合は正規表現を使います。そして、Python で正規表現と言ったら re ですね。

import re

# ファイル読み込み
file = r'bocchan.txt'
with open(file) as f:
    text = f.read()

# ヘッダの除去
text = re.split('\-{5,}',text)[2]

# フッタの除去
text = re.split('底本:',text)[0]

# 最初の一の除去
text = re.sub('一', '', text,1)

# ふりがなの削除
text = re.sub('《.+?》', '', text)

# 入力注の削除
text = re.sub('[#.+?]', '',text)

# 空行の削除
text = re.sub('\n\n', '\n', text)

print(text)

いい感じの結果になりましたね。
f:id:sanvarie:20190726230648p:plain

MeCab を使用して頻出単語(名詞)TOP10を抽出するサンプル

MeCab の処理でも少し re を使います。また、形態素解析した結果を collections.Counter を使用して頻出単語(名詞)TOP10を抽出してみたいと思います。そして、抽出対象は名詞-一般のみにしました。結果は「単語:n」のような形式で出力します。

import re
import MeCab
from collections import Counter

# ファイル読み込み
file = r'bocchan.txt'

with open(file) as f:
    text = f.read()

# ヘッダ部分の除去
text = re.split('\-{5,}',text)[2]
# フッタ部分の除去
text = re.split('底本:',text)[0]
# 最初の一の除去
text = re.sub('一', '', text,1)
# ルビの削除
text = re.sub('《.+?》', '', text)
# 入力注の削除
text = re.sub('[#.+?]', '',text)
# 空行の削除
text = re.sub('\n\n', '\n', text)

# Mecab で形態素解析
tagger = MeCab.Tagger("-Ochasen")
result = tagger.parse(text)
result_lines = result.split('\n')

result_words = []
words = []

for result_line in result_lines:
    result_words.append(re.split('[\t,]', result_line))

for result_word in result_words:

    if (    result_word[0] not in ('EOS', '')
        and result_word[3] == '名詞-一般'):

            words.append(result_word[0])

# 頻出単語TOP10を抽出
counter = Counter(words)
for word, count in counter.most_common(10):
    print('%s : %s' % (word, count))

結果はこのようになりました。
f:id:sanvarie:20190727003355p:plain

なるほどーといった感じですね。「赤」が最頻出の単語(名詞)ということがわかりました。タイトルである「坊ちゃん」という単語はTOP10からは漏れているようですね。気になるので調べてみたら70~80位くらいでしたね。
f:id:sanvarie:20190727003705p:plain

MeCab をもっと使いこなせば本当に色々なことができそうですね。もっと勉強して次回はもう少し複雑なものにもチャレンジしてみようと思います。