#はじめに
自然言語処理における可視化の勉強のために、wordcloudを生成しました!
可視化するデータは、ツイートです。
#流れ
以下のような感じで、wordcloudを生成してます!
①twitterから、任意の文字列を含むツイートを100件取得(今回は、「データサイエンス」が含まれているデータを抽出します)
②取得したデータから、名詞のみを抽出
③抽出した単語群からwordcloudを生成
#ソースコード
① twitterから、任意の文字列を含むツイートを100件取得
import tweepy
import json
#twitterAPIのためのconfigファイル
JSON_LOAD_FILE = r"./json/twitter.json"
#twitterからデータを抽出するときの検索ワード
SEARCH_WORD = "データサイエンス"
#twitterからデータを抽出するときの取得件数
SEARCH_COUNT = 100
#tweeterAPIと繋げるAPIインスタンスを生成する
def twitter_api_connect():
#twiteerのAPIを利用するためのキーを取得
conf = json_load(JSON_LOAD_FILE)
#twiteerのAPIを利用するための、認証データ作成
auth = tweepy.OAuthHandler(conf['CONSUEMR_KEY'], conf['CONSUEMR_SECRET'])
auth.set_access_token(conf['ACCESS_TOKEN_KEY'], conf['ACCESS_TOKEN_SECRET'])
#twitterのAPIインスタンス生成
twitter_api = tweepy.API(auth, wait_on_rate_limit = True)
return twitter_api
#tweetのデータを取得し、リスト化し、返却する
def tweet_list_create(twitter_api, search_word, search_count):
#カーソルを使用してデータ取得
search_tweets = twitter_api.search(q = search_word, count = search_count)
#tweetの内容を格納するためのリスト変数
search_tweet_list = []
#取得したtweetの内容をリストに格納
for search_tweet in search_tweets:
search_tweet_list.append(search_tweet.text)
return search_tweet_list
# JSONファイルの読み込み
def json_load(file_path):
with open(file_path, 'r') as f:
conf = json.load(f)
return conf
#twitterのAPIインスタンス生成
twitter_api = twitter_api_connect()
#twitterからデータを取得
search_tweet_list = tweet_list_create(twitter_api, SEARCH_WORD, SEARCH_COUNT)
twitterAPI用のconfigファイルは以下のような感じです。
./json/twitter.json
{
"CONSUEMR_KEY": "",
"CONSUEMR_SECRET": "",
"ACCESS_TOKEN_KEY": "",
"ACCESS_TOKEN_SECRET": ""
}
②取得したデータから、名詞のみを抽出
import MeCab
#形態素解析し、単語をリスト化するときの品詞の条件
GET_WORD_CLASS = ['名詞', '形容詞']
#mecabのインスタンス生成
mecab = MeCab.Tagger ('-Ochasen')
mecab.parse('')
def word_list_create(sentences, get_word_class):
#複数文から、指定の品詞(GET_WORD_CLASS)を抽出した単語リスト
sentences_word_list = []
for sentence in sentences:
#一文から、指定の品詞(GET_WORD_CLASS)を抽出した単語リスト
one_sentence_word_list = []
#形態素解析
node = mecab.parseToNode(sentence)
while node:
#語幹
word = node.feature.split(",")[-3]
#品詞
word_class = node.feature.split(",")[0]
#(指定の品詞(GET_WORD_CLASS)である) and (語幹が*のもの(つまり未知語))場合は、単語リストに追加
if word_class in get_word_class and word != '*':
one_sentence_word_list.append(word)
node = node.next
sentences_word_list.extend(one_sentence_word_list)
return sentences_word_list
#twitterデータから、指定の品詞の単語リストを生成
word_list = word_list_create(search_tweet_list, GET_WORD_CLASS)
③抽出した単語群からwordcloudを生成
from collections import Counter
from matplotlib import pyplot as plt
from wordcloud import WordCloud
#wordcloud用のフォントパス
WORDCLOUD_FONT_PATH = 'C:\Windows\Fonts\yumin.ttf'
#wordcloud用の幅
WORDCLOUD_WIDTH = 800
#wordcloud用の高さ
WORDCLOUD_HEIGHT = 500
#wordcloud用の背景色
WORDCLOUD_BG_COLOR = 'white'
#twitterからデータを抽出するときの検索ワード
SEARCH_WORD = "データサイエンス"
def word_cloud_png_creater(word_list, font_path, width, height, bg_color, search_word):
word_counter = Counter(word_list)
wc = WordCloud(font_path=font_path,
width=width,
height=height,
background_color=bg_color).generate_from_frequencies(word_counter)
wc.to_file('./result/{}.png'.format(search_word))
#'./result/'フォルダに、検索文字列.pngでwordcloud作成
word_cloud_png_creater(word_list, WORDCLOUD_FONT_PATH, WORDCLOUD_WIDTH, WORDCLOUD_HEIGHT, WORDCLOUD_BG_COLOR, SEARCH_WORD)
#最後に
読んでいただき、ありがとうございました!!
今回は、シンプルな処理でwordcloudを生成しましたが、stopwordとか、ユーザー辞書登録とかしたりして、もう少し遊んでみたいなと感じました。
自然言語処理における単語頻度分析って、実は頻度が多い単語よりも、少し少ないくらいの単語のほうが重要であったりすんですよね~。(なんていう法則か忘れちゃいました。。。汗)
#参考記事