LoginSignup
4
6

More than 3 years have passed since last update.

ツイートデータから、wordcloudを生成してみたゾ!

Last updated at Posted at 2019-12-01

はじめに

自然言語処理における可視化の勉強のために、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)

結果

データサイエンス.png

最後に

読んでいただき、ありがとうございました!!
今回は、シンプルな処理でwordcloudを生成しましたが、stopwordとか、ユーザー辞書登録とかしたりして、もう少し遊んでみたいなと感じました。
自然言語処理における単語頻度分析って、実は頻度が多い単語よりも、少し少ないくらいの単語のほうが重要であったりすんですよね~。(なんていう法則か忘れちゃいました。。。汗)

参考記事

4
6
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
4
6