ラベル gensim の投稿を表示しています。 すべての投稿を表示
ラベル gensim の投稿を表示しています。 すべての投稿を表示

2018年7月27日金曜日

エネルギー基本計画から新語・複合語を探す。その1 gensim phrasesで複合語候補を探す(python,gensim.Phrases,自然言語処理,janome)

前回gensim Phrasesを使って複合語を探す方法を書きました。複数回出てきた単語の組み合わせを学習して、複合語として取り出す方法です。

今回は、閣議決定された第5次エネルギー基本計画から複合語候補を取り出してみます。目標は、エネルギー基本計画から新語を取り出し、用語を辞書に登録することです。

ちなみに今まではエネルギー基本計画(案)を使っていましたが、今回からは正式版のエネルギー基本計画を使います。

資源エネルギー庁:第5次エネルギー基本計画
http://www.enecho.meti.go.jp/category/others/basic_plan/pdf/180703.pdf

下記のページを参考にしました。

gensim Phrase
https://radimrehurek.com/gensim/models/phrases.html
コード7区:gensim の Phrases の使い方。頻出する単語ペアを検出-python
http://ailaby.com/phrases/
コード7区:ツイートからユーザ辞書(MeCab や Janome 用)をpython で作ってみる
http://ailaby.com/tweet_dict/

・インポートとデータ読み込み
from gensim.models.phrases import Phrases , Phraser
from janome.tokenizer import Tokenizer
import pandas as pd

text_file=open("energy_plan.txt").read()
text_file

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

・janomeで分かち書き
tokenizer = Tokenizer()
corpus=[]

tokens = tokenizer.tokenize(text_file)
corpus.append([token.surface for token in tokens])
    
print(corpus)

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

janomeで分かちがきし、リストに格納します。詳しくは前回記事をご参照ください。二重のリストにすることに注意。

・Phrasesで複合語を探す。4回繰り返し。
gramCnt = 5  
tokenizer = Tokenizer()
corpus_phrase=corpus

for i in range(gramCnt-1):
    phrases = Phrases(corpus_phrase,min_count=5, threshold=10.0)
    phraser = Phraser(phrases)
    transformed=list(phraser[corpus_phrase])

    corpus_phrase = transformed

for words in corpus_phrase:
    print(" ".join(words))

gensim Phrasesで複合語を探します。前回は1回ずつ計2回変換しましたが、今回はループで回して4回繰り返しました。

パラメーターのmin_count=5, threshold=10.0はデフォルト値です(なので省略も可)

・出力(一部)
はじめ に 

 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_年 を 見据え_た シナリオ の 設計 で 構成 する_こと と し_た 。_

「東日本_大震災」「東京電力_福島_第_一_原子力_発電_所_事故」「再生_可能_エネルギー」などが複合語候補としてアンダーバーで結ばれました。

その一方、「て_いる_。」「する_こと と し_た 。_」など、複合語とは言えないフレーズも含まれています。

・複合語候補の取り出し
words_df=pd.DataFrame()

for sentence in corpus_phrase:
    for word in sentence:
        if word.find('_') >= 0:
            words_df=words_df.append([word])

words_df.columns=["複合語候補"]

words_df=(words_df.groupby("複合語候補")[["複合語候補"]].count()
       .sort_values(by="複合語候補",ascending=False)
       .rename(columns={'複合語候補': '回数'})
       .reset_index()
      )

words_df

Phrasesで変換した文章から複合語候補を取り出し、groupbyで出現回数を数えました。

・出力(一部)
複合語候補回数
0再生_可能_エネルギー171
1する_こと154
2。_\n135
3し_た128
4的_な118
5について_は91
6事業_者78
7する_ため72
8脱_炭素_化65
9し_て65
10し_て_いく65
11。_\n\n62
12。_また57
13技術_開発56
14可能_性55
15と_なる54
16新た_な53
17て_いく45
18中_で43
19し_て_いく_こと42
20必要_な42
21で_ある_。40
22さ_れる40
23で_あり39
24ある_。39
25に_加え38
26需要_家38
27安定_供給38
28観点_から37
29て_いる_。37
30し_て_いる36
31する_とともに36
32エネルギー_源36
33で_ある36
34こと_から36
35推進_する36
36エネルギー_需給_構造35
37に_向け_た35
38研究_開発35
39。_\n_また35
40廃_炉34
41て_いる33
42し_つつ33
43様々_な33
44化石_燃料32
45さ_れ_た32
46し_て_いる_。32
47安全_性31
48天然_ガス31
49に_向け_て30
50さ_れ30
51これ_まで30
52て_おり29
53LP_ガス29
54積極_的_に29
55国際_的_な28
56更_なる28
57使用_済_燃料28
58技術_革新28
59し_て_いく_ため27
60進め_て_いく27
61活用_し27
62着実_に26
63上_で26
64燃料_電池26
65について_も25
662_025
67重要_な25
68さ_せる25
69多様_な25
70において_も25
71温室_効果_ガス25
72供給_構造25
73効率_化25
74に_資する24
75安定_的_な24
76調整_力24
77。_さらに24
78分散_型_エネルギー_システム24
79行う_こと24
80に_向け_た_取組24
81さ_れ_て_いる23
82FIT_制度23
83電源_として23
84ある_。_\n23
85この_ため23
862_0_5_0_年23
87に_係る23
88エネルギー_選択23
89活用_し_た22
90電力_システム_改革22
91に_基づき22
92多様_化22
93に_取り組む22
94エネルギー_消費22
95エネルギー_需要22
962_0_3_0_年22
97(_2_0_122
98導入_拡大21
99パリ_協定21
100石油_製品21
101東京電力_福島_第_一_原子力_発電_所_事故21
102含め_た21
103競争_力21
104低_炭素_化20
105優れ_た20
106エネルギー_安全_保障20
107進める_。20
108エネルギー_転換20
109実現_する20
110中長期_的_な20
111サプライ_チェーン20
112で_ある_。_\n20
113エネルギー_政策20
114と_なり19
115高度_化19
116通じ_た19
117促進_する19
118具体_的19
119活性_化19
120のみ_なら_ず19
121この_よう_な19
122踏まえ_つつ19
123排出_量19
124できる_よう19
125エネルギー_転換_・_脱_炭素_化19
126と_なっ_て_いる18
127も_含め18
128に_基づく18
129必要_と_なる18
130新興_国18
1312_0_2_018
132て_いる_。_\n18
133適切_な18
134分散_型18
135可能_と_する18
136に_なる18
137エネルギー_分野17
138進める_こと17
139適切_に17
140に_応じ_て17
141エネルギー_ミックス17
142進める_。_\n\n17
143形_で17
144最終_処分17
145強靱_化16
146基本_計画16
147必要_が16
148し_て_き_た16
149た_場合16
150原子力_発電_所16

助詞や句読点などが含まれているものが多くありますが、「再生可能エネルギー」「脱炭素化」「温室効果ガス」などが見つかりました。
「分散型エネルギーシステム」「調整力」「電力システム改革」などのエネルギー用語もあります。

次回以降、この複合語候補から辞書登録する用語を選択してみます。


参考:
資源エネルギー庁:第5次エネルギー基本計画 http://www.enecho.meti.go.jp/category/others/basic_plan/pdf/180703.pdf
gensim Phrase
https://radimrehurek.com/gensim/models/phrases.html
gensim Phrase
https://radimrehurek.com/gensim/models/phrases.html
コード7区:gensim の Phrases の使い方。頻出する単語ペアを検出-python
http://ailaby.com/phrases/
コード7区:ツイートからユーザ辞書(MeCab や Janome 用)をpython で作ってみる http://ailaby.com/tweet_dict/
Janomeで形態素解析をやってみる。
http://eneprog.blogspot.com/2018/06/janomepython.html
janome Analayzerで複合語(複合名詞)を考慮して形態素解析を行う。
http://eneprog.blogspot.com/2018/07/janome-analayzerpython.html
gensim Phrasesで新語・複合語を探す(python、自然言語処理、機械学習)
https://eneprog.blogspot.com/2018/07/gensim-phrasespython.html

2018年7月24日火曜日

gensim Phrasesで新語・複合語を探す(python、自然言語処理、機械学習)

janome Analayzerで複合語(複合名詞)を考慮して形態素解析を行う。という記事を書きましたが、janome Analyzerでは名詞+名詞=複合名詞とするため、「脱炭素」など接頭詞がついたものは名詞とみなされませんでした。

今回は、機械学習ライブラリgensimのPhrasesを使って、複数回出現した単語の組み合わせを複合語として取り出す方法をやってみます。

gensim Phrase
https://radimrehurek.com/gensim/models/phrases.html

下記ブログ記事が大変詳しく解説されていて参考になりました。

コード7区:gensim の Phrases の使い方。頻出する単語ペアを検出-python
http://ailaby.com/phrases/

・インストール
!pip install gensim

gennsimのインストールはpipでできます。

・インポート
from gensim.models.phrases import Phrases , Phraser
from janome.tokenizer import Tokenizer

gensimからPhrasesとPhraserをインポートします。

・サンプル文章(エネルギー基本計画より)
text="""原子力発電所事故の経験、反省と教訓を肝に銘じて取り組むことが原点であるという姿勢は一貫して変わらない。
原子力発電所事故は、周辺国を含む国際社会に大きな不安をもたらしている。
太陽光や風力など変動する再生可能エネルギーはディマンドコントロール、揚水、火力等を用いた調整が必要であり、それだけでの完全な脱炭素化は難しい。
再生可能エネルギー・蓄電・デジタル制御技術等を組み合わせた脱炭素化エネルギーシステムへの挑戦が、幅広い産業を巻き込んで加速しつつある。"""

上記の4文をサンプルにして、Phraserに読ませる形式に変換します。
目標は

[['原子力', '発電', '所', '事故', 'の', '経験'],['変動', 'する', '再生', '可能', 'エネルギー']]

のように、二重リストの中に分かち書きされた各文書が格納されている状態です。

・改行で分割
text_split=text.split("\n")
['原子力発電所事故の経験、反省と教訓を肝に銘じて取り組むことが原点であるという姿勢は一貫して変わらない。',
 '原子力発電所事故は、周辺国を含む国際社会に大きな不安をもたらしている。',
 '太陽光や風力など変動する再生可能エネルギーはディマンドコントロール、揚水、火力等を用いた調整が必要であり、それだけでの完全な脱炭素化は難しい。',
 '再生可能エネルギー・蓄電・デジタル制御技術等を組み合わせた脱炭素化エネルギーシステムへの挑戦が、幅広い産業を巻き込んで加速しつつある。']

・分かち書きしてリストに格納
tokenizer = Tokenizer()
corpus=[]

for text_list in text_split:

    tokens = tokenizer.tokenize(text_list)
    corpus.append([token.surface for token in tokens])
    
print(corpus)
[['原子力', '発電', '所', '事故', 'の', '経験', '、', '反省', 'と', '教訓', 'を', '肝', 'に', '銘じ', 'て', '取り組む', 'こと', 'が', '原点', 'で', 'ある', 'という', '姿勢', 'は', '一貫', 'し', 'て', '変わら', 'ない', '。'], ['原子力', '発電', '所', '事故', 'は', '、', '周辺', '国', 'を', '含む', '国際', '社会', 'に', '大きな', '不安', 'を', 'もたらし', 'て', 'いる', '。'], ['太陽光', 'や', '風力', 'など', '変動', 'する', '再生', '可能', 'エネルギー', 'は', 'ディマンドコントロール', '、', '揚水', '、', '火力', '等', 'を', '用い', 'た', '調整', 'が', '必要', 'で', 'あり', '、', 'それ', 'だけ', 'で', 'の', '完全', 'な', '脱', '炭素', '化', 'は', '難しい', '。'], ['再生', '可能', 'エネルギー', '・', '蓄電', '・', 'デジタル', '制御', '技術', '等', 'を', '組み合わせ', 'た', '脱', '炭素', '化', 'エネルギー', 'システム', 'へ', 'の', '挑戦', 'が', '、', '幅広い', '産業', 'を', '巻き込ん', 'で', '加速', 'し', 'つつ', 'ある', '。']]

janomeで分かち書きして、リスト内包表記でリストに格納しています。

janomeの使い方はこちらをご覧ください。

・準備
tokenizer = Tokenizer()
corpus_phrase=corpus
phrases=""
bigram=""
transformed_bi=[]

・Phrasesで学習、Phraserでモデルを作る
phrases = Phrases(corpus_phrase,min_count=1, threshold=1.0)
bigram = Phraser(phrases)

まず、Phrasesで文章を学習します。

パラメーターでmin_countとthresholdがでてきますが、
  • 単語と単語の組み合わせが出現した回数がmin_count以下の場合、無視されます。
  • thresholdは閾値で、単語と単語の組み合わせ出現回数、各単語の出現回数などでスコアが決まり、スコアがこの値よりも大きい場合に複合語とされます。
スコアについての詳細は下記をご覧ください。

https://radimrehurek.com/gensim/models/phrases.html#gensim.models.phrases.npmi_scorer

今回は4文章と少ないので、min_count、thresholdともに1とし、2回以上単語の組み合わせが出てきた場合は複合語とみなします。

・phraserで作ったモデルで元の文章を変換
transformed_bi=list(bigram[corpus_phrase])

for words in transformed_bi:
    print(" ".join(words))
原子力_発電 所_事故 の 経験 、 反省 と 教訓 を 肝 に 銘じ て 取り組む こと が 原点 で ある という 姿勢 は 一貫 し て 変わら ない 。
原子力_発電 所_事故 は 、 周辺 国 を 含む 国際 社会 に 大きな 不安 を もたらし て いる 。
太陽光 や 風力 など 変動 する 再生_可能 エネルギー は ディマンドコントロール 、 揚水 、 火力 等_を 用い た 調整 が 必要 で あり 、 それ だけ で の 完全 な 脱_炭素 化 は 難しい 。
再生_可能 エネルギー ・ 蓄電 ・ デジタル 制御 技術 等_を 組み合わせ た 脱_炭素 化 エネルギー システム へ の 挑戦 が 、 幅広い 産業 を 巻き込ん で 加速 し つつ ある 。

モデル(bigram)で元の文章を変換します。複合語とみなした組み合わせはアンダーバーで結ばれています。

ここでは「原子力_発電」「所_事故」「再生_可能」「脱_炭素」などが複合語となりました。2つの単語の組み合わせ(bigram)のみを考慮しているので、「原子力_発電_所」や「再生_可能_エネルギー」とはなっていません。

ここで作った文章(transformed_bi)を用いて、もう一度学習、変換することで3つ(最大4つ)の単語による複合語を見つけることができます。

・trigramを見つける
tri_phrases = Phrases(transformed_bi,min_count=1, threshold=1.0)
trigram=Phraser(tri_phrases)
transformed_tri=list(trigram[transformed_bi])

for words in transformed_tri:
    print(" ".join(words))
原子力_発電_所_事故 の 経験 、 反省 と 教訓 を 肝 に 銘じ て 取り組む こと が 原点 で ある という 姿勢 は 一貫 し て 変わら ない 。
原子力_発電_所_事故 は 、 周辺 国 を 含む 国際 社会 に 大きな 不安 を もたらし て いる 。
太陽光 や 風力 など 変動 する 再生_可能_エネルギー は ディマンドコントロール 、 揚水 、 火力 等_を 用い た 調整 が 必要 で あり 、 それ だけ で の 完全 な 脱_炭素_化 は 難しい 。
再生_可能_エネルギー ・ 蓄電 ・ デジタル 制御 技術 等_を 組み合わせ た 脱_炭素_化 エネルギー システム へ の 挑戦 が 、 幅広い 産業 を 巻き込ん で 加速 し つつ ある 。

「原子力_発電_所_事故」「再生_可能_エネルギー」などができました。

・変換後の文章から複合語を取り出す。
phraseWords=[]

for sentence in transformed_tri:
    for word in sentence:
        if word.find('_') >= 0 and word not in phraseWords:
            p_word=word
            print(p_word)
            phraseWords.append(word)
原子力_発電_所_事故
再生_可能_エネルギー
等_を
脱_炭素_化

再生可能エネルギー、脱炭素化はいいのですが、「等_を」という単語の組み合わせも入っています。これは品詞を考慮せずに特定の単語の組み合わせを複合語としているためです。また、原子力発電所事故は「原子力発電所」で1単語としたいところです。

次回以降、品詞をもとに複合語の判定をしてみます。


参考:
gensim Phrase
https://radimrehurek.com/gensim/models/phrases.html
コード7区:gensim の Phrases の使い方。頻出する単語ペアを検出-python
http://ailaby.com/phrases/

Janomeで形態素解析をやってみる。
http://eneprog.blogspot.com/2018/06/janomepython.html
janome Analayzerで複合語(複合名詞)を考慮して形態素解析を行う。
http://eneprog.blogspot.com/2018/07/janome-analayzerpython.html
//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語