Python 実践 データ加工/可視化 100本ノック に挑戦 ノック59

ノック59 : Word Cloudで可視化しよう

ワードクラウドで可視化します。

ワードクラウドを使用すると、単語の出現の頻度に合わせてその単語の大きさがかわって表示されます。

 

ワードクラウドをinstallします。

pip install wordcloud

・・・

Successfully installed wordcloud-1.8.1

 

次に使用するフォントをインストールします。私の環境はWindows10なので、

以下のURLに移動し、日本語フォントをダウンロードします。

 

moji.or.jp

 

URLをスクロールするとダウンロード画面が表示されるのでダウンロードを実行します。明朝とゴシックまたは両方のどれかをダウンロードし、任意のフォルダに解凍します。

 

フォントダウンロード

 

ipaexg.ttfがゴシック体、ipaexm.ttfが明朝体です。

 

では、ワードクラウドを実行してみます。

#タイトルと著者名の取得
with open('data/hashire_merosu.txt',mode='r',encoding='shift-jis') as f :
    title = f.readline()
    author = f.readline()

title  = title.replace('\n','')
author = author.replace('\n','')

#公開日と修正日の取得
with open('data/hashire_merosu.txt',mode='r',encoding='shift-jis') as f :
    content = f.readlines()

import pandas as pd

df = pd.DataFrame(content,columns=['text'])
df['text'] = df['text'].str.replace('\n','')
date = df[(df['text'].str.contains('日公開'))|(df['text'].str.contains('日修正'))].copy()

date['text'] = date['text'].str.replace('公開','')
date['text'] = date['text'].str.replace('修正','')
date['text'] = date['text'].str.replace('年','/')
date['text'] = date['text'].str.replace('月','/')
date['text'] = date['text'].str.replace('日','')

date['text'] = pd.to_datetime(date['text'])

#メイン文をbody変数に
with open('data/hashire_merosu.txt',mode='r',encoding='shift-jis') as f :
    content = f.read()

content = ' '.join(content.split())
import unicodedata
content = unicodedata.normalize('NFKC',content)

import re
pattern = re.compile(r'^.+(#地から1字上げ].+#地から1字上げ]).+$')
body = re.match(pattern,content).group(1)

body=body.replace('#地から1字上げ] ------------------------------------------------------- ','')
body=body.replace(' [#地から1字上げ]','')

#ここまでのデータをデータフレーム型に
release_date = date.iat[0,0] #左側が行、右側が列 0行0列
update_date  = date.iat[1,0] #1行0列

booklist = pd.DataFrame([[title,author,release_date,update_date,body]],
            columns=['title','autor','release_date','update_date','body'])

#ノック54 形態素解析
import MeCab
body = booklist.iloc[0,4]
parsed = tagger.parse(body).split('\n')
parsed = parsed[:-2]

#ノック55
*values, = map(lambda s: re.split(r'\t|,',s),parsed)
columns = ['表層形','品詞','品詞細分類1','品詞細分類2','品詞細分類3','活用型','活用形','原形','読み','発音']
mecab_df=pd.DataFrame(data=values,columns=columns)

#ノック56
# print(mecab_df.groupby(['原形','品詞']).size().sort_values(ascending=False))
# print(mecab_df.loc[mecab_df['品詞']=='名詞'])
# print(mecab_df.loc[(mecab_df['品詞']=='名詞') | (mecab_df['品詞']=='動詞')])

#ノック57
with open('data/stop_words.txt'    ,mode='r',encoding='utf-8') as f :
    stop_words=f.read().split()

#print('除外ワード:',stop_words)

me01 = mecab_df.loc[mecab_df['品詞']=='名詞']
me02 = mecab_df.loc[(mecab_df['品詞']=='名詞') | (mecab_df['品詞']=='動詞')]
#print(len(me01),len(me02))
me01 = me01.loc[~me01['原形'].isin(stop_words)]
me02 = me02.loc[~me02['原形'].isin(stop_words)]
#print(len(me01),len(me02))

#ノック58
count = me01.groupby('原形').size().sort_values(ascending=False)
count.name = 'count'
count = count.reset_index().head(10)
#print(count)

import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib
# plt.figure(figsize=(10,5))
# sns.barplot(x=count['count'],y=count['原形'])
# plt.show()

#名詞+動詞
count = me02.groupby('原形').size().sort_values(ascending=False)
count.name = 'count'
count = count.reset_index().head(10)
#print(count)
#

#ノック59
from wordcloud import WordCloud

font_path = 'IPAexfont00401/ipaexg.ttf'

cloud = WordCloud(background_color='white',font_path=font_path).generate(' '.join(me01['原形'].values))
plt.figure(figsize=(10,5))
plt.imshow(cloud)
plt.axis("off")
plt.savefig('data/wc_me01.png')
plt.show()

WordCloudの引数background_colorで背景色を変更できます。

generate() で表示する単語の情報を渡します。

半角スペース区切りで連結(A BB CCC DD・・・)して渡します。

画像として表示するのでplt.imshow()を使用しています。

軸は必要ないのでplt.axis("off")で消去しています。

保存ファイル名をplt.savefig()で指定しています。

 

実行結果

名詞 Word Cloud

 

 

名詞の原形を表層形に変更した場合のワードクラウドは以下のようになります。

cloud = WordCloud(background_color='pink',font_path=font_path).generate(' '.join(me01['表層形'].values))

plt.figure(figsize=(10,5))
plt.imshow(cloud)
plt.axis("off")
plt.savefig('data/wc_me01_2.png')
plt.show()

実行結果

名詞 表層形 ピンク

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/* -----codeの行番号----- */