この記事は、nem#2 アドベントカレンダー2019の記事です。
この記事の内容
①nem関連の文書から文字だけを抜き出して、
②Mecabで品詞に分解して、WordCloudで可視化します。
③さらに、ただのWordCloudじゃ面白くないので、一手間加えます。
環境
Mac 10.15.1
Python 3.7.4
1. nem関連の文書から文字だけを抜き出す
さて、nem関連の文書で2019年のまとめっぽいモノといえば、なんでしょうか...
そうですね。アドベントカレンダーですね。
今回は、今年のnemアドベントカレンダーの全記事から文字列を抜き出して
それやるなら、最終日取っておかないとあんまり意味なさそうなので、とりあえず一発目の記事
@44uk_i3 さんの NEM1 と NEM2 で変わる仕様まとめの記事から文章をいただきます。
(ちゃんと、許可はもらってます)
とりあえずソースコードを貼っていくスタイル
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
ソースコードで語る
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にもたくさん記事が転がっているので、もう一手間加えます。
ソースコードで先にネタバレする
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の大事なことが何だったのかとか分析できそう