見出し画像

MeCabを使いワードクラウドを書いてみた。

前回までに、MeCabをインストールし、jupyter notebook で使えるようにしました。

そこで今回は、自然言語処理といえば、のワードクラウドを書いてみました。

環境は前回と同様の、jupyter notebook で作成していきます。


データのダウンロード

まずは解析するデータを入手したいと思います。

だいたいこのような場合は、夏目漱石さんの「吾輩は猫である」が使われることが多いですね。

それでは面白くないので、私がかつて好きだった江戸川乱歩さんにしてみたいと思います。

江戸川乱歩と言えば、怪人二十面相、ですよね。

ですので、怪人二十面相、を探しましょう。

ちょうど「青空文庫」にテキストデータがあるようです。

https://www.aozora.gr.jp/cards/001779/card57228.html

確かにありました。早速テキストデータをダウンロードし、任意のフォルダーにセーブします。


品詞とその頻度を抽出してみる

こちらのサイトをもとに作成します。

with open('kaijin_nijumenso.txt', encoding='shift-jis') as f:
   txt_data = f.read()

node = tagger4.parseToNode(txt_data)

hcount = {}

while node:
   hinshi = node.feature.split(",")[0]

   if hinshi in hcount.keys():
       freq = hcount[hinshi]
       hcount[hinshi] = freq + 1
   else:
       hcount[hinshi] = 1
   
   node = node.next
   
for key,value in hcount.items():
   print(key + ":" + str(value))

元とほぼほぼ一緒です。

違うのは、怪人二十面相であることとぐらいでしょうか。

実行した結果が以下のとおりです。

BOS/EOS:2
名詞:17960
記号:12466
助詞:17344
動詞:8289
助動詞:7272
接頭詞:321
連体詞:790
副詞:1994
接続詞:524
形容詞:886
感動詞:269
フィラー:25
その他:3

沢山の品詞、特に名詞と記号がありますね。

どんなワードが多いのか楽しみですね。


ワードクラウドを描く

こちらのページを参考にしました。

以外に簡単、ライブラリを読み込むだけのようです。

https://anaconda.org/conda-forge/wordcloud

しかも、Anacondaですでにパッケージがあるようです。

conda install -c conda-forge wordcloud

でインストールするだけです。


次のお手本によるとフォントが必要なようです。

同じ「ヒラギノ角ゴシック W3」を入れましょう。

探したところ、Macではシステムフォルダー内にあるようです。

fpath = "/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc"

として指定しました。


さあ実際に書いてみましょう。

またまたお手本を元に、以下のようにしてみました。

#  名詞のみ取り出してワードクラウドを描く

with open('kaijin_nijumenso.txt', encoding='shift-jis') as f:
   txt_data = f.read()

node1 = tagger4.parseToNode(txt_data)

word1 = ""

while node1:
   hinshi1 = node1.feature.split(",")[0]
   
   if hinshi1 in ["名詞"]:
       origin1 = node1.feature.split(",")[6]
       word1 = word1  + " " + origin1
       
   node1 = node1.next

wordcloud1 = WordCloud(background_color = 'white', font_path = fpath, width=600, height=400, min_font_size=15)
wordcloud1.generate(word1)

wordcloud1.to_file("./wordcloud_meishi.png")

数字のところは適宜変えてください。(例 node1 nodeでもOK)

名詞のみにしたのは、文章が長く、処理に時間がかかりそうだったからです。

実行します。

で、実行した結果が上のサムネイルに貼り付けたものです。

画像1

二十面相、小林、明智、少年、などなど乱歩ファンは興味をそそられるワードがありますね。


この程度ならあっという間でした。それ以外は結構時間がかかるようです。

今やっているのは、

名詞かつ要らない用語を削除する。

というスクリプトです。

それ以外にも、お手本どおり、動詞と形容詞を含めて、も実行しています。


で、まだ終わっていません。

結構時間かかるものですね。というのが印象です。

怪人二十面相、重かったのかもしれません。

ちょっと題材を変えてみたほうが良さそうです。


おまけ

時間計測方法

こういう処理をしていると、結構時間があっかかる報告です。

https://qiita.com/fantm21/items/3dc7fbf4e935311488bc

こちらのサイトをもとに、かかった時間が計算できるようです。

import time

start = time.time()

これで開始時刻が収集されます。

終わり時間は

elapsed_time4 = time.time() - start4
print("elapsed_time{0}".format(elapsed_time4) + "[sec]")

で終わります。

この記事が気に入ったらサポートをしてみませんか?