経緯
エンジニアってみんなさん忙しいよね💦。
忙しいけど、やりたい事だったら、よく夢中になって、ライン見なくなりますね。
でも、大事なメッセージ、例えば彼女のメッセージは見なくちゃいけない時もありますね!
この時は、身近なツールで彼女のメッセージを分析して気持ちだけ教えてくれるもの欲しい🥺
ということで、今回作ってみました。
やりたい事
メッセージをslack botに送って、ロボット分を通し、キーワード、キーワードのタイプやメッセージの感情結果など返ってくるという簡単な仕組みです。
- slackにコピーしたメッセージを送る
- 裏側でメッセージをCOTOHA感情分析APIに送る
- APIから返信した結果を整理して、slackに返す
【実装例】
これで、は忙しい時われわれエンジニアは、大事なメッセージ来ても、まず取り合いずロボットに任せて、時間を省いてその結果だけ見れば良いでしょう🤡
実行環境や利用サービス
- macOS Catalina Version 10.15.3
- Node.js v12.16.1
- COTOHA API
- SlackBots
- axios
COTOHA APIは構文解析を初め、音声認識など様々なサービスを提供しているAPI群です。
今回はメッセージを分析するので、COTOHA API中の感情分析APIを使用する予定です。
SlackBotsはSlack's Real Time Messaging APIを便利に使えるNPMパッケージです。
axiosはJavascripのHTTPクライアントです。馴染みの方多いでしょう。
実装
view in github
クリックで展開
constaxios=require('axios').default;constSlackBot=require('slackbots');constURL='https://api.ce-cotoha.com/api/dev/nlp/v1/sentiment';constCOTOHA_TOKEN=process.env.COTOHA_TOKEN;constSLACK_TOKEN=process.env.SLACK_TOKEN;constUSER_ID=process.env.USER_ID;axios.defaults.headers.common['Authorization']=`Bearer ${COTOHA_TOKEN}`;constbot=newSlackBot({token:SLACK_TOKEN,name:'彼女分析ロボット'});bot.on('start',()=>console.log('彼女分析開始...'));bot.on('message',message=>{if(Object.is(message.user,USER_ID)){try{(asyncfunction(){constrobotMessage=awaitgetData(message.text);awaitsend(robotMessage);})();}catch(e){console.log('our error',e);}}});constgetData=asyncmessage=>{letjson={};if(Object.is(message,'こんにちは')){returnmessage;}elseif(Object.is(message,'Bye')){returnmessage;}else{try{json=awaitaxios.post(URL,{sentence:message});}catch(e){console.log('our error',e);}constform=json.data.result.emotional_phrase.map(pharse=>pharse.form);constemotion=json.data.result.emotional_phrase.map(pharse=>pharse.emotion);letemoji='';switch(json.data.result.sentiment){case'Positive':emoji='😘';suggestion='積極的に進んでみましょう!';break;case'Negative':emoji='🙁';suggestion='もう諦めた方良いかもしれない:(';break;case'Neutral':emoji='😐';suggestion='しばらく見てみましょう。';break;}return{message:message,status:json.data.status,sentiment:json.data.result.sentiment,form:form.join(' | '),emotion:emotion.join(' | ').replace(/P/g,'積極').replace(/N/g,'消極'),emoji:emoji,suggestion:suggestion};}};constsend=message=>{letreply='';if(Object.is(message,'こんにちは')){reply='彼女のメッセージ分析してあげるよ。どうぞ😈';}elseif(Object.is(message,'Bye')){reply='Bye! 幸せにしてね🦾';}else{reply=`
\`\`\`
${message.message}
\`\`\`
キーワード : ${message.form}感情種別 : ${message.emotion}感情分析結果 : *${message.sentiment}* ${message.emoji}アドバイス : ${message.suggestion}
`;}constparams={icon_emoji:':robot_face:'};bot.postMessageToChannel('general',`${reply}`,params);};
説明
constbot=newSlackBot({token:SLACK_TOKEN,name:'彼女分析ロボット'});bot.on('start',()=>console.log('彼女分析開始...'));
これで、slackとやりとりできる状態になります。
constform=json.data.result.emotional_phrase.map(pharse=>pharse.form);constemotion=json.data.result.emotional_phrase.map(pharse=>pharse.emotion);letemoji='';switch(json.data.result.sentiment){case'Positive':emoji='😘';suggestion='積極的に進んでみましょう!';break;case'Negative':emoji='🙁';suggestion='もう諦めた方良いかもしれない:(';break;case'Neutral':emoji='😐';suggestion='しばらく見てみましょう。';break;}return{message:message,status:json.data.status,sentiment:json.data.result.sentiment,form:form.join(' | '),emotion:emotion.join(' | ').replace(/P/g,'積極').replace(/N/g,'消極'),emoji:emoji,suggestion:suggestion};
メッセージに対する感情分析APIの結果を整理するコアの部分です。基本的に結果に沿って、絵文字など加えて表示します。
slackはmarkdownのtableがサポートしないので、キーワードの部分は折中し、|
で表示。
結果
もちろん彼女だけでなく、他の場面も活躍できる!
採用
他に活躍できそうなシチュエーションたくさんありそう😆
まとめ
感情分析APIの結果は割と精度が高いと思います。
ただし、私は人間の感情って人間でもわかりづらいものだ感じる時がよくあります。日本語のようなスペースがない言語も更に難しくなるでしょう。感情分析というのは結局、感情がある単語を取り出して、計算しているみたいで、この精度まであげたのは頑張ってきた気がします。
ただ、例えば大丈夫
の解釈も場合によって、PositiveとNegativeと全く違う意味があるので、機械をそこまで理解させるのはまだまだ長い道があるなあと感じました。
COTOHA APIは感情分析の他に固有表現抽出、キーワード抽出などたくさん実務でも使える豊富なサービスがあって、また感情分析以外にも使ってみたいです!