COTOHAでTwitterアカウントを分析する #2（#2からでも読める）

日本語処理するCOTOHA APIを用いてTwitterアカウントの中の人がどのような人物なのかを推定するものを作った。
前回の課題に加え、精度改善のための工夫もいくつか含む。
[COTOHA API Portal](https://api.ce-cotoha.com/)

#流れ
1. COTOHA API, Twitter API を利用するためのアカウントをそれぞれ手に入れる（説明しない）。
2. Twitter APIで対象アカウントのタイムラインから200ツイート取得する。
3. COTOHAの**ユーザー属性推定**という機能を使って書き手の年齢、性別、趣味、仕事などを推定する。

#ソース
[colab](https://colab.research.google.com/drive/1lMT7VeIOhPB--iRGBiqWBt1HrMf9CCTA)

###COTOHA API用クラス定義
```
# 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
    self.developer_api_base_url = developer_api_base_url
    self.access_token_publish_url = access_token_publish_url
    self.getAccessToken()
（中略）
  # ユーザ属性推定API
  def callUserAttributeApi(self, document):
    url = self.developer_api_base_url + "nlp/beta/user_attribute"
    data = {
      "document": document,
      "type":"kuzure",  #SNSなどの崩れた文を解析する
      "do_segment":True #	文区切りを実施する
    }
    return self.callCotohaApiCommon(url, data)
```
- 前回は触れていなかった```"type":"kuzure"```を追加した。
- リファレンスを見るとユーザー属性推定のために入力するデータは文のリストであることが望ましいと分かった。ツイートは複数の文を含むので、```"do_segment":True```によって文区切りを実施した。

###Twitter API用のライブラリをインストール、モジュールのimport、Googleドライブをマウント
```
（略）
```

###Twitterタイムライン取得
```
# --------------------------------------------------------------------
def define_client_proc():
    ck = config.consumer_key
    cs = config.consumer_secret
    at = config.access_token
    ats = config.access_token_secret
#
    consumer = oauth.Consumer(key=ck, secret=cs)
    access_token = oauth.Token(key=at, secret=ats)
    client = oauth.Client(consumer, access_token)
#
    return client
# --------------------------------------------------------------------
def get_tweets_proc(client,screen_name):  #user_idからscreen_nameに変更（以下同様）
    nnx = 200   #取得するツイート数
    url_base = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name="
    url = url_base + screen_name + "&count=" + str(nnx) + "&exclude_replies=True" + "&include_rts=False"  #
    array_aa = []
    response, data = client.request(url)
    if response.status == 200:
        json_str = data.decode('utf-8')
#       print(json_str)
        array_aa = json.loads(json_str)
        sys.stderr.write("len(array_aa) = %d\n" % len(array_aa))
#
    else:
        sys.stderr.write("*** error *** get_ids_proc ***\n")
        sys.stderr.write("Error: %d\n" % response.status)
#
    return  array_aa
# --------------------------------------------------------------------
#
screen_name = "katsuyatakasu"   #ここでアカウントの@以下のユーザー名を入力
#
client = define_client_proc()
#
array_aa = get_tweets_proc(client,screen_name)
#
sys.stderr.write("len(array_aa) = %d\n" % len(array_aa))
#
document = []   #空のリスト

for unit_aa in array_aa:
    tweet = unit_aa['text']
    if tweet[:13] != 'https://t.co/':   #リンクのみのツイートを除外
        tweet = re.sub('\n|\u3000| |https://t\.co/.*', '', tweet)  #改行、全角空白、半角空白、リンク以降を削除
        document.append(tweet)   #リストに追加
#

print(document)
```
- ```nnx = 200```取得するツイート数は最大の200件とした。
- ```exclude_replies=True``` ```&include_rts=False```リプライ、リツイートを除外。
- ```screen_name = "katsuyatakasu"```前回との比較をするため分析対象は高須院長とした。
- ```re.sub('\n|\u3000| |https://t\.co/.*', '', tweet)```COTOHAに入力できる形にテキスト処理。

###ユーザー属性推定
```
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)
#
for tweet in document:
  print(tweet)
api_result  = cotoha_api.callUserAttributeApi(document)
print('\n結果 ＝ {}'.format(api_result['result']))
```

#結果
```
流言蜚語を広める、上先生の知人の政府関係者は嫌な奴ですね。
かっちゃんの警鐘に対して「エビデンスはあるのか？」というクレームが数多く寄せられれた。警鐘を鳴らす人は過去の経験の無意識のプロファイリングから未知の危険を察知するのだ。いわゆる「勘」ってやつだ。
これは故意です。犯罪だと思います。
過剰な自粛だからこそ医療崩壊が防げているのです。武漢→韓国→イタリアを見ればわかるように病院がごったがえす時は医療崩壊の時です。乗り切りましょう。人間は死んだら終わりですが。経済は必ず復活できます。
独首相、人口の6～7割感染も拡大阻止を強調|2020/3/12-共同通信
だから「お年寄りと持病持っている人だけでも下船させて隔離してください」と声を枯らしてお願いしたのです。
素人でもわかる。偉そうに発表するテドロス💢💢💨。
（中略）
必ず中国をほめるテドロス事務局長新型コロナウイルスの感染が100以上の国と地域に広がっていることを受けて、ＷＨＯ＝世界保健機関のテドロス事務局長は「パン…

結果 ＝ {'age': '60歳以上', 'civilstatus': '既婚', 'earnings': '8M-10M', 'gender': '男性', 'hobby': ['CAMERA', 'FORTUNE', 'INTERNET', 'SMARTPHONE_GAME', 'PAINT', 'RAILWAY', 'SPORT', 'STUDY', 'TVGAME'], 'location': '近畿', 'occupation': '自営業'}
```
年代：60歳以上
「正解」
既婚/未婚：既婚
「正解」
給与：800～1000万円
「不正解」
性別：男性
「正解」
趣味：カメラ、占い、インターネット、スマホゲーム、絵、鉄道、スポーツ、勉強、TVゲーム
「不明」
出身地：近畿
「不正解」	
職業：自営業
「正解」

#考察
単純に正解率は上がった。ただ、それほどその人の特徴を表す推定はできていない。
例えば、kind_of_bussinessという項目があり、その項目で医療系の単語が出ていればより具体的に分析できていることになる。
現状は大まかに当てている印象。

当てやすいアカウントか当てにくいアカウントかという影響もあるだろう。推測しやすいボリューム層には、有名人のような特殊な人は含まれないことが多いのかもしれない。
しかし、知らない人のアカウントを分析しても答え合わせができない。

#課題
もう少し精度を上げたい（アカウントの種類も含め精度が上がる条件を調べたい）。
~~また、一般ユーザーが使えるようにWebページとして実装したい。~~した（https://cotoha-twitter.herokuapp.com/）

#参考
[COTOHAでTwitterアカウントを分析する #1](https://qiita.com/ysk-cpu/items/7c9be3d198acf9f95889)
[COTOHA APIリファレンス](https://api.ce-cotoha.com/contents/reference/apireference.html)
[Twitter の特定ユーザーのツイートを取得](https://qiita.com/ekzemplaro/items/eb19955aa1fd01a59eff)
[【Twitter API】タイムライン取得に使えるパラメータ集](https://munokuno.com/other/tips/parameters-for-timelines/)