AIに愚痴を聞いてもらってその時の感情を分析してくれる簡単なアプリを作成した
はじめに
日々の生活の中で、誰かに話を聞いてほしいと思う瞬間はありませんか?
特に忙しい日々の中で、感情を整理する時間を持つことは難しいものです。そんなときに役立つのが、AIに愚痴を聞いてもらいながら自分の今の気持ちを分析できるアプリです。
このアプリは、誰にも話せない思いをAIに打ち明けることで、感情を客観的に捉え、自己理解を深めるための手助けをします。特別な心理学的知識や複雑な操作は不要で、誰でも簡単に使える非常に簡易的なものになっています。
解決したい社会課題
現代社会では、仕事や人間関係、家庭環境など、多くの人がさまざまなストレスを抱えています。しかし、その感情を適切に表現し、誰かに共有する機会を持つことは容易ではありません。特に、以下のような課題が多くの人々に影響を与えています。
孤独感の増加 :
人と話す機会が減少し、感情を分かち合う場が不足している。
感情の自己認識不足 :
自分の気持ちを言葉にすることが苦手なため、ストレスや不安をため込んでしまう。
心の健康への影響 :
小さなストレスの蓄積がメンタルヘルスに大きな影響を与える可能性がある。
これらの課題に対して、私は「愚痴を聞いてもらって感情を分析するAIアプリ」という形で解決の一助を目指しました。このアプリは、気軽に自分の気持ちを表現できる場を提供し、その感情を客観的に可視化することで、自己理解を促進します。さらに、心の健康を守るための第一歩をサポートするツールとなることを目指しています。
この取り組みを通じて、孤独感を減らし、自己理解を深めることで、より多くの人が前向きな毎日を過ごせる社会を実現したいと考えています。
実行環境
パソコン:Windows 10
開発環境:VScode
言語:Python
実行したコード
import streamlit as st
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
# 異なる感情分析モデルのリスト
models = [
'j-hartmann/emotion-english-distilroberta-base',
'bhadresh-savani/bert-base-uncased-emotion'
]
# 感情ラベルの統一
emotion_labels = ['anger', 'fear', 'joy', 'sadness', 'surprise', 'love']
# Streamlitアプリのタイトルと説明
st.title("感情分析_愚痴聞きの穴")
st.title("THE KING HAS DONKEY EARS!!!!")
# 画像の挿入
st.image("タイトル.jpg", width=200, use_column_width=True)
st.write("あなたの言いたいこと、リアルの友人には言えないことを、ここで吐き出してください。文章から今のあなたの感情を分析します。記録が残ることはありません。好きなだけあなたの話をしてください。今の感情を可視化し、気持ちの整理に役立てて下さい。ここでは植物でさえ聞いていません。")
# モデル選択
selected_model = st.selectbox("感情分析モデルを選択してください:", models)
# トークナイザーとモデルをロード
try:
tokenizer = AutoTokenizer.from_pretrained(selected_model, use_fast=False)
model = AutoModelForSequenceClassification.from_pretrained(selected_model)
classifier = pipeline('text-classification', model=model, tokenizer=tokenizer, return_all_scores=True)
except Exception as e:
st.error(f"モデルのロード中にエラーが発生しました: {e}")
# ユーザーからの入力
text = st.text_area("ここに今思っていることや愚痴を入力してください", "")
# 感情ラベルをマッピングする関数
def map_labels(results):
mapped_scores = {label: 0.0 for label in emotion_labels}
for result in results:
label = result['label'].lower()
if label in mapped_scores:
mapped_scores[label] += result['score']
return mapped_scores
# ボタンが押されたときに感情分析を実行
if st.button("送信"):
if text:
# 感情分析を実行
results = classifier(text)[0]
emotion_scores = map_labels(results)
total_score = sum(emotion_scores.values())
# 割合を計算
emotion_percentages = {emotion: (score / total_score) * 100 for emotion, score in emotion_scores.items()}
# 感情カテゴリとその割合
emotions = list(emotion_percentages.keys())
percentages = list(emotion_percentages.values())
# レーダーチャートの作成
angles = np.linspace(0, 2 * np.pi, len(emotions), endpoint=False).tolist()
percentages += percentages[:1]
angles += angles[:1]
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
ax.fill(angles, percentages, color='blue', alpha=0.25)
ax.plot(angles, percentages, color='blue', linewidth=2)
ax.set_yticklabels([])
ax.set_xticks(angles[:-1])
ax.set_xticklabels(emotions)
plt.title('Emotion Analysis Radar Chart')
st.pyplot(fig)
# 結果を文章で表記
st.write("文章からあなたの感情を分析しました。")
for emotion, percentage in emotion_percentages.items():
st.write(f"{emotion}: {percentage:.2f}%")
else:
st.write("テキストを入力してください。")
実行結果
今回は以下の2つから感情分析モデルを選択できるようにしました。
j-hartmann/emotion-english-distilroberta-base
bhadresh-savani/bert-base-uncased-emotion
また、感情ラベルの統一のため、以下の6つに分類できるようにしました。
emotion_labels = ['anger', 'fear', 'joy', 'sadness', 'surprise', 'love']
今思っていることや愚痴を入力欄に記入し、送信ボタンを入力すると分析結果が排出されるようにしました。
以下が実行結果です。


自身の愛猫が病院通いをしている愚痴を聞いてもらったため、悲しみや驚きが多く出たようです。
課題
今回は既存のAIモデルを使用しました。
既存モデルは一般的なデータセットでトレーニングされているため、多様な感情や日本語のニュアンスを完全に捉えきれない場合があります。特に、曖昧な表現や文脈依存の感情については、ユーザーの期待と分析結果が一致しないこともあります。
既存モデルに依存することで得られる利点は多いものの、独自のアプローチを模索することで、より精度の高い分析や新しい機能の実現が可能になります。
今回は記録を残さない様にしていますが、ユーザーの感情に関するデータを取り扱う上で、プライバシー保護とセキュリティは非常に重要なので、暗号化技術の導入や匿名性の向上など、より安心して利用できる環境を整える必要があります。
独自モデルの開発には時間とリソースが必要ですが、将来的な競争力向上のためには欠かせないと思いました。
まとめ
愚痴を書くとAIが感情分析してくれるアプリの作成をしました。
Discussion