はじめに:「それってあなたの感想ですよね?」に終止符を
レビューで「なんか好きじゃないんだよね」と言われたこと、ありませんか。
仕様で「いい感じにして」と投げられたこと、ありませんか。
人間の「気持ち」は型がゆるすぎて、我々エンジニアには扱いにくい。any 型で投げてくるのやめてほしい。
でも実は、その「気持ち」を真面目に数値化しようとしている分野があります。
その名も Affective Computing(感情コンピューティング / 感情計算論)。
1990年代にMITのRosalind Picard教授が提唱した、れっきとした学際研究領域です。
この記事では、この分野を エンジニアの脳みそで翻訳 しながら、ゆるく入門していきます。
1. まず「感情の型定義」でモメている
この分野の論文を読むと、いきなり流派戦争に巻き込まれます。tab vs space 並みの根深いやつです。
論点は「感情ってどういうデータ構造なの?」。大きく2派あります。
離散モデル派(enum 原理主義)
「感情は有限個のカテゴリだろ」という主張。心理学者 Paul Ekman の 基本6感情(喜び・悲しみ・怒り・恐れ・嫌悪・驚き)が有名です。
// enum 派
enum Emotion {
Joy,
Sadness,
Anger,
Fear,
Disgust,
Surprise,
}
// いや union 型でしょ派(※TS界の永遠の聖戦)
type EmotionLabel =
| "joy"
| "sadness"
| "anger"
| "fear"
| "disgust"
| "surprise";
タスクとしては 分類問題(classification) になります。「この顔は Anger です」みたいに、きれいにラベルが付く世界。実装はラクそうですが、「怒ってるような、呆れてるような…」みたいな中間状態を表現できないのが弱点。離散カテゴリあるあるですね。
なお
enumで書くかunion 型で書くかでもう一戦あるのがTSらしさ。本家心理学が「感情のカテゴリは何個か」でモメているのと構造がそっくりで、なんだか親近感が湧きます。
次元モデル派(number[] 原理主義)
「いやいや、感情は連続値でしょ」という主張。心理学者 James Russell が1980年に提唱した Circumplex Model(円環モデル) が代表選手です。
感情を2つの軸の座標として表します:
-
Valence(感情価):快〜不快 (
-1.0 〜 1.0) -
Arousal(覚醒度):落ち着いている〜興奮している (
-1.0 〜 1.0)
interface Affect {
valence: number; // 快(+) ⇔ 不快(-) -1.0 〜 1.0
arousal: number; // 覚醒(+) ⇔ 鎮静(-) -1.0 〜 1.0
}
// 「リリース直前のドキドキ」
const excited: Affect = { valence: 0.6, arousal: 0.9 };
// 「金曜夜にデプロイ成功して飲むビール」
const content: Affect = { valence: 0.8, arousal: -0.3 };
// 「本番で Cannot read properties of undefined」
const panic: Affect = { valence: -0.9, arousal: 0.95 };
タスクは 回帰問題(regression) になります。「不安」と「興奮」は覚醒度が同じで感情価だけが違う、みたいな微妙なグラデーションを表現できるのが強み。enum から interface にリファクタした感じ、と言えば伝わるでしょうか。
ちなみに最近は「構成論的感情主義」という第三勢力もいます。「感情カテゴリは最初から存在せず、複数の情報から人間(やAI)が後付けで構成するんだ」という立場で、いわば 動的型付け 派。Russell自身も後年「core affect(中核情動)」という概念で、離散的な感情はその上に構築されるものだと論じています。型システムの議論はどこの世界でも終わらない。
論文を読むときのコツ:その論文が enum(離散)派か number(次元)派かを最初に見分けると、評価指標もデータセットも一気に読めるようになります。Accuracy/F1 が出てたら離散、MSE や相関係数が出てたら次元、です。
2. データソース問題(どこから気持ちを取ってくる?)
「気持ち」は変数に入っていないので、どこかからセンシングする必要があります。これを モダリティ と呼びます。主な入力ソースはこんな感じ:
| モダリティ | 具体例 | IT的な実装イメージ |
|---|---|---|
| テキスト | チャット、レビュー文 | NLPで感情分析。一番とっつきやすい |
| 音声 | 声のトーン、話速 | 音声特徴量を抽出して推定 |
| 表情 | 顔のランドマーク | 画像認識タスク |
| 生理信号 | 脳波(EEG)、心拍(ECG)、皮膚電気 | センサーデバイス+時系列解析 |
最近のトレンドは、これらを混ぜる マルチモーダル感情認識(MER)。テキストだけだと「了解です。」が本当に了解なのか塩対応なのか分からないけど、声色や表情を足すと精度が上がる、という発想です。Slackの「承知しました。」の温度感、AIに判定してほしいですよね。
研究レベルだと、EEGとECGを融合したモデルが定番ベンチマーク(DEAPデータセット)で 92.5% の精度を出した、みたいな報告も出ています。脳波つけてコードレビューする時代、来るのか…?
3. とりあえず動かしてみる(テキスト感情分析)
一番ハードルが低いテキストから。Transformers.js を使えば、Pythonもサーバーも要らず、Node やブラウザでそのまま事前学習モデルを動かせます。Web屋の味方。
// npm install @huggingface/transformers
import { pipeline } from "@huggingface/transformers";
// 初回はモデルを自動DLしてキャッシュ(日本語なら対応モデルを指定)
const classifier = await pipeline("sentiment-analysis");
const texts: string[] = [
"このライブラリ最高すぎる、人生変わった",
"ドキュメントが一切ないんだが???",
"とりあえず動いてはいる",
];
for (const text of texts) {
const [result] = await classifier(text);
console.log(`${text}\n → ${result.label} (${result.score.toFixed(2)})\n`);
}
このライブラリ最高すぎる、人生変わった
→ POSITIVE (0.98)
ドキュメントが一切ないんだが???
→ NEGATIVE (0.95)
とりあえず動いてはいる
→ NEUTRAL (0.61) ← この「諦め」を表現できるのが面白いところ
ポイントは score(確信度)が一緒に返ってくること。「たぶんNEGATIVE、確信度0.95」のように、機械側もちゃんと自信のなさを数値で出してくる。人間より謙虚かもしれない。
4. IT業界、どこで使えるの?
実用ユースケースをエンジニア目線で並べてみます。
-
カスタマーサポート:問い合わせの感情を自動で推定し、炎上しそうなチケットを優先度上げ。「怒り検知 → エスカレーション」を
if文で書ける世界。 - プロダクト改善:レビューやアンケートの感情を数値化して、定性データを定量ダッシュボードに。「★の数」より解像度が高い。
- 開発者体験(DX):チャットの空気感や issue のトーンを可視化して、チームの health check に。…ただしこれは後述の通り諸刃の剣。
- 対話AI / ロボット:相手の感情に応じて応答トーンを変える。塩対応されたら気づいてほしい。
「定性 → 定量」への変換器、と捉えると価値が分かりやすいです。今まで console.log("なんかいい感じ") でお茶を濁していた領域に、ちゃんとメトリクスを刺せる。
5. ハマりどころ&倫理の話(ここ大事)
楽しいだけで終わらせないのがエンジニアの誠実さ。論文でも必ず議論される注意点:
-
精度100%は来ない。感情は文化差・個人差・文脈依存が激しく、そもそも「正解ラベル」を一意に決めるのが難しい。
assert emotion == "happy"は通らない前提で設計を。 - 欠損モダリティ問題。カメラOFF、マイクOFFは日常。一部の入力が欠けても動くフォールバックが要る。
- 監視ツールに堕ちやすい。「従業員の感情を常時スコアリング」は技術的に可能でも、やっていいかは別問題。プライバシーと同意が前提。便利と監視は紙一重なので、設計者が一番ブレーキを踏める立場にいることを忘れずに。
特にメンタルヘルスや人事領域に応用する論文では、倫理・プライバシーの章がセットで書かれていることが多いです。この分野を触るなら、技術と同じ熱量で「使い方の議論」も読むのがおすすめ。
まとめ
- 「気持ちの数値化」は Affective Computing という真面目な研究分野
- 感情の型は
enum(離散)派 とnumber[](次元・valence/arousal)派 がある - 入力は テキスト・音声・表情・生理信号、混ぜると強い(マルチモーダル)
- テキスト感情分析なら Transformers.js で今日から試せる(ブラウザでも動く)
- ただし 精度の限界と倫理 はセットで考える
「気持ちは数値化できない」と言われがちですが、少なくとも number で近似はできる。完璧じゃないけど、null よりはずっとマシ。そんな分野です。
それでは、よきEmotion-Driven Developmentを。
参考になる探し方
- ジャーナル:IEEE Transactions on Affective Computing (TAFFC) がこの分野の代表格
- 会議:ACII(感情コンピューティングの旗艦会議)
- まず全体像を掴むなら、2024〜2025年の サーベイ論文 から入ると地図が手に入ります