Janomeで名詞の出現数をグラフにする【Python, 自然言語処理】
- 作成日: 2020-12-15
- 更新日: 2023-12-24
- カテゴリ: 自然言語処理
名詞の出現数をグラフ化
自然言語処理とは人間の話す言葉をプログラム的に解析する処理のことです。
自然言語処理は字句解析や構文解析などの工程に分かれています。
今回あつかうのは字句解析の部分です。
日本語の字句解析には「形態素解析(けいたいそかいせき)」という手法を使います。
これは日本語の文章を単語に分割する方法のことです。
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
と一緒に使うことが出来ます。
POS
はPart Of Speech(品詞)
の略です。
TokenCountFilter
はトークン(単語)をカウントするフィルターで、これもAnalyzer
と一緒に使えます。
これらのフィルターを使ってAnalyzer
を↓のように作成します。
token_filters = [POSKeepFilter(['名詞']), TokenCountFilter()]
a = Analyzer(token_filters=token_filters)
↑のようにするとAnalyzer
にフィルターがセットされます。
そしてAnalyzer
のメソッドanalyze()
に日本語の文章を渡すと解析がはじまります。
result = list(a.analyze(text))
解析の結果はジェネレーターで返ってきます。それをlist()
でリストにしています。
変数result
をprint()
などで出力すると↓のようになります。
[('私', 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
文で取り出し、それぞれlabels
とy
に保存しています。
x
, y
, labels
をprint()
などで出力すると↓のようになります。
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
などと組み合わせるとこのように視覚的にわかりやすく解析することが出来ます。
🦝 < わかりやすいことはいいことだ