2019年のnemをWordCloudで可視化する


この記事は、nem#2 アドベントカレンダー2019の記事です。

この記事の内容

①nem関連の文書から文字だけを抜き出して、
②Mecabで品詞に分解して、WordCloudで可視化します。
③さらに、ただのWordCloudじゃ面白くないので、一手間加えます。

環境

Mac 10.15.1
Python 3.7.4

1. nem関連の文書から文字だけを抜き出す

さて、nem関連の文書で2019年のまとめっぽいモノといえば、なんでしょうか...
そうですね。アドベントカレンダーですね。

今回は、今年のnemアドベントカレンダーの全記事から文字列を抜き出して
それやるなら、最終日取っておかないとあんまり意味なさそうなので、とりあえず一発目の記事
@44uk_i3 さんの NEM1 と NEM2 で変わる仕様まとめの記事から文章をいただきます。
(ちゃんと、許可はもらってます)

とりあえずソースコードを貼っていくスタイル

scrapy.py
import urllib.request
from bs4 import BeautifulSoup

text = []

# 対象サイトのURL
url = 'https://qiita.com/44uk_i3/items/53ad306d2c82df41803f'
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html,'html.parser')

# Qiitaの記事は、<div class="p-items_article">内が本文なので
article =  soup.findAll('div' , class_= 'p-items_article')

# 本文からテキストだけを抜き出す
for i in article:
    text.append(i.text)

# 抜き出したテキストをnem.txtに保存する
file = open('nem.txt','w',encoding='utf-8')
file.writelines(text)
file.close()

特筆すべきところはないかな、と思ってます。何かあったらコメントしてください。

2. Mecabで品詞に分解してWordCloudで可視化する

はい、分解します。こうして書いていると、初めてMecab使って感動した日のことを思い出します。

Mecabってのは、こういうやつです。

$ mecab
すもももももももものうち
すもも   名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち  名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

ソースコードで語る

nem_wordcloud.py
import MeCab
from wordcloud import WordCloud

# 保存したテキストをひらく
data = open("./nem.txt","rb").read()
text = data.decode('utf-8')

mecab = MeCab.Tagger('-Ochasen')
mecab.parse('')

# 形態素解析する
node = mecab.parseToNode(text)

# WordCloudに使用する単語リスト
output = []

# 品詞を使って単語を分ける
while node:
  word = node.surface
  hinnsi = node.feature.split(",")[0]
  # 配列に追加する品詞を指定
  if hinnsi in ["動詞","副詞","形容詞","名詞"]:
    output.append(word)
  node = node.next

text = ' '.join(output)

# 日本語フォントのパス(mac)
fpath = "/System/Library/Fonts/ヒラギノ明朝 ProN.ttc"

# WordCloud生成。背景色とか指定
wc = WordCloud(
    background_color="white",
    font_path=fpath,
    width=800,
    height=600).generate(text)

# pngで保存
wc.to_file("./wc.png")

はい、フォントは好きに変えてください。
Macのデフォルトフォントは/System/Library/Fonts/にあります。Windowsはググってください。

ここまでで出来上がったモノ

それっぽいモノできました。

3. もう一手間加える

ここまでの内容ならQiitaにもたくさん記事が転がっているので、もう一手間加えます。

ソースコードで先にネタバレする

nem_wordcloud_2.py
import MeCab
from wordcloud import WordCloud
import numpy as np
from wordcloud import WordCloud ,ImageColorGenerator
from PIL import Image

# 保存したテキストをひらく
data = open("./nem.txt","rb").read()
text = data.decode('utf-8')

mecab = MeCab.Tagger('-Ochasen')
mecab.parse('')

# 形態素解析する
node = mecab.parseToNode(text)

# WordCloudに使用する単語のリスト
output = []

# 品詞を使って単語を分ける
while node:
  word = node.surface
  hinnsi = node.feature.split(",")[0]
  # 配列に追加する品詞を指定する
  if hinnsi in ["動詞","副詞","形容詞","名詞"]:
    output.append(word)
  node = node.next

# 日本語フォントのパス(mac)
fpath = "/System/Library/Fonts/ヒラギノ明朝 ProN.ttc"

text = ' '.join(output)

imagepaht = "./nem_icon_black.png"
img_color = np.array(Image.open(imagepaht))

wc = WordCloud(
    width=800,
    height=800,
    font_path=fpath,
    mask=img_color,
    background_color="white",
    collocations=False,).generate(text)

wc.to_file("./wc_nem.png")

はい、まずこんな画像を用意しました。

みなさんご存知、あのアイコンを真っ黒にしました。
この画像が、imagepahtに指定している./nem_icon_black.pngです。

で、このコードを実行すると出来上がる画像がこちらです。

出来上がったモノ

思ったより良さげ。

まとめ

もう少しデータ量を増やしてやれば、2019年のnemの大事なことが何だったのかとか分析できそう

おまけ

元画像を変えたり、設定をいじることでこんなバージョンも作れます。