COTOHAでTwitterアカウントを分析する

日本語処理を行うCOTOHA APIを用いて、対象のTwitterアカウントの中の人がどのような人物なのか推定するものを作った。
[COTOHA API Portal](https://api.ce-cotoha.com/)

#前提知識
[自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた](https://qiita.com/gossy5454/items/83072418fb0c5f3e269f)
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)
[素人が今更Twitter APIで遊ぶ　〜その１〜](https://qiita.com/masahiro_isono/items/a6cfdd073686100f0ef1)
[「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き](https://qiita.com/youwht/items/16e67f4ada666e679875)

#流れ
1. COTOHA API, Twitter API を利用するためのアカウントをそれぞれ手に入れる。
2. 自分のTwitterアカウントで分析対象のアカウント１つだけをフォローした状態にする。
3. Twitter APIで自分のタイムラインを取得することで、対象アカウントのツイートを取得する。※
4. COTOHAのユーザー属性推定という機能を使って書き手の年齢、性別、趣味、仕事などを推定する。

※本来であれば分析対象のアカウントのタイムラインを直接取得すればいい。しかしこの時点では他人のツイートを取得する方法を知らなかったので、このような間接的な方法をとった。

#ソース
[colab](https://colab.research.google.com/drive/10i2_gV8xSSlwCnp7-84gvphhBMm8BxbF)

###COTOHA用クラス定義、必要なライブラリインストール
```
# 「メントスと囲碁の思い出」
# https://qiita.com/youwht/items/16e67f4ada666e679875

# COTOHA API操作用クラス
class CotohaApi:
  # 初期化
  def __init__(self, client_id, client_secret, developer_api_base_url, access_token_publish_url):
    self.client_id = client_id
    self.client_secret = client_secret
（中略）
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout, errors='ignore')
```
この辺はコピペ。

###Google Driveをマウント
```
drive.mount('/content/drive')
output.clear()
%cd /content/drive/My\ Drive/cotoha-twitter
!ls

実行結果:
/content/drive/My Drive/cotoha-twitter
 config.ipynb  'cotoha-twitter.ipynb のコピー'
```
途中でリンクが出力されるので、飛んだ先でトークンをコピーして、枠に張り付けてEnter

###config.ipynbの中身
```
#Twitter API用
consumer_key = 'XXXXXXXXXX'
consumer_secret = 'XXXXXXXXXX'
access_token = 'XXXXXXXXXX'
access_token_secret = 'XXXXXXXXXX'
#COTOHA API用
CLIENT_ID = "XXXXXXXXXX"
CLIENT_SECRET = "XXXXXXXXXX"
```
XXXXXXXXXXの部分は自分のトークンを入れる。

###config.ipynbをconfig.pyに変換
```
!jupyter nbconvert --to python config.ipynb
```
###Twitterタイムライン取得
```
import config
from requests_oauthlib import OAuth1Session

ck = config.consumer_key
cs = config.consumer_secret
at = config.access_token
ats = config.access_token_secret

twitter = OAuth1Session(ck, cs, at, ats) 

url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'  #エンドポイント指定

params = {'count' : 30, 'exclude_replies': True}

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

if res.status_code == 200:
    timelines = json.loads(res.text)
    print(timelines[0]['user']['name'])
    for line in timelines:
        if line['text'][:2] != 'RT':
            print(line['text'])
            print('---------------------------------------------------')
else:
    print('Failed: %d' % res.status_code) 

実行結果：
高須克弥
「人民戦争」勝利アピール　習近平氏の武漢視察、宣伝工作は迷走 https://t.co/KdptQceXKM @Sankei_newsから
---------------------------------------------------
彼は天才だぜ。 https://t.co/Q542kS3tFd
---------------------------------------------------
フリーメイソンの儀式も武漢肺炎ウイルス対策なう https://t.co/wE5V6oh1gk
---------------------------------------------------
https://t.co/EnFKnkAh52
---------------------------------------------------
https://t.co/Z9752hC1lt
---------------------------------------------------
台湾市民の武漢撤収第２陣、ようやく実現　中台間で紛糾 https://t.co/dVhZ2ZX5W0 @Sankei_newsから
---------------------------------------------------
https://t.co/85PMeBivLg
---------------------------------------------------
🐴🦌 https://t.co/kI118e97hj
---------------------------------------------------
あ👀‼️
また🐴🦌が❗ https://t.co/pyJFXzG1cx
---------------------------------------------------
無知な少年に知識を授けるのは老人の娯楽です。
無知な故に変な思想を持った少年に無知だと知らせ、みんなに気づかせないと、少年は得意になって無知を広めます。
🐴🦌の繁殖を止めるのは僕の仕事でもあります。 https://t.co/ANwqjlZHr3
---------------------------------------------------
上先生は中国のことを全くご存知ないと思います。
石平先生のおっしゃることが本当だと存じます。 https://t.co/PQCd8jkUzh
---------------------------------------------------
少年、無知なのは君です。
この蛇の巻きついている杖は有名なアスクレピオスの杖です。
ギリシャ神話は欧米人の教養です。
アスクレピオスはギリシャの神様アポロンの息子で死んだ人すら生き返らせることのできた存在です。紀元前十五世紀から医… https://t.co/qaAmxxx3py
---------------------------------------------------
```
30件取ってきて、リツイート以外を出力した。今回は高須クリニックの院長を分析対象とした。

###環境変数の読み込みと通信用クラスのインスタンスを生成
```
COTOHA_ID = config.CLIENT_ID
COTOHA_SECRET = config.CLIENT_SECRET
DEVELOPER_API_BASE_URL   = "https://api.ce-cotoha.com/api/dev/"
ACCESS_TOKEN_PUBLISH_URL = "https://api.ce-cotoha.com/v1/oauth/accesstokens"

# COTOHA APIインスタンス生成
cotoha_api = CotohaApi(COTOHA_ID, COTOHA_SECRET, DEVELOPER_API_BASE_URL, ACCESS_TOKEN_PUBLISH_URL)
```
###ユーザー属性推定
```
# RT以外を手でコピペ
document = ["「人民戦争」勝利アピール　習近平氏の武漢視察、宣伝工作は迷走",
            "彼は天才だぜ。",
            "フリーメイソンの儀式も武漢肺炎ウイルス対策なう",
            "台湾市民の武漢撤収第２陣、ようやく実現　中台間で紛糾",
            "無知な少年に知識を授けるのは老人の娯楽です。"]
api_result  = cotoha_api.callUserAttributeApi(document)
print('結果 ＝ {}'.format(api_result['result']))
```
取得したツイートテキストを整形し```document=[]```に自動で入力できればよかったのだが、面倒だったので手でコピペした。

#結果
```
結果 ＝ {'gender': '男性', 'hobby': ['COOKING', 'GOURMET', 'INTERNET', 'SPORTWATCHING', 'TVGAME'], 'moving': ['BUS'], 'occupation': '会社員'}
```
性別：男性
「正解」
趣味：料理、グルメ、インターネット、スポーツ観戦、TVゲーム
「不明」
移動：バス
「不正解」
仕事：会社員
「不正解」

精度は悪い。この結果以外にも数回試して、入力したツイートの違いによって結果に現れる項目の種類や数も変わることが分かった（年齢や収入、既婚、未婚など）。ただ、結果が変わっても項目の半分以上正解することはなかった。

#考察
Twitter APIではタイムラインから一度に200ツイートまで取得できる。しかし今回は手でコピペしたので5件程度しかCOTOHAに入力しなかった。自動でCOTOHAの変数に代入できるようにテキスト整形の処理を入れれば、大量のツイートを使って分析できる。

そのようにして、より多くの文章を使った方が書き手を正確に分析できるだろう。

#課題
- 自分のタイムラインからではなく、対象のアカウントから直接データを取得する。
- 手でコピペせず、ツイートテキストを整形する。

以上の課題は次回の記事で解決する。