社会性フィルターでSNS時代を生き抜く

# はじめに
社会人は日々つらいことが多く、twitterをはじめとするSNSで嘆きたくなることも多いと思います。
ただ、ネガティブな発言は周りの人を不快にさせてしまうことがあるため、代わりに__「にゃーん」__と呟いて周りを和ませたりします。
これを__社会性フィルター__といいます。
今回はこの社会性フィルターを実装していきたいと思います。
<blockquote class="twitter-tweet" data-lang="ja">
![図です](https://pbs.twimg.com/media/CqXNP7XUMAEg_HT?format=jpg&name=small)
<p lang="ja" dir="ltr"> <a href="https://t.co/2OFfuLPk2l">pic.twitter.com/2OFfuLPk2l</a></p>&mdash; 4869 (@sh4869sh) <a href="https://twitter.com/sh4869sh/status/767244989503901696?ref_src=twsrc%5Etfw">2016年8月21日</a></blockquote>

# 実装方針
[COTOHA API](https://api.ce-cotoha.com)の__感情分析API__を使っていきます。
感情分析APIは、__文章のPositive/Negative/Neutral__を返し、感情語が含まれれば感情語と感情を返します。

文章がNegativeである場合には、文章を「にゃーん」にします。
また、Negativeであろう単語が含まれる場合には、文章全体がPositiveであろうと「にゃーん」にする厳しいモードも作成します。
![nyan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587382/44c89eba-557c-2e53-25ca-aa89f3043a58.png)

## ソースコード
すぐ動かせるcolaboratoryのコードは[こちら](https://colab.research.google.com/drive/1172RlCSlmk4AgnRg34LMW7U_1NxRajm6)から。

<details><summary>ソースコードはこちら</summary><div>

### 必要なものをインポート
```social_filter.py
import sys
import requests
```

### tokenを取得する関数
```social_filter.py
def auth(client_id, client_secret):
    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))
    
    return r.json()["access_token"]
```

### 感情分析する
```social_filter.py
def sentiment(access_token, sentence):
    base_url = BASE_URL
    
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    
    data = {
        "sentence": sentence,
        "type": "kuzure"
    }
    
    r = requests.post(base_url + "v1/sentiment",
                      headers=headers,
                      data=json.dumps(data))
    return r
```

### 社会性フィルター
```social_filter.py
def social_filter(sentence, response, filter_level="low"):
    result = response.json()["result"]
    negative_list = ["悲しい", "不安", "恥ずかしい", "嫌", "切ない", "N"]

    if result["sentiment"] == "Negative":
        return "にゃーん"
    else:
        if filter_level == "high":
            if len([line for line in result["emotional_phrase"] if line["emotion"] in negative_list]) == 0:
                return sentence
            else:
                return "にゃーん"
        else:
            return sentence
```

### 社会性フィルターにかける
```social_filter.py
args = sys.argv
sentence = args[1]
response = sentiment(access_token, sentence)
social_filter(sentence, response, args[2])
```
</div></details>

## 実行結果
```python
python social_filter.py "毎日会社と家の往復でしんどい・・・" low
'にゃーん'
```

フィルターのレベルが低いと、ポジティブな表現が多いときに取りこぼしてしまう

```python
python social_filter.py "学生の頃は毎日がバラ色で、何もなくても最高に楽しかった。でも今はつらい" low
'学生の頃は毎日がバラ色で、何もなくても最高に楽しかった。でも今はつらい'
```


フィルターのレベルをあげることで対処できる。

```python
python social_filter.py "学生の頃は毎日がバラ色で、何もなくても最高に楽しかった。でも今はつらい" high
'にゃーん'
```

# まとめ
今回は[COTOHA API](https://api.ce-cotoha.com)を使うことで、簡単に社会性フィルターの実装を行いました。
普段のツイートがネガティブなのか、「にゃーん」と呟いたほうがいいのか迷ったときにお使いください。