10 min readPython
【MeCab入門 Mac編】インストール手順からPythonコードを使い実践演習
Pythonを使ってコードを書けるが、データ分析の仕方がわからない。そんな方も多いのではないでしょうか?今回は、形態素解析エンジンMecabを活用して小説に登場する動詞の数を計測します。ぜひ最後までお読みいただけますと幸いです。
用意するもの
- ローカルにてPython環境が叩ける状態であること(ターミナルにて
python -V
でバージョンが表示されていること) - Homebrew(macOS(またはLinux)用パッケージマネージャー)が使えること(brewインストール)
- pipが入っていない場合はpipを入れておく(Python 3.4以降では標準で入っている。参考)
- コードを編集する、個人に合うエディタが使える状態であること(おすすめはVsCode)
Mecabインストール手順
Pythonコードを書き始めたいところですが、Mecabをインストールしなければ前に進めません。順に説明していきますので、落ち着いて取り組んでいきましょう。
※ $は先頭を表し入力文字にあたりません。例えば、$ pip install hoge
と書かれていたら、pip install hoge
と入力ください。
- ターミナルを開きます。
$ brew install mecab mecab-ipadic git curl xz
を実行する。(Homebrewを活用してmecab関連で必要なパッケージをインストールします。)$ cd desktop
を実行する。(デスクトップへ移動します。)$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
を実行する。(githubに登録されるコードをダウンロードします。mecab-ipadic-neologdとしてデスクトップへ表示されます。)$ cd mecab-ipadic-neologd
を実行する(ディレクトリ移動します。)$ ./bin/install-mecab-ipadic-neologd -n
を実行する。(ダウンロードしたファイルを実行します。形態素解析を行う際、まず文章を単語に分解し、次に辞書検索して品詞分解などを行いますが、その辞書を作成しています。辞書の作成途中に「Do you want to install mecab-ipadic-NEologd?」と聞かれるので、yesと入力しましょう。)- デスクトップにあるmecab-ipadic-neologdフォルダを全て削除する。
- $ echo `mecab-config --dic dir` "/mecab-ipadic-neologd"を実行する。(辞書を参照するファイルパスを確認するコマンド。後でファイルパスを使うので出力された値を控えておいてください。)
以上でMecab使用準備は完了です。
Mecabを動かしてみる
以下の手順を踏まえてPythonコードを使い、ローカル環境(自身のパソコン)にてMecabを動かしてみましょう。
ローカル環境上にファイルを置く
以下の作業は、私の方で実際に作成したコードを、自身のパソコンへファイルを置く作業になります。
- こちらのページに訪問ください。
- 緑の「Code」と書かれているボタンをクリックして、 「Download ZIP」をクリックください。
- ダウンロードしたZipファイルをドラック&ドロップを使って、デスクトップへファイル移動して下さい。
- Zipファイルを展開するために、デスクトップに置いた先ほどのファイルをダブルクリックして下さい。
Pythonを実行してみる
必要なパッケージ(Pythonを実行する際に汎用的に使われるコード群)をインストールして、Pythonを実行します。
- ターミナルを開いて、analyticsTakuboku-masterのディレクトリへ移動します。(
cd
を利用する。) - ターミナル上で
pip install -r requirements.txt
と入力する。(analyticsTakuboku-masterディレクトリ内にrequirements.txtファイルを用意していて、ファイルを実行するために必要なパッケージ情報を記載しています。その情報を元に自身のパソコン内へパッケージを格納しています。) - お好みのエディタを開いて、analyticsTakuboku-masterのディレクトリ内にあるanalytics.pyファイルを編集します。
MeCab.Tagger("-d xxx -O chasen")
のxxx箇所を、先ほど控えていたファイルパスに変更ください。また最終行のplt.savefig("./result.png")
をplt.savefig("./test.png")
に変更ください。 - 最後に
python analytics.py
を実行します。少し時間がかかりますが石川啄木の小説内で登場する動詞の数を計測します。計測結果はtest.pngファイルを開くと確認できます。
エラーが表示されたら
もしもPythonを実行して、エラーが表示されたら以下のことを確認ください。詳細を知りたい方は、こちらをご覧ください。
エラーメッセージ | 変更点 |
---|---|
error message: [ifs] no such file or directory: /usr/local/etc/xxx | touch /usr/local/etc/xxx と実行する。再度python analytics.py を実行する。 |
完成画像
よくわかるコード解説
以下のコードは、メイン関数です。
data.csv内には石川啄木の小説情報が格納されていて、その内容を呼び出します。data.csvの形式は以下の用になります。
作品名 | 本文 | |
---|---|---|
0 | 作品名1 | 本文1 |
1 | 作品名2 | 本文2 |
2 | ... | ... |
- df[["名詞", "動詞", "形容詞"]] = df["本文"].apply(wordAnalytics) : 本文の列を抜き出して、wordAnalytics関数を実行します。本文の数だけ実行するためにfor文を回して、wordAnalytics(本文)のように書きたくなりますが、apply関数を使うことで省略することが可能です。
- wordAnalytics内で本文を名詞、動詞、形容詞に分けて以下の形式で返却します。[[名詞1, 名詞2, ...], [動詞1, 動詞2, ...], [形容詞1, 形容詞2, ...]]
- 上記で返却されたデータを元に表を結合するため、形式に合うようにdf[["名詞", "動詞", "形容詞"]]としている。
- wordList = list(itertools.chain.from_iterable(df["動詞"])) : [[動詞1, 動詞2], [動詞3], [動詞1, 動詞5]] → [動詞1, 動詞2, 動詞3, 動詞1, 動詞5]へ変形します。
- c = collections.Counter(wordList) : [(動詞1, 出現回数), (動詞2, 出現回数), ...]の形式へ変更します。
- c.most_common(20) : 動詞の出現回数が多い順に並べ、上位20個の動詞を抽出します。
- plt.savefig("./result.png") : ファイル名をresult.pngとして、設定した内容でグラフ作成を行います。
で構成されています。
1if __name__ == "__main__":
2 # data.csvファイルを呼び出す
3 df = pd.read_csv('./data.csv')
4 # 本文をwordAnalyticsの引数として持たせる。
5 # 戻り値として[[名詞1, 名詞2, ...], [動詞1, 動詞2, ...], [形容詞1, 形容詞2, ...]]が返ってくるので、それに合うような形式でデータを受け取る。
6 # apply : https://note.nkmk.me/python-pandas-map-applymap-apply/
7 df[["名詞", "動詞", "形容詞"]] = df["本文"].apply(wordAnalytics)
8
9 # 2次元に格納される動詞を1次元に変更する。
10 wordList = list(itertools.chain.from_iterable(df["動詞"]))
11 # [('単語1', 出現回数), ('単語2', 出現回数)] とする
12 c = collections.Counter(wordList)
13
14 # フォントファミリーを設定する。日本語表示に対応するため。
15 # macにてフォントファミリーの調べ方 : https://openbook4.me/sections/1674
16 plt.rcParams['font.family'] = 'Hiragino Sans'
17
18 # グラフの作成
19 # figsize : (幅, 高さ) ピクセル単位
20 fig = plt.subplots(figsize=(8, 10))
21 # matplotlibの内部で動いているもの
22 # setに関する詳細 : https://note.nkmk.me/python-matplotlib-seaborn-basic/
23 seaborn.set(font="Hiragino Sans", context="talk", style="white")
24 # 上位20個の単語に対して出力を行う。
25 # yを設定することで、横方向へグラフ化する。
26 # https://pythondatascience.plavox.info/seaborn/%E6%A3%92%E3%82%B0%E3%83%A9%E3%83%95
27 seaborn.countplot(y=wordList, order=[word[0] for word in c.most_common(20)], palette="deep")
28 # 画像の書き出し処理を行う。
29 plt.savefig("./result.png")
30
以下のコードは、小説本文を単語分解し、Mecabを用いて形態素解析を行います。名詞、動詞、形容詞に分けられた情報を配列に格納して、Pandasを活用して表の中にデータを格納するよう命令します。
1# 文章を形態素解析を使って解読する
2# 名詞、動詞、形容詞に分解する
3def wordAnalytics(text):
4 # テキストを形態素解析して単語単位をノードとして扱う。
5 # ノード : https://www.kagoya.jp/howto/rentalserver/node/
6 node = mecab.parseToNode(text)
7 meishiList = []
8 doshiList = []
9 keiyoshiList = []
10 # ノードが存在する(単語が存在する数)だけwhileされる。
11 # node.surface : 形態素の文字列情報
12 # node.feature : CSVで表記された素性情報(データを分類する際に役立つ情報)
13 # featureの中身 : [品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用形, 活用型, 原形, 読み, 発音]
14 while node:
15 hinshi = node.feature.split(",")[0]
16 if hinshi == "名詞":
17 meishiList.append(node.surface)
18 elif hinshi == "動詞":
19 doshiList.append(node.feature.split(",")[6])
20 elif hinshi == "形容詞":
21 keiyoshiList.append(node.feature.split(",")[6])
22
23 node = node.next
24
25 # Series : https://docs.pyq.jp/python/pydata/pandas/series.html
26 return pd.Series([meishiList, doshiList, keiyoshiList])
今日のまとめ
- Mecabを活用することで本文を単語単位で分解し、形態素解析を用いて品詞分解できる。
- Matplotlib, Seabornを用いて本格的なグラフ描画が可能になる。
- Pandasを活用することで、表作成からグラフ生成のための下準備が簡単。
こんなことにもチャレンジしてみよう
- ニュース記事やブログの内容など、気になる情報をMecabを活用して分析してみよう。
- 今回は動詞をテーマに扱いましたが、名詞、形容詞にも着目してグラフを作成する。
- 単語の感情性を分析して、小説家はどのような心持ちで作品を作っているのか考えてみよう。