12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

nem #2 Advent Calendar 2019

Day 22

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

Last updated at Posted at 2019-12-22

この記事は、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はググってください。

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

nem.png

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

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")

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

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

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

出来上がったモノ

wc_nem.png

思ったより良さげ。

まとめ

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

おまけ

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

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?