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


この記事は、[nem#2 アドベントカレンダー2019](https://qiita.com/advent-calendar/2019/nem-2)の記事です。

# この記事の内容

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

# 環境

Mac　10.15.1
Python 3.7.4

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

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

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

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

```python: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
```

## ソースコードで語る

```python: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はググってください。

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

![nem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463141/9f6a7b16-e0ce-2bff-cfc3-a28871b474e9.png)

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


# 3. もう一手間加える

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

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

```python: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")
```

はい、まずこんな画像を用意しました。
![nem_icon_black.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463141/2c76f1fe-7d5b-8542-d626-5c0cbf65b9f2.png)

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

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

## 出来上がったモノ

![wc_nem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463141/6b5b6d33-68ec-6d41-c5b2-928c2e63580f.png)

思ったより良さげ。

# まとめ

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

# おまけ

元画像を変えたり、設定をいじることでこんなバージョンも作れます。
![wc_symbol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463141/68ab80fe-e65f-6fe8-2d03-243fdd4b606e.png)