KNIMEとか倉庫

KNIMEやEXCELなどの備忘録です。

【Python】日本語でワードクラウドしたい

・お題:先日、英語の文章をそれっぽく画像にするワードクラウドで遊んだ。今回は、日本語でワードクラウドしてみたい。

 

・先日のライブラリ(wordcloud)に日本語の文章を放り込んでも、なんだか思ったようにいかなかったので、ちょっといろいろ弄って日本語のワードクラウドを作ってみた。

・うまくいかなかった例として、先日のwordcloudに日本語の文章を放り込んでみる。

・まず、テキストデータをダウンロードする。今回は、青空文庫のアクセス数ランキング1位の「こころ」をテキストファイルでダウンロードし、zipを解凍した。

www.aozora.gr.jp

・次に、テキストデータをメモ帳で開き、文字コードUTF-8に変更してカレントディレクトリに保存(下図)。

・次に、前回と同じようにPythonのwordcloudライブラリに放り込んだ。ちなみに、フォントデータ(.ttfファイル)もカレントディレクトリに入れてある。

from wordcloud import WordCloud
text = open("kokoro.txt", encoding="utf8").read()
wc = WordCloud(font_path="azuki.ttf", max_font_size=50).generate(text)
wc.to_file("kokoro.png")

・すると、以下のような画像が得られた。思っていたのと違う。。

・日本語の場合、スペースなどのように明示的に単語が区切られないのが原因っぽい。あと、名詞が分かりにくい。

・方針として、日本語の文章を単語に分解し、固有名詞を抽出し、スペースで結合したものをwordcloudに投げることを考える。

・日本語を分解するのに、mecab-python3というライブラリを使う。インストールは割愛。

・まず、textを分解する。

import MeCab
text = open("kokoro.txt", encoding="utf8").read()

mecab = MeCab.Tagger()
Bunkai = mecab.parse(text)

・これで、Bunkaiは以下のように文章が単語に分解されたものになる(kokoro.txtの頭の方を削っているので、そのまま使った場合と少し見た目が違うかもしれない)。

'\u3000\t\t\t\u3000\t空白\t\t\t\n私\tワタクシ\tワタクシ\t私-代名詞\t代名詞\t\t\t0\n《\t\t\t《\t補助記号-括弧開\t\t\t\nわたくし\tワタクシ\tワタクシ\t私-代名詞\t代名詞\t\t\t0\n》\t\t\t》\t補助記号-括弧閉\......

・改行で区切ってリストにする。

Kaigyo = Bunkai.split("\n")

・これで、Kaigyoは以下のようになる。

['\u3000\t\t\t\u3000\t空白\t\t\t',
 '私\tワタクシ\tワタクシ\t私-代名詞\t代名詞\t\t\t0',
 '《\t\t\t《\t補助記号-括弧開\t\t\t',

・次に、リストKaigyoの中で、「固有名詞」という単語が含まれている要素を抽出する。

KoyuMeishi_Yoso = [n for n in Kaigyo if "固有名詞" in n]

・これで、KoyuMeshi_Yosoは以下のようになる。この鎌倉っぷりよ。。

['鎌倉\tカマクラ\tカマクラ\tカマクラ\t名詞-固有名詞-地名-一般\t\t\t0',
 '鎌倉\tカマクラ\tカマクラ\tカマクラ\t名詞-固有名詞-地名-一般\t\t\t0',
 '勧\tススム\tススム\tススム\t名詞-固有名詞-人名-名\t\t\t0',
 '東京\tトーキョー\tトウキョウ\tトウキョウ\t名詞-固有名詞-地名-一般\t\t\t0',

・次に、この各要素を\tで区切ってリストを作成し、その先頭にある固有名詞そのもののみのリストを作成する。

KoyuMeishi_List=[n.split("\t")[0] for n in KoyuMeishi_Yoso]

・これで、KoyuMeishi_Listは以下のようになる。品詞に誤りが多いのは、留意しておく。

['鎌倉',
 '鎌倉',
 '勧',
 '東京',

・次に、これをスペースでくっつけて一つにまとめる。

ForWC=" ".join(KoyuMeishi_List)

・これで、ForWCは以下のようになる。

'鎌倉 鎌倉 勧 東京 大分 鎌倉 中国 鎌倉 廻 長谷 日本 由井 ゆい 大分 日本 日本 真直 岸 しろ 丁 あお 充 大分 鎌倉 日本 東京 東京 鎌倉 彩 鎌倉 鄭 寧 雑司ヶ谷雑司ヶ谷 めぐ 楓 かえで イサベラ しん 烈 アンドレ ......

・最後に、wordcloudにデータを投げる。

from wordcloud import WordCloud
wc = WordCloud(font_path="azuki.ttf", max_font_size=50).generate(ForWC)
wc.to_file("kokoro2.png")

・これで、kokoro2.pngはこうなった。同じ単語が何度も出てきてしまったが、最初よりはだいぶマシになった気がする。

・いろいろ改善の余地が見つかった。自然言語処理もなかなか楽しそう。

 

おわり