Pythonライブラリ"emotionics"公開
先日、Pythonライブラリ"emotionics"を公開しました。
本記事は、日本語での解説記事です。
emotionics
Emotionicsとは?
Emotionicsとは、人類の感情をAIが扱いやすいように構造化する技術です。
(ちなみに造語です。)
Emotionicsのスコープは、下図が示すように、「意識と無意識」と「ロジックとアルゴリズム」の間にある人間の感情層の領域です。

仕組み
Pythonライブラリ"emotionics"は、LLM×Emotionicsを組み合わせて使用します。
emotionicsは、テキストを特定の感情ラベルに分類する分類器ではありません。
LLMが文脈として理解した感情的ニュアンスを、あらかじめ定義された感情要素(Trust / Joy / Fear / Surprise など)の「強度分布」として構造化して出力します。
LLM自体は、文章の意味理解や文脈把握を担当します。
emotionicsは、その結果をそのまま返すのではなく、感情的な反応を「人間が後から扱いやすい形」に再構成する役割を持ちます。
つまり、
- 意味理解:LLM
- 感情構造化:emotionics
という役割分担になっています。
pip install emotionics
使い方
必要なものは、OpenAIのAPIキーとOpenAIライブラリです。
Emotionics自体はLLM依存が無いはずですが、emotionicsライブラリは、OpenAIにしか今のところ対応していないです。
まずは、
pip install emotionics
でインストールし、下記のように使用します。
import os
import emotionics
emotionics.activate(
llm="openai",
api_key=os.environ["OPENAI_API_KEY"],
model="gpt-5.2",
)
result = emotionics.estimate(
text="今日も頑張る",
mode="lite",
)
print(result)
というような感じで使うと、
{
"mode": "lite",
"version": "0.1.0",
"trust": 0.6,
"surprise": 0.1,
"joy": 0.7,
"fear": 0.1,
"confidence": 0.75
}
というような出力が出ます。
各感情値は確率や診断結果ではなく、そのテキストに含まれる感情的シグナルの「相対的な強さ」を表します。
confidenceは、LLMがその推定をどれくらい安定して行えたかの目安です。
emotionics自体は言語に依存せず、LLMの多言語理解能力を前提として動作するため、LLMが対応している言語であれば同様に利用できます。
なお、診断などの目的には使用しないで下さい。
コードなど
コードなどの資産は、GitHubに置いてあります。
Kouhei-Takagiのemotionics
おまけ
開発したfastAPI(バックエンド)+SwiftUI(フロントエンド)
もっと高機能なバージョンを初期に開発していて、あまり公開するべきじゃ無いなと感じたために基本非公開にしたのが、fastAPIをバックエンドにし、SwiftUIアプリをフロントエンドにしたスタイルです。
動画
追記
fullモードを追加しました
import os
import emotionics
emotionics.activate(
llm="openai",
api_key=os.environ["OPENAI_API_KEY"],
model="gpt-5.2",
)
result = emotionics.estimate(
text="過去60日間のemotionicsライブラリの国別ダウンロードやっぱり中国やフランスや韓国やシンガポールが日本を上回っています。しかも日本に関して言うと個人的に宣伝したにも関わらずダンロード数が低いです。私が日本に期待し過ぎるのが悪いのかも🤔",
mode="full",
)
print(result)
と言うような感じで使うと、
{
'mode': 'full',
'version': '0.1.2',
'candidate_emotions': [
{'label': 'Disappointment', 'score': 0.42}, {'label': 'Regret', 'score': 0.18},
{'label': 'Concern', 'score': 0.15},
{'label': 'Frustration', 'score': 0.12},
{'label': 'Confused', 'score': 0.05}
],
'temporal': {'direction_t1': 'past', 'd': 0.45}, 'temporal_distribution': {'past': 0.75, 'present': 0.2, 'future': 0.05},
'intensity': 0.55,
'politeness': 0.65,
'sarcasm': 0.05,
'directness': 0.7,
'honesty_cues': 0.8}
というような出力が出ます。
