twitterからwordcloudを生成してみた

pythonの勉強のためにwordcloudを生成してみました

まず，twitterAPIを利用して特定のユーザのリツイートを除くツイート200件を取得します

次にそのツイートを形態素解析にかけ，名詞のみを抽出し，ストップワードを除いた単語をwordcloudモジュールに投げます

最後にmatplotlibを利用して画像を出力すれば終わりです．

プログラムではタイムラインを取得した時にtext形式で書き出してますが，これはもともとタイムラインを取得してtext形式で書き出すというプログラムをコピペしたからです．

# プログラム

```Python
import sys
import json
import twitter_config
from requests_oauthlib import OAuth1Session
import csv
import MeCab
import re
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from bs4 import BeautifulSoup
from collections import Counter, defaultdict

# twitterのタイムラインを取得する
def get_timeline(usr_name):
    CK = twitter_config.CONSUMER_KEY
    CS = twitter_config.CONSUMER_SECRET
    AT = twitter_config.ACCESS_TOKEN
    ATS = twitter_config.ACCESS_TOKEN_SECRET
    twitter = OAuth1Session(CK, CS, AT, ATS)

    url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

    params = {'screen_name': usr_name, 'count': 200,
              'exclude_replies': True, 'include_rts': False}

    req = twitter.get(url, params=params)

    if req.status_code == 200:
        search_timeline = json.loads(req.text)
        with open(usr_name + '_tweet.txt', 'w') as f:
            for tweet in search_timeline:
                f.write(tweet['text'] + '\n')
    else:
        print("ERROR: %d" % req.status_code)

# テキスト整形
def format_text(text):
    text = re.sub(r"(https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)", "" ,text)


    return text

# 名詞を抽出する
def pic_noun(texts):
    t = MeCab.Tagger()
    words = []
    for chunk in t.parse(texts).splitlines()[:-1]:
        (surface, feature) = chunk.split('\t')
        feature = feature.split(',')[0]
        if feature == '名詞':
            words.append(surface)
    return words

        
def word_cloud(usr_name):
    file_name = usr_name + '_tweet.txt'
    with open(file_name, 'r') as f:
        texts = f.read()
        texts = format_text(texts)

    with open('stop_words.txt', 'r') as f:
        stop_list = []
        for line in f.readlines():
            stop_list.append(line[:-1])

    words = pic_noun(texts)
    text = ' '.join(words)

    # word_cloudの設定
    fpath = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
    wordcloud = WordCloud(background_color='white',
                          font_path=fpath, width=900, height=500, stopwords=set(stop_list)).generate(text)

    plt.figure(figsize=(15, 12))
    plt.imshow(wordcloud)
    plt.axis('off')
    plt.savefig(usr_name + '.png')

if __name__ == '__main__':
    arg = sys.argv
    if len(arg) == 1:
        print('ユーザ名がありません')
        sys.exit()

    get_timeline(arg[1])
    word_cloud(arg[1])

```
# 生成した例

![sakuramanaTeee.png](https://qiita-image-store.s3.amazonaws.com/0/237843/79658717-4625-4c99-5461-a833b99f4e75.png)

# 参考
[PythonでWordCloudを利用してTwitterアカウントを可視化する](https://www.utali.io/entry/2016/10/03/001210)

[【Pythonでテキストマイニング】TwitterデータをWordCloudで可視化してみる](http://www.randpy.tokyo/entry/python_wordcloud)

[Word Cloudで文章の単語出現頻度を可視化する。[Python]](https://qiita.com/kenmatsu4/items/9b6ac74f831443d29074)

[スタバのTwitterデータをpythonで大量に取得し、データ分析を試みる その１](https://qiita.com/kenmatsu4/items/23768cbe32fe381d54a2)

[Pythonでサクッと簡単にTwitterAPIを叩いてみる](https://qiita.com/ogrew/items/0b267f57b8aaa24f1b73)

[Twitter REST APIの使い方](https://syncer.jp/Web/API/Twitter/REST_API/)

[TwitterAPI でツイートを大量に取得。サーバー側エラーも考慮（pythonで）](http://ailaby.com/twitter_api/)

[GET statuses/user_timeline - ユーザータイムラインを取得する](https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/user_timeline/)

[Pythonで余計な文字列を削除する方法](https://hacknote.jp/archives/19937/)

[正規表現でURLを削除](http://labo.utsubo.tokyo/2017/07/11/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A7url%E3%82%92%E5%89%8A%E9%99%A4/)

[ストップワード](http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt)