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

#はじめに
自然言語処理における可視化の勉強のために、wordcloudを生成しました！
可視化するデータは、ツイートです。

#流れ
以下のような感じで、wordcloudを生成してます！
①twitterから、任意の文字列を含むツイートを100件取得(今回は、「データサイエンス」が含まれているデータを抽出します)
②取得したデータから、名詞のみを抽出
③抽出した単語群からwordcloudを生成

#ソースコード
① twitterから、任意の文字列を含むツイートを100件取得

```python
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:./json/twitter.json
{
    "CONSUEMR_KEY": "",
    "CONSUEMR_SECRET": "",
    "ACCESS_TOKEN_KEY": "",
    "ACCESS_TOKEN_SECRET": ""
}
```

②取得したデータから、名詞のみを抽出

```python
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を生成

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239022/ca4c7f68-4c59-195e-7021-4b9eba13b3b9.png)

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

#参考記事
* https://qiita.com/kngsym2018/items/2524d21455aac111cdee
* https://qiita.com/kenmatsu4/items/9b6ac74f831443d29074
* https://qiita.com/furipon308/items/be97abf25cf4caa0574e