・お題:先日、英語の文章をそれっぽく画像にするワードクラウドで遊んだ。今回は、日本語でワードクラウドしてみたい。
・先日のライブラリ(wordcloud)に日本語の文章を放り込んでも、なんだか思ったようにいかなかったので、ちょっといろいろ弄って日本語のワードクラウドを作ってみた。
・うまくいかなかった例として、先日のwordcloudに日本語の文章を放り込んでみる。
・まず、テキストデータをダウンロードする。今回は、青空文庫のアクセス数ランキング1位の「こころ」をテキストファイルでダウンロードし、zipを解凍した。
・次に、テキストデータをメモ帳で開き、文字コードを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はこうなった。同じ単語が何度も出てきてしまったが、最初よりはだいぶマシになった気がする。
・いろいろ改善の余地が見つかった。自然言語処理もなかなか楽しそう。
おわり