【LINE BOT + COTOHA API】 너의 문장은 상대를 불쾌하게 하고 있지 않나? COTOHA 선생님에게 확인해 보자.

0. 소개



채팅 도구, SNS가 보급된 지금, 문장에서의 커뮤니케이션이 폭발적으로 늘었지요.
채팅(Slack)에서만 참여한 적이 없는 손님과 처음 만났을 때, 이런 이야기를 받았습니다.
「全く怒っているつもりないんですけど、チャットだとそんな印象与えてしまうんですよね~。」

아니 있어요. 직업뿐만 아니라 개인이기도합니다!
인상이 나쁜 문장이 인상이 나쁜 대답을 만들어 음의 나선형이 된다. 이것은 매우 슬프다.
부정적인 단어의 존재는 무의식적으로 상대의 마음에 손상을줍니다.
SNS의 비방 중상이라든지 최악이군요.

그런 문장을 단속하기 위해 COTOHA 선생님이라는 것을 만들어 보았습니다!
  • 【Qiita x COTOHA API 선물 기획】COTOHA API로, 텍스트 해석을 해 보자!

  • COTOHA API를 사용하여 이런 것도 만들고 있습니다!
  • 【Nuxt.js + COTOHA API + microCMS】 COTOHA 틱한 플래시 카드 만들어 보았다

  • 그건 그렇고, 아들 (2 세)에게 크리스마스 선물을 화려하게 실패한 내가 노리는 것은 "만들 버섯의 산"입니다.

    1. COTOHA 선생님은?



    COTOHA API감정 분석 을 사용하여 LINE으로 입력한 메시지에 부정적인 단어가 포함되어 있는지 확인하는 LINE BOT입니다. COTOHA 선생님이 결과를 답해줍니다.
    결과는 다음 패턴으로 분류됩니다.
  • 네거티브 워드가있는 경우
  • "음성 단어 없음"및 "긍정적 단어 없음"의 경우
  • "음성 워드 없음"및 "긍정적 인 단어"의 경우

  • 2. 환경


  • Python 3.8.1
  • COTOHA API
  • LINE Messaging API
  • Heroku

  • 3. 프로그램



    line.py
    import cotoha
    import json
    from codecs import decode
    from os import environ, getenv
    from flask import Flask, request, abort
    from linebot import LineBotApi, WebhookHandler
    from linebot.exceptions import InvalidSignatureError
    from linebot.models import MessageEvent, TextMessage, TextSendMessage
    
    app = Flask(__name__)
    handler = WebhookHandler(environ["LINE_CHANNEL_SECRET"])
    linebot_api = LineBotApi(environ["LINE_CHANNEL_ACCESS_TOKEN"])
    cotoha_api = cotoha.CotohaApi()
    
    @app.route("/callback", methods=['POST'])
    def callback():
        signature = request.headers['X-Line-Signature']
        body = request.get_data(as_text=True)
        app.logger.info("Request body: " + body)
    
        try:
            handler.handle(body, signature)
        except InvalidSignatureError:
            abort(400)
    
        return 'OK'
    
    @handler.add(MessageEvent, message=TextMessage)
    def handle_message(event):
        sentiment = cotoha_api.sentiment(event.message.text)
        reply_message = make_reply_message(sentiment["result"])
        linebot_api.reply_message(event.reply_token, reply_message)
    
    def make_reply_message(sentiment_result):
        positive_words = ""
        negative_words = ""
    
        for phrase in sentiment_result['emotional_phrase']:
            if phrase['emotion'] == 'P':
                positive_words = positive_words + '・' + phrase['form'] + '\n'
            if phrase['emotion'] == 'N':
                negative_words = negative_words + '・' + phrase['form'] + '\n'
    
        if len(negative_words) > 0:
            message = "君の文章、相手を不快にする可能性があります。\n以下のワードは使わないでちょ\uDBC0\uDC9E\n" + negative_words
        elif len(positive_words) < 1:
            message = "君の文章、悪くはないです。\nでもポジティブワードを1つは入れてちょ\uDBC0\uDC9D"
        else:
            message = "君の文章、完璧です。\n以下のワードがGood\uDBC0\uDC7F\n" + positive_words
    
        return TextSendMessage(text=message)
    
    if __name__ == "__main__":
        port = int(getenv("PORT"))
        app.run(host="0.0.0.0", port=port)
    

    cotoha.py
    import requests
    import json
    from os import environ
    from codecs import decode
    
    class CotohaApi:
    
        DEVELOPER_API_BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
        DEVELOPER_API_SENTIMENT_URL = DEVELOPER_API_BASE_URL + "v1/sentiment"
        ACCESS_TOKEN_PUBLISH_URL = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    
        def __init__(self, client_id = "", client_secret = ""):
            self.client_id = environ["CLIENT_ID"] if not client_id else client_id
            self.client_secret = environ["CLIENT_SECRET"] if not client_secret else client_secret
    
        def get_access_token(self):
            headers = {
                "Content-Type": "application/json;charset=UTF-8"
            }
    
            data = {
                "grantType": "client_credentials",
                "clientId": self.client_id,
                "clientSecret": self.client_secret
            }
    
            response = requests.post(self.ACCESS_TOKEN_PUBLISH_URL, headers=headers, data=json.dumps(data))
            return response.json()["access_token"]
    
        def sentiment(self, sentence):
            headers = {
                "Authorization": "Bearer " + self.get_access_token(),
                "Content-Type": "application/json;charset=UTF-8",
            }
    
            data = {
                "sentence": sentence
            }
    
            response = requests.post(self.DEVELOPER_API_SENTIMENT_URL, headers=headers, data=json.dumps(data))
            return response.json()
    
    if __name__ == "__main__":
        # 以下のパラメータを設定して「python .\cotoha.py」を実行すれば、
        # 当モジュール単体での結果確認が可能
        client_id = ""
        client_secret = ""
        text = "今日は楽しい1日でした。"
    
        cotoha_api = CotohaApi(client_id, client_secret)
        sentiment_result = cotoha_api.sentiment(text)
        sentiment_formated = json.dumps(sentiment_result, indent=4)
        print (decode(sentiment_formated, 'unicode-escape'))
    

    4. 데모





    5. 참고



    LINE BOT 만드는 방법은 아래의 기사를 참고로 했습니다. 감사합니다!
  • 【초보자용】Python에 의한 Heroku 환경에서 간단 LINEBot 개발
  • 파이썬으로 라인 봇을 만들어 보았습니다.

  • 6. 결론



    감정 분석 등의 기술이 보급되어 인터넷의 세계에서 비방 중상을 없애고 싶네요!

    ·
    ·
    ·

    어라?

    좋은 웹페이지 즐겨찾기