このため、今回はjanomeで解析した形態素情報を丸ごと取り出し、pandasデータフレームとして保存したいと思います。これだと一度、形態素解析をかけると後で再利用が楽になるはずです。
janomeでの形態素解析、形態素情報については下記記事をご参照ください。
Janomeで形態素解析をやってみる。(python,自然言語処理,分かち書き
・インポートfrom janome.tokenizer import Tokenizer from wordcloud import WordCloud import matplotlib.pyplot as plt import pandas as pd
・形態素情報を取り出す
t = Tokenizer()
text="エネルギー"
tokens = t.tokenize(text)
for token in tokens:
print(token)
print(type(token))
str(token)
エネルギー 名詞,一般,*,*,*,*,エネルギー,エネルギー,エネルギー <class janome.tokenizer.token=""> 'エネルギー\t名詞,一般,*,*,*,*,エネルギー,エネルギー,エネルギー'
janomeの形態素解析で出力される形態素情報の形式をみてみます。
janome.tokenizer.Tokenというタイプで、「表層形(タブ区切り),品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音」という並びになっています。strで文字列にすることで丸ごと保存できそうです。
・形態素情報をpandasデータフレームに保存
t = Tokenizer()
text="はじめに\n\n2011年3月の東日本大震災及び東京電力福島第一原子力発電所事故を受けて、政府は、2014年4月、2030年を念頭に、第4次エネルギー基本計画を策定し、原発依存度の低減、化石資源依存度の低減、再生可能エネルギーの拡大を打ち出した。"
tokens = t.tokenize(text)
partofspeech_pd=pd.DataFrame()
for token in tokens:
str_token=str(token).replace("\t",",")
token_list=str_token.split(",")
partofspeech_pd= partofspeech_pd.append(pd.Series(token_list),ignore_index=True)
partofspeech_pd.columns = ["単語","品詞","品詞細分類1","品詞細分類2","品詞細分類3","活用型","活用形","原形","読み","発音"]
partofspeech_pd[:20]
| 単語 | 品詞 | 品詞細分類1 | 品詞細分類2 | 品詞細分類3 | 活用型 | 活用形 | 原形 | 読み | 発音 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | はじめ | 名詞 | 副詞可能 | * | * | * | * | はじめ | ハジメ | ハジメ |
| 1 | に | 助詞 | 格助詞 | 一般 | * | * | * | に | ニ | ニ |
| 2 | \n\n | 記号 | 空白 | * | * | * | * | \n\n | * | * |
| 3 | 2 | 名詞 | 数 | * | * | * | * | 2 | ニ | ニ |
| 4 | 0 | 名詞 | 数 | * | * | * | * | 0 | ゼロ | ゼロ |
| 5 | 1 | 名詞 | 数 | * | * | * | * | 1 | イチ | イチ |
| 6 | 1 | 名詞 | 数 | * | * | * | * | 1 | イチ | イチ |
| 7 | 年 | 名詞 | 接尾 | 助数詞 | * | * | * | 年 | ネン | ネン |
| 8 | 3月 | 名詞 | 副詞可能 | * | * | * | * | 3月 | サンガツ | サンガツ |
| 9 | の | 助詞 | 連体化 | * | * | * | * | の | ノ | ノ |
| 10 | 東日本 | 名詞 | 固有名詞 | 地域 | 一般 | * | * | 東日本 | ヒガシニッポン | ヒガシニッポン |
| 11 | 大震災 | 名詞 | 一般 | * | * | * | * | 大震災 | ダイシンサイ | ダイシンサイ |
| 12 | 及び | 接続詞 | * | * | * | * | * | 及び | オヨビ | オヨビ |
| 13 | 東京電力 | 名詞 | 固有名詞 | 組織 | * | * | * | 東京電力 | トウキョウデンリョク | トーキョーデンリョク |
| 14 | 福島 | 名詞 | 固有名詞 | 地域 | 一般 | * | * | 福島 | フクシマ | フクシマ |
| 15 | 第 | 接頭詞 | 数接続 | * | * | * | * | 第 | ダイ | ダイ |
| 16 | 一 | 名詞 | 数 | * | * | * | * | 一 | イチ | イチ |
| 17 | 原子力 | 名詞 | 一般 | * | * | * | * | 原子力 | ゲンシリョク | ゲンシリョク |
| 18 | 発電 | 名詞 | サ変接続 | * | * | * | * | 発電 | ハツデン | ハツデン |
| 19 | 所 | 名詞 | 接尾 | 一般 | * | * | * | 所 | ショ | ショ |
表層形と品詞などの形態素情報を区切っているタブをコンマに置換後、コンマを区切り文字にして分割しリストに保管。リストをpandasのseriesにしてデータフレームに行追加しています。最後に列名をつけて完成です。
これで形態素情報を全て保存したデータフレームができました。
が、エネルギー基本計画(案)全てを変換するのに約1時間かかり、できたCSVは約2.7MBあります(もとのtxtは330KB)。さらに時間短縮、データ要量削減の工夫が必要なようです。
さて、このデータフレームをどう使うのか。前回の名詞(代名詞、非自立名詞をのぞく)でwordcludを作る例をやってみます。dfにエネルギー基本計画(案)全ての形態素情報が入っています。
・名詞(代名詞、非自立名詞をのぞく)を抽出
noun = df[df["品詞"]=="名詞"] noun2=noun[(noun["品詞細分類1"] != "代名詞") & (noun["品詞細分類1"] != "非自立")] noun2
| 単語 | 品詞 | 品詞細分類1 | 品詞細分類2 | 品詞細分類3 | 活用型 | 活用形 | 原形 | 読み | 発音 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | はじめ | 名詞 | 副詞可能 | * | * | * | * | はじめ | ハジメ | ハジメ |
| 3 | 2 | 名詞 | 数 | * | * | * | * | 2 | ニ | ニ |
| 4 | 0 | 名詞 | 数 | * | * | * | * | 0 | ゼロ | ゼロ |
| 5 | 1 | 名詞 | 数 | * | * | * | * | 1 | イチ | イチ |
| 6 | 1 | 名詞 | 数 | * | * | * | * | 1 | イチ | イチ |
| 7 | 年 | 名詞 | 接尾 | 助数詞 | * | * | * | 年 | ネン | ネン |
| 8 | 3月 | 名詞 | 副詞可能 | * | * | * | * | 3月 | サンガツ | サンガツ |
| 10 | 東日本 | 名詞 | 固有名詞 | 地域 | 一般 | * | * | 東日本 | ヒガシニッポン | ヒガシニッポン |
| 11 | 大震災 | 名詞 | 一般 | * | * | * | * | 大震災 | ダイシンサイ | ダイシンサイ |
| 13 | 東京電力 | 名詞 | 固有名詞 | 組織 | * | * | * | 東京電力 | トウキョウデンリョク | トーキョーデンリョク |
| 14 | 福島 | 名詞 | 固有名詞 | 地域 | 一般 | * | * | 福島 | フクシマ | フクシマ |
| 16 | 一 | 名詞 | 数 | * | * | * | * | 一 | イチ | イチ |
| 17 | 原子力 | 名詞 | 一般 | * | * | * | * | 原子力 | ゲンシリョク | ゲンシリョク |
| 18 | 発電 | 名詞 | サ変接続 | * | * | * | * | 発電 | ハツデン | ハツデン |
| 19 | 所 | 名詞 | 接尾 | 一般 | * | * | * | 所 | ショ | ショ |
| 20 | 事故 | 名詞 | 一般 | * | * | * | * | 事故 | ジコ | ジコ |
| 25 | 政府 | 名詞 | 一般 | * | * | * | * | 政府 | セイフ | セイフ |
| 28 | 2 | 名詞 | 数 | * | * | * | * | 2 | ニ | ニ |
| 29 | 0 | 名詞 | 数 | * | * | * | * | 0 | ゼロ | ゼロ |
| 30 | 1 | 名詞 | 数 | * | * | * | * | 1 | イチ | イチ |
"品詞"列から値が"名詞"の行を抽出した後、"品詞細分類1"列が"代名詞"、"非自立"の行を除きました。pandasの複数条件抽出では、"and"の代わりに"&"を使うことに注意(and、orを使うとエラーになる)。
・半角スペースで文字列連結
noun_df=" ".join(list(noun2["単語"]))
条件に適した行を取り出した後、"単語"列を抽出し、リストに変換してjoinで半角スペース区切りの文字列を作ります。これで前回と同様にwordcloudが作れます。
1回ずつ形態素解析をする必要がなくなり、品詞ごとなどの抽出や集計など試行錯誤がやりやすくなりました。
↓こちらはエネルギー基本計画(案)から動詞の原形で作ったwordclud

「する」「進める」が大きく表示され、計画への意欲(?)が現れているようです。
参考:
wordcloudライブラリ
https://amueller.github.io/word_cloud/index.html
資源エネルギー庁:エネルギー基本計画(案)
http://www.enecho.meti.go.jp/committee/council/basic_policy_subcommittee/pdf/basic_policy_subcommittee_002.pdf
修正: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





