5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

はじめに

社会人は日々つらいことが多く、twitterをはじめとするSNSで嘆きたくなることも多いと思います。
ただ、ネガティブな発言は周りの人を不快にさせてしまうことがあるため、代わりに__「にゃーん」__と呟いて周りを和ませたりします。
これを__社会性フィルター__といいます。
今回はこの社会性フィルターを実装していきたいと思います。

実装方針

COTOHA APIの__感情分析API__を使っていきます。
感情分析APIは、__文章のPositive/Negative/Neutral__を返し、感情語が含まれれば感情語と感情を返します。

文章がNegativeである場合には、文章を「にゃーん」にします。
また、Negativeであろう単語が含まれる場合には、文章全体がPositiveであろうと「にゃーん」にする厳しいモードも作成します。
nyan.png

ソースコード

すぐ動かせるcolaboratoryのコードはこちらから。

ソースコードはこちら

必要なものをインポート

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])

実行結果

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

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

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

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

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

まとめ

今回はCOTOHA APIを使うことで、簡単に社会性フィルターの実装を行いました。
普段のツイートがネガティブなのか、「にゃーん」と呟いたほうがいいのか迷ったときにお使いください。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?