Twitterの投稿からワードクラウドを作ってみた

# Twitterからワードクラウドを作りたい！
## 経緯
ある授業でワードクラウドを作る課題をやったところとても面白かったので、自分でもいろいろなものを使ってワードクラウドを作ってみたいと思ったのが始まりです。今回は特定のTwitterアカウントの投稿を取得し、そのワードクラウドを作成するシステムを作ってみたので紹介します。

## 作るぞ！
作ってみます！  
自分のアカウントの投稿を取得してワードクラウドを作ることを目標にします。  
今回作成したコードはgithubにも公開しています。
https://github.com/KojoBarbie/wordcould_practice

<details><summary><b>モジュールのインポート</b></summary><div>

```import.py
!pip install tweepy==4.0
!pip install janome
!pip install demoji

import tweepy
from pprint import pprint
import re
import demoji
from janome.tokenizer import Tokenizer
import collections
%matplotlib inline
from wordcloud import WordCloud
import matplotlib.pyplot as plt
```

</div></details>

### 1. Twitterの投稿の取得
tweepyを使ってツイート情報の取得を行います。
Twitterのapiを使って情報を取得していきます。今までTwitter APIを使用したことのない人は[こちらの記事](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)などを読んでアカウントの申請を行ってください。  
出来たら、API key, API key Secret, Access Token, Access Token Secret, Bearer Tokenの5つをコピーしてきます。

```code.py
# tweepyのclientを作成する
consumer_key = "API keyを入れる"  
consumer_secret = "API key Secretを入れる"
access_token = "Access Tokenを入れる"
access_token_secret = "Access Token Secretを入れる"
Bearer_Token = "Bearer Tokenを入れる"

client = tweepy.Client(
    Bearer_Token, consumer_key, consumer_secret, 
    access_token, access_token_secret)
```

#### 特定のユーザーについて投稿を取得するとき
普段の@から始まるIDではなく、[TwitterIDというサイト](https://tweeterid.com/)を使って得られるIDをもとに取得していきます。  
直近のツイート100件を取得し、1行1投稿としてtxtファイルに保存します。


```code.py
# tweetを取得し、txtファイルに出力
UsersTweets = client.get_users_tweets(user_id, max_results =100)

outputs = ""
for tweet in UsersTweets.data:
    print("Tweet text:", tweet.text)
    outputs += tweet.text.replace("\n", "<br>") + "\n"

f = open('output.txt', 'w', encoding='UTF-8')
f.write(outputs)
f.close()
```

### 2. 取得した文章を綺麗にする
出力した文章をもとにワードクラウドを作りますが、邪魔なものも当然あるわけです。たとえば絵文字やリンクなどはあると精度が落ちてしまうので除きます。また、メンションであったりとか改行も消しておきます。

```code.py
# textをきれいにする関数
def clean_text(text):
  print("before: " + text)
  # リンクを消す
  text = re.sub(r"(https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)", "" , text)
  # 絵文字を消す
  text = demoji.replace(string=text, repl="")
  # 改行を消す
  text = text.replace('<br>', ' ')
  text = text.replace('\n', ' ')
  # メンションも消しておく
  text = re.sub('@\S*\s', '', text)
  print("after: " + text)
  return text
```

関数を定義したので、取得したツイート文章をこの関数にかけながら形態素解析を行います。  
出てきたワードを、名詞のみ・名詞と動詞のみといったように品詞で選別しながら配列に格納していきます。

```code.py
# 形態素解析
t = Tokenizer()
exclusion = []
words = []

for text in array:
  for token in t.tokenize(text):
    p = token.part_of_speech
    if "名詞" in p:
    #if "名詞" in p or p.find("動詞") == 0:
      words.append(token.surface)

print(words)
```

### 3. ワードクラウドを作る！
いよいよワードクラウド作りです。コードをいじくればフォントを変えたりとかいろいろできるみたいです。

```code.py
output_path = "output.png"

# ワードクラウドの生成
wc = WordCloud(background_color="white",
    font_path='/usr/share/fonts/truetype/fonts-japanese-gothic.ttf',
    width=640,height=480)
word = " ".join(words)
wc.generate(word)
wc.to_file(output_path)

# ワードクラウドの表示
array_obj = plt.imread(output_path)
plt.imshow(array_obj)
```

これでワードクラウドの画像が出力できたかなと思います。  
試しに自分の勉強用のアカウント（[@Kojo_foreng](https://twitter.com/Kojo_foreng)。この機会にフォローもぜひ！）でワードクラウドを出力してみました。

![wordcloud_watashi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/c8895f38-6c8a-7e2b-4afd-c515f0000b47.png)

まだ作り立てなので全然ツイートしてないのがばれてしまいますね。笑  
いっぱいツイートしてあるアカウントならもっとごちゃっとしてて面白いと思います。有名な芸能人などのアカウントでも出力できますが、著作権など怪しいかもしれないので自分で遊ぶだけにしておいたほうが賢明そうです。



## やってみたいこと
- TF-IDFを絡めてそのTwitterアカウントでより特徴的な語を抜き出してワードクラウドが作れればいいかなと思った。
- 個人のTwitterアカウントから取得するだけでなく、特定のワード検索でひっかかったツイートでワードクラウドを取得できるようになると楽しそう。
- 直近のツイートが100ツイートまでしかツイートできなかったのでもっとさかのぼってとれるようになりたい。
- Djangoとか使ってTwitterのアカウント名入れたらワードクラウドを出力する、みたいなwebアプリとか作れそう。

やってみて視覚的にとても面白かったので、みなさんもぜひ作ってみてください。

### 参考にしたもの
https://qiita.com/tappypuppy/items/55c99a60c22b7cc1d560

https://qiita.com/shibacow/items/1e0b7a389dd46e4bde91