2018年6月28日木曜日

エネルギー基本計画(案)の特徴を見てみる。その3 単語の出現回数を数える(python,janome,自然言語処理)

2018/9/5 更新。janomeの初期化を書き忘れていました。修正していますm(__)m
---
エネルギー基本計画(案)の特徴を見てみる。その3です。前回はエネルギー基本計画(案)をjanomeで形態素解析し、名詞(代名詞、非自立名詞を除く)だけ抽出してwordcloudを作ってみました。



今回は、単語の出現回数を見てみます。

単語の出現回数を数えるやり方はいろいろありますが、3つの方法(python標準ライブラリのCounter、pandasデータフレーム、JanomeのAnalyzer)でやってみます。

まずは一番メジャーな方法、python標準ライブラリのCounterを使う方法。下記ページが参考になりました。

侍エンジニア塾
【Python入門】Counterで文字列や要素の数を数えよう!

・インポートとデータ読み込み
from collections import Counter
from janome.tokenizer import Tokenizer

text_file = open("enegy_plan.txt")
full_text = text_file.read()
・形態素解析と品詞で抽出

word_list=[]

t = Tokenizer()
tokens = t.tokenize(full_text) 

for token in tokens:
    word = token.surface
    partOfSpeech = token.part_of_speech.split(',')[0]
    partOfSpeech2 = token.part_of_speech.split(',')[1]
    
    if partOfSpeech == "名詞":
        if (partOfSpeech2 != "非自立") and (partOfSpeech2 != "代名詞") and (partOfSpeech2 != "数"):
            word_list.append(word)

word_list[:10]
['はじめ', '年', '3月', '東日本', '大震災', '東京電力', '福島', '原子力', '発電', '所']

counterではリスト内の要素を数えるので、リストを返します。

janomeの使い方(品詞での抽出)についてはこちらを参照ください。今回は非自立名詞、代名詞、数を除いた名詞を抽出しました。

・文字列の出現回数を数える
counts=pd.DataFrame()

counter = Counter(word_list)

for count in counter.most_common():
    counts=counts.append([list(count)],ignore_index=True)
    
counts.columns=["単語","回数"]

Counterで文字列の出現回数を数え上げ、.most_common()で出現回数の多い順にタプルで返します。

pandasデータフレームの形式で保存するため、一旦リストに変換して、データフレームに行追加しています。最後に列名を付けて完成です。(結果は最後に記載します)


次に前回作った形態素情報を丸ごと保存したデータフレームを使って出現回数を数える場合

・データ読み込みと確認
df = pd.read_csv('energyplan_split.csv',encoding="CP932")
df.head()
単語品詞品詞細分類1品詞細分類2品詞細分類3活用型活用形原形読み発音
0はじめ名詞副詞可能****はじめハジメハジメ
1助詞格助詞一般***
2\n\n記号空白****\n\n**
3名詞****
4名詞****ゼロゼロ
5名詞****イチイチ
6名詞****イチイチ
7名詞接尾助数詞***ネンネン
83月名詞副詞可能****3月サンガツサンガツ
9助詞連体化****
10東日本名詞固有名詞地域一般**東日本ヒガシニッポンヒガシニッポン
11大震災名詞一般****大震災ダイシンサイダイシンサイ
12及び接続詞*****及びオヨビオヨビ
13東京電力名詞固有名詞組織***東京電力トウキョウデンリョクトーキョーデンリョク
14福島名詞固有名詞地域一般**福島フクシマフクシマ
15接頭詞数接続****ダイダイ
16名詞****イチイチ
17原子力名詞一般****原子力ゲンシリョクゲンシリョク
18発電名詞サ変接続****発電ハツデンハツデン
19名詞接尾一般***ショショ

・pandasでデータ抽出とcount
noun = df[df["品詞"]=="名詞"]
noun2=noun[(noun["品詞細分類1"] != "代名詞") & (noun["品詞細分類1"] != "非自立") & (noun["品詞細分類1"] != "数")]

noun2_group=noun2.groupby("単語")[['単語']].count().sort_values(by="単語",ascending=False).rename(columns={'単語': '回数'}).reset_index()
noun2_group

データフレームから必要なデータを抽出後、"単語"列をgroup_byでグループ化しcountで出現回数を数えて多い順に並べ替えしています。

この場合、できた列名は"単語"(マルチインデックス)になっているので、renameで"回数"に変更し、reset_indexでマルチインデックスを解除してインデックスを降りなおししました。(rename以下は必要なければ削除可能)


最後に、janome Analyzer ワードカウントを使う方法。

janomeのAnalyzerでフィルターを使うと、品詞による抽出や単語の数え上げができます。下記記事が大変参考になりました。

janome ドキュメント Analyzerの使い方
け日記:Python janomeのanalyzerが便利

・janome TokenFilterの設定
token_filters = [
    POSKeepFilter("名詞"),
    POSStopFilter(["名詞,代名詞","名詞,非自立","名詞,数"]),
    TokenCountFilter()]

POSKeepFilterで取得する品詞を、POSStopFilterで除外する品詞をリストで設定しています。TokenCountFilterが単語の出現回数数え上げです。

・janome TokenFilterの設定
a = Analyzer(token_filters=token_filters)

counts=pd.DataFrame()

for count in a.analyze(full_text):
    counts=counts.append([list(count)],ignore_index=True)


Analayzerにフィルターを渡して、単語の数え上げを行います。戻り値は単語(表層形)とその出現回数のタプルです。

・並べ替えと列名変更、データ確認
counts=counts.sort_values(by=1, ascending=False)
counts.columns=["単語","回数"]
counts[:200]

janome Analyzerを使うと、形態素解析から品詞による抽出、単語の数え上げまで一気にできて便利です。

・単語の出現回数 出力(200位まで)
単語回数
0エネルギー943
1632
2571
3419
4技術321
5可能307
6300
7供給248
8210
9開発210
10発電207
11205
12事業198
13原子力191
14取組187
15再生181
16需要166
17ガス162
18我が国161
19利用161
20必要155
21資源154
22活用150
23燃料149
24炭素148
25システム145
26導入143
27効率137
28地域137
29国際137
30電力136
31水素133
32130
33実現127
34確保126
35石油124
36コスト122
37強化121
38産業116
39市場116
40世界114
41安定114
42電源110
43安全109
44構造107
45拡大106
46課題104
47環境104
48重要104
49整備104
50制度103
51推進101
52対応96
5396
54企業91
5590
5689
57省エネルギー89
5887
59関係87
60協力84
61競争82
6278
63促進78
64政策75
65需給74
66対策73
67分野73
6871
69経済69
70転換69
7168
72低減67
73リスク67
74状況67
75向上67
76構築67
77新た66
78投資65
79多様63
80消費62
81海外60
82価格60
83展開60
84改革59
85連携59
86効果58
87検討57
88今後57
89福島56
90分散56
91調整56
92国内54
93LNG54
94化石53
9553
96国民53
97情報52
98系統52
99研究52
100社会50
101革新50
102排出49
103支援49
104期待48
105電気48
106インフラ48
107年度48
108変化47
10947
110事故46
111変動46
112削減46
11346
114選択肢45
115火力45
116貢献45
117体制44
118アジア43
119全体42
120依存41
121処分41
12241
12341
124基本40
12540
126様々40
127戦略40
128設備40
129石炭40
130観点40
131計画39
13239
133長期39
134選択39
135実施39
136程度39
137調達39
138積極39
139規制39
14039
141使用38
142総合38
143製品38
144問題37
145将来37
146自動車37
147具体37
148取引37
149適切37
15036
151日本36
152規模36
153着実35
154評価35
15535
156基盤35
15734
158温室34
159東京電力33
160抑制33
161増加33
162目標33
163風力33
164柔軟33
165政府32
166情勢32
167解決32
168中心32
169天然32
17032
171既存32
172廃棄32
17332
174シナリオ31
175動向31
17631
177理解31
17830
179普及30
180自由30
181影響30
182蓄電池30
18330
184ネットワーク30
185関連30
186人材30
187有効30
188部門30
189LP30
190電池30
191最終29
192役割29
193高度29
194温暖29
195管理29
196備蓄29
197貯蔵28
198確実28
199中長期28

結果を見てみると、「エネルギー」「技術」が多く出現し、「原子力」「発電」「炭素」なども比較的上位に入っています。「的」「化」「性」などは複合語が分かれてしまっているようです(安定的、低炭素化、可能性など)。

このままでは何ともいえない感じなので、次回以降、複合語の扱いをやってみます。

つづく

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

janome ドキュメント
http://mocobeta.github.io/janome/#id11
け日記:Python janomeのanalyzerが便利
https://ohke.hateblo.jp/entry/2017/11/02/230000

修正:PDFMinerでpdfからtxtを抽出する。
http://eneprog.blogspot.com/2018/05/pdfminerpdftxtpythonpdfminersix.html
正規表現を使って、エネルギー基本計画のテキストを整形する。
http://eneprog.blogspot.com/2018/06/pythonresplit.html
Janomeで形態素解析をやってみる。
http://eneprog.blogspot.com/2018/06/janomepython.html
エネルギー基本計画(案)の特徴を見てみる。その1 wordcloud
https://eneprog.blogspot.com/2018/06/wordcloudpythonjanome.html
エネルギー基本計画(案)の特徴を見てみる。その2 名詞でwordcloud
https://eneprog.blogspot.com/2018/06/2-pythonjanomewordcloud.html
janomeの形態素情報を保存する。(python、自然言語処理、形態素解析、pandas)
https://eneprog.blogspot.com/2018/06/janomepythonpandas.html

0 件のコメント:

コメントを投稿

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