モテるためにチャットボットを作って修行する。

### はじめに
近年、コミュニケーションの大部分がLINEなどのチャットに場面を移しつつある。
モテるためには魅力的な文章を打てることが必要とされる現代社会において、周りの環境などから練習の場が限られており、急にその本番がくるという人も多いことだろう。~~筆者がそうである。~~
そんな現代を生きる人類の課題に対し、自分への興味度を出力するチャットボットを用意しそれに絶えずメッセージを投げる修行を行い、メッセージスキルの向上を謀るアプローチをとる。

下図は、筆者が行なっている修行の一部である。
![異性を映画に誘う修行の一部である](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180925/840450cb-ff8d-e229-bbbe-228d2cce7e66.png)

相手の興味度は (前向き・興味なし・不明)の３段階で出力される。
相手のメッセージ自体に意味はない。筆者が言われたことのあるものを用意した。

相手を前向きにさせたら勝ちである。
ここで修行したといって本番は未来永劫来ないと思われるが、本記事ではチャットボットの作成方法を説明し、人類のメッセージスキルをあげることを目標とする。

![line_bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180925/4f2fdd5e-b915-8a62-0163-1061a9485540.png)
[2020/2/23 追記] LINE bot作りました。

### 作成する
いざ作成しようとも、異性がそもそも身近にいない。つまり興味度が測れない。
そんな中、筆者は自然言語処理プラットフォームであるCOTOHA APIのリファレンスのユーザ属性推定に、既婚/未婚なるものを発掘した。
モテない者たちにとって、既婚者は通常では成し遂げられない奇跡を起こした、つまり神である。
筆者は考えた。機械学習による推定により、文章が既婚であると推定されるのは、つまりモテる興味を引かせるメッセージなのではないかと。
[自然言語処理・音声処理APIプラットフォームCOTOHA API](https://api.ce-cotoha.com/contents/index.html)

そんなこんなでCOTOHA APIを用いて、自分のメッセージに対し(前向き・興味なし・不明)を出力するボットを作成する。

### COTOHA APIに投げる
上記のCOTOHA APIのリンクから、まずDevelopersに登録する。
無料枠は各1,000コール/日である。(2020/2/13現在)
これだけあれば、おそらく休むことなく修行できるだろう。

最低限必要なのは、
1. アクセストークンの取得
2. 入力された文字列をユーザ属性推定に投げる

今回はカスタマイズの余地として、推定結果が"未婚"または結果が帰ってこなかった場合、見たことがあるメッセージをランダムで返す。
また、"既婚"出会った場合、入力された文字列を「文タイプ推定」に投げ、発話行為種別に応じた比較的好意そうなメッセージを返すようにしている。
これにより、話が繋がっているように見え、辛い修練も少しは軽くなるだろう。

<details><summary>COTOHA APIに投げるコード</summary><div>

```python:python
import random
import requests
import json

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "******"
CLIENT_SECRET = "******"

def auth():
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }

    data = {
        "grantType": "client_credentials",
        "clientId": CLIENT_ID,
        "clientSecret": CLIENT_SECRET
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    res = r.json()

    return res["access_token"]  # ["expires_in"]: 残り時間

def sequence_anlysis(sentence):
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(BASE_URL + "v1/sentence_type",
                      headers=headers,
                      data=json.dumps(data))
    res_type = r.json()
    if not res_type["status"] == 0:
        print('type API Error status', res_type["status"])
        exit(1)

    data = {
        "document": sentence,
        "type": "kuzure",  # ツイートなどのくずれモード
        "do_segment": False
    }
    r = requests.post(BASE_URL + "beta/user_attribute",
                        headers=headers,
                        data=json.dumps(data))

    res_attr = r.json()
    if not res_attr["status"] == 0:
        print('attr API Error status', res_attr["status"])
        exit(1)
    
    if not "civilstatus" in res_attr["result"].keys():
        civilstatus = "不明"
    else:
        civilstatus = res_attr["result"]["civilstatus"]
    return res_type["result"]["modality"], res_type["result"]["dialog_act"], civilstatus
```

</div></details>

#### チャットボットを用意する
Pythonにより、コンソールで動作するチャットの場を用意する。
~~LINE Botなどを用意するのが面倒だったため、~~今回は標準入力・出力による実装を行なった。

<details><summary>COTOHA APIに投げるコード</summary><div>

```python:python
print('quitで終了')
while True:
    s = input('you: ')
    if s == "":
        continue
    elif s == 'quit':
        break
        exit(0)
    else:
        # 入力を解析
        modality, dialog_act, civilstatus = sequence_anlysis(s)
        # 返答を作成
        output = make_sentence(dialog_act, civilstatus)
        if civilstatus == "既婚":
            print('bot (前向き):    ', output)
        elif civilstatus == "未婚":
            print('bot (興味なし):  ', output)
        else:
            print('bot (不明):      ', output)
```

</div></details>

### まとめ
COTOHA APIを用いたチャットボットにより、モテるための修練の場を作成した。
これで、世界中の恋愛難民が幾分助かることを切に願っている。

今後の課題
* 今回は個別のメッセージに対し、興味度を独立で出力している。今後は時系列に対応したい。
* ~~今回は標準入力・出力による実装をしているが、LINE Botなどで修行したい熱心な修練者はぜひ公開してほしい。~~
* 返答はモテない男子学生が独断と少量の過去の経験から用意している。ぜひ、チャット巧者に改良してもらいたい。