はじめに
機械学習に使うためにツイートを収集したのですが、せっかくなので可視化をしてみました。
その方法を、ここに残しておきます。
対象者
・Pythonのプログラムをある程度書ける
・wordcloudに興味がある方
環境
Python 3.8.3
mecab-python3
WordCloudとは
WordCloudは、文章中で出現頻度が高い単語を複数選び出し、その頻度に応じた大きさで図示する手法。ウェブページやブログなどに頻出する単語を自動的に並べることなどを指す。文字の大きさだけでなく、色、字体、向きに変化をつけることで、文章の内容をひと目で印象づけることができる。(デジタル大辞泉の解説より)
簡単に言うと、単語の出現頻度を分かりやすいように可視化するというとです。
これを容易に実装してくれるライブラリがpythonにあります。
本記事を読んでいただくと、下図のようなものを作れるようになります。
MeCabとは
文章を形態要素解析してくれるライブラリです。
文章・フレーズを「意味を持つ最小限の単位」に分解すること。
例えば、
「私は会社でプログラミングをします」 という文章を形態素解析を行うと、
「私 / は / 会社 / で / プログラミング / を / し / ます」 のように最小限の単位に分割できます。
このライブラリを用いることで、上のWordCloudのように単語のみを抽出できます。
データ収集
実際にはTwitterAPIを用いたツイート取得を行い約7万件のデータ収集しましたが、その方法は今回は割愛します。
今後、自分の中で最適なプログラムが組めたらまた別で記事を書くかもしれません。
WordCloudの生成
最後にWordCloudを生成するのですが、WordCLoudは日本語のフォントに対応ていないため、ここから
(https://moji.or.jp/ipafont/ipa00303/)
4書体パック(Ver.003.03)をダウンロードし、適当な場所に回答した後、ipag.ttfという名前のファイルを、下のプログラムと同じ階層においてください(わかる方はフルパスでも大丈夫です)。
word_except_fileには「コロナ」「感染」など、その単語と関係することが容易にわかるような単語を除外できるように、「コロナ」に近しい言葉が入っています。
また、形態要素解析でどうしても出てきてしまうような不要単語も除外リストに入っています。
実行方法
python3 makeWordCloud.py colona_data.txt except_word_list.txt
分かる方は適宜自分の環境に書き換えてください。
import MeCab
import sys
from matplotlib import pyplot as plt
from wordcloud import WordCloud
args = sys.argv
input_file = args[1]
word_except_file = args[2]
# テキストファイル読み込み
with open('input_file', mode='rt', encoding='utf-8') as fi:
source_text = fi.read()
# MeCabの準備
tagger = MeCab.Tagger()
tagger.parse('')
node = tagger.parseToNode(source_text)
# 名詞を取り出す
word_list = []
while node:
word_type = node.feature.split(',')[0]
if word_type == '名詞':
word_list.append(node.surface)
node = node.next
# 除外ワードの読み込み
except_word_list = []
f = open(except_word_file)
for i in f:
except_word_list.append(i.rstrip())
# リストを文字列に変換
word_chain = ' '.join(word_list)
# ワードクラウド作成
W = WordCloud(width=640,height=480,background_color='white',font_path="./ipag.ttf",stopwords = except_word_list).generate(word_chain)
plt.imshow(W)
plt.axis('off')
plt.show()
最後に
初めてQiitaに投稿したので、分からない点なども多かったですが、楽しかったです。
不明な点や、改善すべき点などがあればコメントでお願いします。
またなにか思いついたら投稿してみようと思います。
それでは。