ツイートをsklearnとpandasで可視化

# 内容
機械学習の勉強で下記のような仕組みを作成してみました。
Twitter APIを使用して指定したキーワードのツイートをダウンロードします。
ダウンロードしたツイートをBag of Words（BoW）を使用して自然言語処理を実施します。
処理した内容からPandasのDataFrameを使用してキーワードTOP50のグラフを作成します。
![tw1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/d93ab4cb-e1c7-7fd9-816e-937b47ebcab2.png)

キーワードをQiita、取得ツイート数を1000に設定して取得したグラフが下記になります。
![tw2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/db288a79-ed2f-025e-e6a4-09568c600f0c.png)

# Bag of Words(BoW)
文章を単語に分割して、出現するボキャブラリの一覧を構築。各ボキャブラリが現れる回数をカウントします。
例えば「It is sunny today. How about tomorrow」という文章を下記のように単語に分割します。
「"It" "is" "sunny" "today" "How" "about" "tomorrow"」

日本語は英語のようにスペース区切りでないのでMeCabという形態素解析を使用して単語分割を行います。
例） 私は千葉に住んでいます　→　"私" "は" "千葉" "に" "住ん" "で" "い" "ます"

# ストップワード
分析の役に立たない単語を取り除く手法です。上記だと"で" "い" "ます"など。
ストップワードのリストを作っておいて該当の単語を除外します。

# Twitter API
プログラムからツイートを取得するのに必要です。
TwitterにDeveloperアカウントを申請するとAPIキーやAPIシークレットが払い出されますので
これを使用してTwiiterにアクセス可能です。

# 手順
## モジュールダウンロード
```bash
pip install tweepy
pip install mecab-python3
```
## MeCab設定
* MeCabインストール
最新版をダウンロードしてインストールします。インストール時に「UTF-8」を選択します。

* 環境変数に追加
 Windowsの場合MeCabの実行ディレクトリを追加します。（例）C:\Program Files\MeCab\bin

## ツイートダウンロード

* API_KEYなどを入力します。
* countはダウンロードするツイートの数、keywordにキーワードを入力します。
* data/配下に日付のファルダが作成されその中にツイートがダウンロードされます。

```python
import datetime
import os
import tweepy

# Create directory for tweet data
dt_now = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
tweet_dir = 'data/' + dt_now
os.makedirs(tweet_dir, exist_ok=True)

# Authentication to twitter api
API_KEY = 'xxxxxxxxxxxxx'
API_SECRET = 'xxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxx'
ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# Get tweet data from twitter api
api = tweepy.API(auth)

## Number of acquisitions
count = 1000
keyword = 'Qiita'

for tweet, count in zip(tweepy.Cursor(api.search_tweets, q = keyword).items(count), range(count)):
    with open(tweet_dir + '/' + str(count) + '.txt', 'a', encoding='utf-8') as f:
        f.write(tweet.text)
```

## BoW処理～グラフ作成

* tweet_data_folderに分析対象のフォルダを指定します。
* countにツイート数を入力します。（ツイートダウンロードで指定した数です。）

```python
import numpy as np
import pandas as pd
import matplotlib
from sklearn.feature_extraction.text import CountVectorizer
import MeCab

tweet_data_folder = '20220528_140110'
count = 1000

# Insert text data to List
tweet_list = []
for i in range(count):
    with open('data/' + tweet_data_folder + '/' + str(i) + '.txt', 'r',encoding='utf-8') as f:
        data = f.read()
        tweet_list.append(data)

# Create stop words list
path = "stop_words.txt"
stop_words = []
for w in open(path, "r", encoding='utf-8'):
    w = w.replace('\n','')
    if len(w) > 0:
        stop_words.append(w)        
        
# Word splitting using mecab
mecab = MeCab.Tagger("-Owakati")
mecab_text = [mecab.parse(text).strip() for text in tweet_list]

vect = CountVectorizer(min_df = 5, stop_words=stop_words)
vect.fit(mecab_text)
result = vect.fit_transform(mecab_text).toarray()

# Create Dataframe of TOP 50
df = pd.DataFrame(np.sum(result, axis=0), 
    columns = ['count'], index = vect.get_feature_names())
df_sort = df.sort_values('count', ascending=False).head(50)

# Create Graph of TOP
font = {'family' : 'Meiryo'}
matplotlib.rc('font', **font)
df_sort.plot(kind='bar',legend=False, figsize=(20, 10))
```