2018年8月21日火曜日

Janomeのユーザー辞書を作る(python,自然言語処理,エネルギー基本計画)

前回の続きです。前回はエネルギー基本計画からgensim Phrasesを使って、複数回出現する単語の組み合わせを複合語候補として取り出し、名詞とみなせるかどうか判定しリストを作りました。

今回は、このリストを新語としてjanomeのユーザー辞書に登録します。 下記の記事を参考にしました。

Janomeドキュメント:ユーザー定義辞書を使う
http://mocobeta.github.io/janome/#id7
コード7区:ツイートからユーザ辞書(MeCab や Janome 用)をpython で作ってみる
http://ailaby.com/tweet_dict/


・インポートとデータの確認
from janome.tokenizer import Tokenizer
import pandas as pd

words_judge
複合語候補回数単語判定
0再生_可能_エネルギー171再生可能エネルギーTrue
1する_こと154することFalse
2。_\r\r\r\r\n135
3し_た128
4的_な118
5について_は91について
6事業_者78事業者True
7する_ため72するためFalse
8脱_炭素_化65脱炭素化True
9し_て65

・データ抽出
words_dic=words_judge[(words_judge["判定"]==True) & (words_judge["回数"] >= 6)]
words_dic

判定が"True"、回数が6以上のものを抽出。

複合語候補回数単語判定
0再生_可能_エネルギー171再生可能エネルギーTrue
6事業_者78事業者True
8脱_炭素_化65脱炭素化True
14技術_開発56技術開発True
15可能_性55可能性True
27安定_供給38安定供給True

このデータの"単語"列をユーザー辞書に登録します。janomeのユーザー辞書はMeCab 辞書と同じです。ユーザー辞書のフォーマットについては下記を参照ください。

MeCab 単語の追加方法
http://taku910.github.io/mecab/dic.html

ユーザー辞書はカンマ区切りCSVファイルで、「表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音」という形式です。

今回は、左文脈ID、右文脈IDを-1、コストを1000に、品詞、品詞細分類1を名詞、一般名詞に固定し、そのほかは"*"にします。

・ユーザー辞書のフォーマットを作る
words_dic["paramater"]="-1,-1,1000,名詞,一般,*,*,*,*,%s,*,*"

words_dic=pd.concat(
    [words_dic['単語'],words_dic['paramater']
     .str.split(',', expand=True)], axis=1)

words_dic[9]=words_dic["単語"]
words_dic 

フォーマットの表層形以外をカンマ区切りでparamater列に格納した後、カンマで列を分割、原形(列名"9")に"単語"列をコピーしています。

単語01234567891011
0再生可能エネルギー-1-11000名詞一般****再生可能エネルギー**
6事業者-1-11000名詞一般****事業者**
8脱炭素化-1-11000名詞一般****脱炭素化**
14技術開発-1-11000名詞一般****技術開発**
15可能性-1-11000名詞一般****可能性**

これでユーザー辞書のフォーマットが完成。

・ユーザー辞書をCSVで保存
words_dic.to_csv("energywords_dic.csv", sep=",",index=False,header=False,encoding='cp932') 

できたユーザー辞書をCSVで保存します。この時、列名、インデックスともにFalseとし、保存しないようにます。

・ユーザー辞書を使う
janomeでユーザー辞書を使ってみます。エネルギー基本計画より、下記の文章を分かち書きします。
電源構成は、特定の電源や燃料源への依存度が過度に高まらないようにしつつ、低廉で安定的なベースロード電源を国際的にも遜色のない水準で確保すること、安定供給に必要な予備力、調整力を堅持すること、環境への適合を図ることが重要であり、バランスのとれた電源構成の実現に注力していく必要がある。一方、東京電力福島第一原子力発電所事故後、電力需要に変化が見られるようになっている。こうした需要動向の変化を踏まえつつ、節電や、空調エネルギーのピークカットなどピーク対策の取組を進めることで電力の負荷平準化を図り、供給構造の効率化を進めていくことが必要である。
text="電源構成は、特定の電源や燃料源への依存度が過度に高まらないようにしつつ、低廉で安定的なベースロード電源を国際的にも遜色のない水準で確保すること、安定供給に必要な予備力、調整力を堅持すること、環境への適合を図ることが重要であり、バランスのとれた電源構成の実現に注力していく必要がある。一方、東京電力福島第一原子力発電所事故後、電力需要に変化が見られるようになっている。こうした需要動向の変化を踏まえつつ、節電や、空調エネルギーのピークカットなどピーク対策の取組を進めることで電力の負荷平準化を図り、供給構造の効率化を進めていくことが必要である。"

・ユーザー辞書なし
tokenizer = Tokenizer()

words=[]
tokens = tokenizer.tokenize(text)
for word in tokens:
    words.append(word.surface)
    
print(" ".join(words))
電源 構成 は 、 特定 の 電源 や 燃料 源 へ の 依存 度 が 過度 に 高まら ない よう に し つつ 、 低廉 で 安定 的 な ベース ロード 電源 を 国際 的 に も 遜色 の ない 水準 で 確保 する こと 、 安定 供給 に 必要 な 予備 力 、 調整 力 を 堅持 する こと 、 環境 へ の 適合 を 図る こと が 重要 で あり 、 バランス の とれ た 電源 構成 の 実現 に 注力 し て いく 必要 が ある 。 一方 、 東京電力 福島 第 一 原子力 発電 所 事故 後 、 電力 需要 に 変化 が 見 られる よう に なっ て いる 。 こうした 需要 動向 の 変化 を 踏まえ つつ 、 節電 や 、 空調 エネルギー の ピーク カット など ピーク 対策 の 取組 を 進める こと で 電力 の 負荷 平準 化 を 図り 、 供給 構造 の 効率 化 を 進め て いく こと が 必要 で ある 。

・ユーザー辞書あり
tokenizer = Tokenizer('energywords_dic.csv', udic_enc='cp932')


words=[]
tokens = tokenizer.tokenize(text)
for word in tokens:
    words.append(word.surface)
    
print(" ".join(words))
電源構成 は 、 特定 の 電源 や 燃料 源 へ の 依存度 が 過度 に 高まら ない よう に し つつ 、 低廉 で 安定的 な ベースロード電源 を 国際的 に も 遜色 の ない 水準 で 確保 する こと 、 安定供給 に 必要 な 予備 力 、 調整力 を 堅持 する こと 、 環境 へ の 適合 を 図る こと が 重要 で あり 、 バランス の とれ た 電源構成 の 実現 に 注力 し て いく 必要 が ある 。 一方 、 東京電力 福島 第 一 原子力発電所 事故 後 、 電力 需要 に 変化 が 見 られる よう に なっ て いる 。 こうした 需要動向 の 変化 を 踏まえ つつ 、 節電 や 、 空調 エネルギー の ピーク カット など ピーク 対策 の 取組 を 進める こと で 電力 の 負荷 平準 化 を 図り 、 供給構造 の 効率化 を 進め て いく こと が 必要 で ある 。

ユーザー辞書の設定は、Tokenizerの初期化時にユーザー辞書のCSVファイル名とエンコードを指定するだけ。

ユーザー辞書ありでは、電源構成、依存度、安定的、ベースロード電源、国際的、安定供給、調整力、原子力発電所、需要動向、供給構造、効率化が一つの単語となりました。

一方、予備力、電力需要、ピークカットは「予備 力」「電力 需要」「ピーク カット」と分かれたままです。これはエネルギー基本計画で6回以上出現したものを複合語候補として抽出したためです。複数の資料から辞書に載っていない組み合わせを抽出するようにすれば、新語の検出精度が上がりそうです。

参考:
資源エネルギー庁:第5次エネルギー基本計画
http://www.enecho.meti.go.jp/category/others/basic_plan/pdf/180703.pdf
Janomeドキュメント:ユーザー定義辞書を使う
http://mocobeta.github.io/janome/#id7
MeCab 単語の追加方法
http://taku910.github.io/mecab/dic.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
エネルギー基本計画から新語・複合語を探す。その1
https://eneprog.blogspot.com/2018/07/1-pythongensimphrasesjanome.html
エネルギー基本計画から新語・複合語を探す。その2 複合語を判定する(python,自然言語処理,janome)
https://eneprog.blogspot.com/2018/08/2-pythonjanome.html

0 件のコメント:

コメントを投稿

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