本日は MeCab を使ってみようと思います。MeCab については最近、以下エントリーでインストール方法と簡単な使い方を紹介しましたが、本エントリーではより実践的な使い方を紹介したいと思います。
やってみること
- 「坊ちゃん」(夏目漱石)のテキストデータをダウンロード
- 正規表現で不要な文字を除去する(ここはなくても形態素解析が可能ですが、より正確に解析したかったので、この手順を入れました)
- MeCab を使用して頻出単語(名詞)TOP10を抽出する
データ入手先
青空文庫さんで色々な小説のテキストデータをダウンロードすることができます。
坊ちゃんのデータはここですね。
中身はこんな感じです。《にさんち》のようにフリガナが入っていたり、ヘッダーやフッターも除去する必要がありますね
実行環境
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)
いい感じの結果になりましたね。
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))
結果はこのようになりました。
なるほどーといった感じですね。「赤」が最頻出の単語(名詞)ということがわかりました。タイトルである「坊ちゃん」という単語はTOP10からは漏れているようですね。気になるので調べてみたら70~80位くらいでしたね。
MeCab をもっと使いこなせば本当に色々なことができそうですね。もっと勉強して次回はもう少し複雑なものにもチャレンジしてみようと思います。