ユーニックス総合研究所

  • home
  • archives
  • python-janome-graph

Janomeで名詞の出現数をグラフにする【Python, 自然言語処理】

名詞の出現数をグラフ化

自然言語処理とは人間の話す言葉をプログラム的に解析する処理のことです。
自然言語処理は字句解析や構文解析などの工程に分かれています。

今回あつかうのは字句解析の部分です。

日本語の字句解析には「形態素解析(けいたいそかいせき)」という手法を使います。
これは日本語の文章を単語に分割する方法のことです。

Pythonには形態素解析を行うライブラリとして有名なものに「MeCab」や「Janome」があります。
今回はJanomeを使って形態素解析を行い、日本語の文章から名詞を抽出します。
そして抽出した名詞の出現数を数えて、それをmatplotlibというグラフツールを使ってグラフにします。

具体的には↓を見ていきます。

  • コード全文
  • ライブラリのインストール
  • Janomeの使い方
  • matplotlibの使い方

コード全文

ではコードです。
↓が全文になります。

from janome.analyzer import Analyzer  
from janome.tokenfilter import POSKeepFilter, TokenCountFilter  
import matplotlib.pyplot as plt  


def main():  
    text = '''  
    私はこの世に生を受け、世のため人のために働く一本の葦にすぎない。  
    葦はなぜ人のために尽くすのか、人はなぜ葦を求めるのか。  
    求められることは幸せなことだが、求められない場合はどうか。  
    誰にも必要とされない人生も悪くない。  
    '''  
    # 形態素解析  
    # 名詞を抽出し、その単語数を数える  
    token_filters = [POSKeepFilter(['名詞']), TokenCountFilter()]  
    a = Analyzer(token_filters=token_filters)  
    result = list(a.analyze(text))  

    # グラフにする  
    labels = []  
    x = range(0, len(result))  
    y = []  

    for k, v in result:  
        labels.append(k)  
        y.append(v)  

    plt.bar(x, y, tick_label=labels)  
    plt.show()  


main()  

このコードを実行すると↓のようなグラフが表示されます。

↑のコードを1つ1つ見ていきたいと思います。

ライブラリのインストール

Janomeとmatplotlibを使うにはpipなどを使って環境にライブラリをインストールする必要があります。
↓のようにpipで環境にJanomeとmatplotlibをインストールしてください。

pip install Janome matplotlib  

Janomeの使い方

まず日本語の文章を見てみましょう。

    text = '''  
    私はこの世に生を受け、世のため人のために働く一本の葦にすぎない。  
    葦はなぜ人のために尽くすのか、人はなぜ葦を求めるのか。  
    求められることは幸せなことだが、求められない場合はどうか。  
    誰にも必要とされない人生も悪くない。  
    '''  

🦝 < ネガティブな文章だなぁ

🐭 < ヤんでるなぁ

この日本語の文章を単語のリストに分割するにはJanomeを使います。
また、名詞の出現数を数えるのもJanomeのモジュールを使います。
↓のようにJanomeのモジュールをインポートしておきます。

from janome.analyzer import Analyzer  
from janome.tokenfilter import POSKeepFilter, TokenCountFilter  

Analyzerはじっさいに文章を単語に分割する解析器です。
この解析器は特定の品詞のキープや単語のカウントなども行えます。

POSKeepFilterは特定の品詞をキープするフィルターで、Analyzerと一緒に使うことが出来ます。
POSPart Of Speech(品詞)の略です。

TokenCountFilterはトークン(単語)をカウントするフィルターで、これもAnalyzerと一緒に使えます。

これらのフィルターを使ってAnalyzerを↓のように作成します。

    token_filters = [POSKeepFilter(['名詞']), TokenCountFilter()]  
    a = Analyzer(token_filters=token_filters)  

↑のようにするとAnalyzerにフィルターがセットされます。
そしてAnalyzerのメソッドanalyze()に日本語の文章を渡すと解析がはじまります。

    result = list(a.analyze(text))  

解析の結果はジェネレーターで返ってきます。それをlist()でリストにしています。
変数resultprint()などで出力すると↓のようになります。

[('私', 1), ('この世', 1), ('生', 1), ('世', 1), ('ため', 3), ('人', 3), ('一', 1), ('本', 1), ('葦', 3), ('の', 2), ('こと', 2), ('幸せ', 1), ('場合', 1), ('誰', 1), ('必要', 1), ('人生', 1)]  

↑のように名詞のみが抽出され、その名詞に対して出現数がカウントされています。
あとはこの結果をmatplotlibにわたしてグラフにします。

matplotlibの使い方

matplotlibを使うには最初に↓のようにモジュールをインポートします。

import matplotlib.pyplot as plt  

↓がmatplotlibでグラフを表示している部分のコードです。

    labels = []  
    x = range(0, len(result))  
    y = []  

    for k, v in result:  
        labels.append(k)  
        y.append(v)  

    plt.bar(x, y, tick_label=labels)  
    plt.show()  

まずmatplotlibで棒グラフを表示したい場合はplt.bar()を呼び出します。
このplt.bar()には引数として↓が必要です。

  • X軸の横幅を表すデータ
  • Y軸の高さを表すデータ
  • 横軸のラベル

それぞれx, y, labelsがそれに相当するデータです。
これらのデータは↓の部分で作成しています。

    labels = []  
    x = range(0, len(result))  
    y = []  

    for k, v in result:  
        labels.append(k)  
        y.append(v)  

X軸の横幅はresultの要素数、つまり名詞の総数です。
そしてresultから名詞(k)とそれに対応するカウント数(v)をfor文で取り出し、それぞれlabelsyに保存しています。
x, y, labelsprint()などで出力すると↓のようになります。

x = range(0, 16)  
y = [1, 1, 1, 1, 3, 3, 1, 1, 3, 2, 2, 1, 1, 1, 1, 1]  
labels = ['私', 'この世', '生', '世', 'ため', '人', '一', '本', '葦', 'の', 'こと', '幸せ', '場合', '誰', '必要', '人生']  

これらのデータを↓のようにplt.bar()に渡し、そしてplt.show()を呼び出します。

    plt.bar(x, y, tick_label=labels)  
    plt.show()  

こうすることでグラフを描画できます。
xの長さとlabelsの長さが一致していないとエラーになるので注意してください。

おわりに

今回は自然言語処理の基礎である形態素解析を使って、名詞の出現数をグラフで表示してみました。
matplotlibなどと組み合わせるとこのように視覚的にわかりやすく解析することが出来ます。

🦝 < わかりやすいことはいいことだ