言葉は難しい
言葉って難しくないですか?
字面通り受け取ると痛い目をみたり、隠された真意に全く気づかずにスルーして天然と言われたり
たとえば「月が綺麗ですね」と急に言われても、「そうですね」と、いいともの観客みたいな返事をしかねません
I love you.の意味を汲み取るなんて至難の業ですね
今回はその難しい言葉をCOTOHA APIの感情分析にかけて「真意を探れるのか?」を確かめてみたいと思います
準備
使うもの
- COTOHA API
- Python3(Rubyでもcurlでもよかったんだけど、なんとなく)
実行方法
COTOHA API自体は登録さえしてしまえばとても簡単に使うことができます
今回実行するコードはこんな感じ
import os
import urllib.request
import json
def get_sentiment(txt):
token = get_cotoha_token()
url = os.environ['COTOHA_URL'] + 'nlp/v1/sentiment'
header_with_token = {
"Content-Type": "application/json",
"Authorization": "Bearer " + token
}
obj = {"sentence": txt}
json_data = json.dumps(obj).encode("utf-8")
request = urllib.request.Request(
url, data=json_data, method="POST", headers=header_with_token
)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode("utf-8")
result_objs = json.loads(response_body)
res = result_objs['result']
emotion = ''
for emo in res['emotional_phrase']:
emotion += emo['form'] + ': ' + emo['emotion'] + ', '
print(txt, res['sentiment'], res['score'], emotion)
def get_cotoha_token():
# COTOHA API 認証
headers = {"Content-Type": "application/json"}
auth_url = os.environ['COTOHA_TOKEN_URL']
auth_obj = {
"grantType": "client_credentials",
"clientId": os.environ['COTOHA_ID'],
"clientSecret": os.environ['COTOHA_SECRET']
}
auth_json = json.dumps(auth_obj).encode("utf-8")
auth_request = urllib.request.Request(
auth_url, data=auth_json, method="POST", headers=headers
)
with urllib.request.urlopen(auth_request) as response:
auth_body = response.read().decode("utf-8")
auth_res = json.loads(auth_body)
token = auth_res['access_token']
return token
if __name__ == '__main__':
print('====== 感情分析したいテキストを入力 =====')
txt = input('> ')
get_sentiment(txt)
今回やることは単純で、トークン取ってきて、それを使って感情分析したいテキストをリクエストするだけ
それでは実際にいろいろなテキストを試してみましょう
感情分析してみる
月が綺麗ですね
> 月が綺麗ですね
月が綺麗ですね Positive 0.9111066300514463 綺麗ですね: P
綺麗ですね
というフレーズからポジティブと判断したようです
ちなみに 0.9111066300514463
の部分はセンチメントスコアと言って判定の信頼度だそうです
センチメントスコアってなんなのか全然わからなくて困っていたら、COTOHA APIのSlackコミュニティで話が出ていてわかりました
Slackコミュニティ便利
ところでアレですね
「ポジティブ」はわかりましたが、リファレンスにあるような具体的な感情はわからなかったですね
「好ましい」とかのラベルが付けば完璧ですね
反省を反省を反省ry
> 反省をしていると申し上げましたが、反省しているんです。ただ、これは私の問題だと思いますが、反省をしていると言いながら、反省をしている色が見えない。というご指摘は、私自身の問題だと反省をしております。
反省をしていると申し上げましたが、反省しているんです。ただ、これは私の問題だと思いますが、反省をしていると言いながら 、反省をしている色が見えない。というご指摘は、私自身の問題だと反省をしております。 Neutral 0.3498954942284627 反省: PN
あのセリフはどんな気持ちで言っていたのだろう?という好奇心からやってみましたが、PN
ということで「PositiveかつNegative」のようです
とても複雑な心境だったのでしょう
知らんけど
全然怒ってないから
めちゃくちゃ怒ってる女性が言いそうなセリフですが果たして…
> 全然怒ってないから、飲み会行ってきなよ
全然怒ってないから、飲み会行ってきなよ Positive 0.48899415008698344 全然怒ってない: P
あー、これはマズイです
Positiveと判断して飲み会に参加してしまいます
このまま飲み会に行くときっと家に入れてもらえなくなるでしょう
あんたのことなんか好きじゃないんだから
ツンデレのテンプレです
果たしてCOTOHAはフラグを回収できるのか!?
> 別にあんたのことなんか好きじゃないんだからね
別にあんたのことなんか好きじゃないんだからね Negative 0.5125582125328727 好きじゃない: N
Ohh...
悲しきフラグクラッシャー
COTOHAはおとなしくわかりやすい幼馴染キャラを攻略したほうがよさそうです
うぐぅ
Kanonの名台詞を分析してみましょう
Kanonから20年以上経ったなんて俺はまだ信じてないぞ!!
> ボクのこと、忘れてください
ボクのこと、忘れてください Neutral 0.2972851940620987 忘れてください: PN
これ、悪くないんじゃないか?と思ってます
「忘れてください」という言葉に込められた意味をPositiveかつNegativeと判定するのはなかなか鋭い気がします
結果
あえて難しい文章ばかり分析にかけてみましたが、なかなか面白かったんじゃないかと思います
「全然怒ってない」のような単語は、字面ではどうしてもそう判断してしまうよなという印象でしたが、一方で「忘れてください」をPNとして判定したのは個人的には納得感がありました
今回試したものだといずれもP
やN
のラベルしかつきませんでしたが、たとえばリファレンスにある文章を投げると
> 人生の春を謳歌しています
人生の春を謳歌しています Positive 0.19562121911742972 謳歌: 安心,喜ぶ
このように「安心」や「喜ぶ」といったラベルもつきます
この辺のラベルがつくことが増えるといいなあと思いつつ
こんな気軽に文章を投げるだけでその文章の感情を分析できるのはなかなか素晴らしいと思います
COTOHA APIには他にも面白い機能がたくさんあるので、またいろいろ試してみたいです
※あとがき
今回なんでこれをやってみたかというと、サヨナラムーンタウン聴いてて「月が綺麗ですねって言葉はなんて難しいんだろう…」と思ったのがきっかけでした