2018年6月15日金曜日

エネルギー基本計画(案)の特徴を見てみる。その1 wordcloud(python,janome,自然言語処理)

2018/9/5 更新。janomeの初期化を書き忘れていました。修正していますm(__)m
---
エネルギー基本計画(案)のpdfからテキストを抽出形態素解析janomeの使い方とやってきましたが、ここからが本題。エネルギー基本計画(案)の特徴を見てみたいと思います。

まずは、最近よく見られるwordcloudを作ってみます。
wordcloudとは、文章中で出現頻度が高い単語を複数選び出し、その頻度に応じた大きさで図示する手法。ウェブページやブログなどに頻出する単語を自動的に並べることなどを指す。文字の大きさだけでなく、色、字体、向きに変化をつけることで、文章の内容をひと目で印象づけることができる。デジタル大辞泉より
ということで、文章中に多く出てくる単語ほど大きく表示して、文章の内容を一目で分かるように可視化するという手法です。

wordcloudの作り方は下記ページを参考にしました。

github:amuller wordcloud
https://amueller.github.io/word_cloud/index.html
先端技術研究所:AnacondaとWordCloudを用いたテキストマイニング
http://cadenza-lab.com/2018/02/04/textmining/
見習いデータサイエンティストの隠れ家:Pythonでトピックモデル Word Cloud と LDA
http://www.dskomei.com/entry/2018/04/11/001944

さっそくやってみます。まずはライブラリをインストール。

・wordcloudインストール
!pip install wordcloud
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": 

pip一発でインストールできるはずが、エラーが出ました。エラーログに出ている下記リンクからMicrosoft Visual C++ Build Toolsを先にインストールしました。(結構時間がかかります)

Microsoft Visual Studio のダウンロード
https://www.visualstudio.com/ja/downloads/

C++をインストールした後にpipで再度インストールすると正常に終了しました。

・インポート
from janome.tokenizer import Tokenizer
from wordcloud import WordCloud

import matplotlib.pyplot as plt

・テキストファイル読み込み
t = Tokenizer()
tokens = t.tokenize(text)

text_file = open("enegy_plan.txt")
full_text = text_file.read()
full_text= full_text.replace("\n","")

・分かち書き
wakati_list = t.tokenize(full_text, wakati=True)

tokenのオプションで"wakati=True"をつけ、テキストを表層形で分かち書きします。ここまでは前回やったところ。

・リストを結合
words_wakati=" ".join(wakati_list)
words_wakati
出力(一部)
はじめ に 2 0 1 1 年 3月 の 東日本 大震災 及び 東京電力 福島 第 一 原子力 発電 所 事故 を 受け て 、 政府 は 、 2 0 1 4 年 4月 、 2 0 3 0 年 を 念頭 に 、 第 4 次 エネルギー 基本 計画 を 策定 し 、 原発 依存 度 の 低減 、 化石 資源 依存 度 の 低減 、 再生 可能 エネルギー の 拡大 を 打ち出し た 。 第 4 次 エネルギー 基本 計画 の 策定 から 4 年 、 2 0 3 0 年 の 計画 の 見直し のみ なら ず 、 2 0 5 0 年 を 見据え た パリ 協定 へ の 対応 、 より 長期 に は 化石 資源 枯渇 に 備え た 超 長期 の 対応 、 変化 する エネルギー 情勢 へ の 対応 など 、 今 一 度 、 我が国 が その エネルギー 選択 を 構想 す べき 時期 に 来 て いる 。 この ため 、 今回 の エネルギー 基本 計画 の 見直し は 、 2 0 3 0 年 の 長期 エネルギー 需給 見通し ( 2 0 1 5 年 7月 経済 産業 省 決定 。 以下 「 エネルギー ミックス 」 と いう 。 ) の 実現 と 2 0 5 0 年 を 見据え た シナリオ の 設計 で 構成 する こと と し た 。

wakatiオプションの分かち書きは各単語がリストに格納されているので、wordcloudで読み込めるようにスペース区切りで結合します。

前回も書きましたが、「再生可能エネルギー」が「再生」「可能」「エネルギー」に、「経済産業省」が「経済」「産業」「省」などに分割されてしまっています。

・wordcloud設定・描画
stop_words = []
fpath = "C:\Windows\Fonts\msgothic.ttc"

wordcloud = WordCloud(
    font_path=fpath,
    width=900, height=500, #default width=400, height=200
    background_color="white", #default=”black”
    stopwords=set(stop_words),
    max_words=500, #default=200
    max_font_size=150, #default=None,height of the image
    min_font_size=4, #default=4
    collocations = True #default = True
).generate(words_wakati)

plt.figure(figsize=(15,12))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

wordcloudの設定をして、描画します。ストップワードはwordcloudに描画ない単語("です"、"ます"など普通の文章によく出てくる単語など)をリスト形式で指定します。今回はストップワードは指定していないので省略可。

font_pathは日本語フォントのパスを指定します。これは指定しないと日本語は文字化けしてしまいます。

max_wordsは描画させる単語の数(デフォルトは200)です。

max_font_size、min_font_sizeはフォントの最大サイズと最小サイズ。max_font_sizeはデフォルトでは出力画像の高さ(height)になるようです(実質どこまでも大きくなる)。極端に出現回数が多い単語があると、それに対応して文字サイズが大きくなってしまうので制限するのもいいかもしれません。

collocationsは連語を考慮するかどうか。デフォルトは"True"で、頻出する2つの単語の並び(bigram:バイグラム)が表示されます。

他のオプションはリファレンスをご参照ください。(デフォルトのままでよいオプションは省略可)

・出力


「する」「なる」などの一般的な言葉が最も大きくなってしまいました。そのほか、「エネルギー」「技術」などが大きく表示されています。よく見ると、「水素」「エネルギー 需給」「蓄電池」などの言葉も表示されています。

「再生可能エネルギー」が「再生 可能」と「可能 エネルギー」の両方で現れているのはwordcludでは2単語の連語(bigram)までしか考慮しないためですね。惜しいです。

↓こちらは collocation=False にし、連語を考慮しない(頻出単語のみ)にしたもの。



「こと」「する」「ある」などの単語が目立って、文章の特徴が見えにくくなってしまいました。次回以降、改善を図ります。

参考:
github:amuller wordcloud
https://amueller.github.io/word_cloud/index.html
先端技術研究所:AnacondaとWordCloudを用いたテキストマイニング
http://cadenza-lab.com/2018/02/04/textmining/
見習いデータサイエンティストの隠れ家:Pythonでトピックモデル Word Cloud と LDA
http://www.dskomei.com/entry/2018/04/11/001944
wordcloudのほかに、トピックモデルによる分類あり。

資源エネルギー庁:エネルギー基本計画(案)
http://www.enecho.meti.go.jp/committee/council/basic_policy_subcommittee/pdf/basic_policy_subcommittee_002.pdf

修正:PDFMinerでpdfからtxtを抽出する。(python、PDFMiner.six、エネルギー基本計画)
http://eneprog.blogspot.com/2018/05/pdfminerpdftxtpythonpdfminersix.html
正規表現を使って、エネルギー基本計画のテキストを整形する。(python、re、split)
http://eneprog.blogspot.com/2018/06/pythonresplit.html
Janomeで形態素解析をやってみる。(python,自然言語処理,分かち書き)
http://eneprog.blogspot.com/2018/06/janomepython.html

0 件のコメント:

コメントを投稿

//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語