名言オラクル ― 選択アルゴリズム解説

3つの問いに答えたあと、何が起きて「名言・今日のひとこと・そっと、ひとつ」が選ばれるのか。
エゴグラム分析の働きと、毎日の「ゆらぎ」の仕組みを、実装に即して説明します。

目次

全体の流れ(3ステップ)

「はじめる」から3問に答えると、内部では次の順に処理が走ります。

STEP 1
心の地図を更新
3問の回答から5因子のスコアを少しだけ動かす(指数移動平均)。
STEP 2
名言を選ぶ
更新後の心の形に近い名言を、確率的に1枚引く。
STEP 3
言葉を添える
名言のテーマ × あなたの因子で、ひとことと小さな儀式を選ぶ。

エゴグラム分析は STEP 1 で「心の地図」を作り、その地図が STEP 2・3 の両方を方向づけます。
つまりエゴグラムは全工程の土台です。

エゴグラム5因子とは

このアプリは交流分析を参考にした独自の5因子で「いまの心の傾き」を表します。各因子は 0〜100、初期値はすべて中庸の 50 です。

記号呼び名意味
CP規範厳しさ・理想・責任感(こうありたい)
NP受容優しさ・思いやり・包み込む力
A分析論理・観察・現実検討
FC好奇心自由・楽しさ・ひらめき
AC協調順応・気配り・我慢

各問いの2つの選択肢には、5因子への増減(デルタ)が割り当てられています。「どちらを選ぶか」が、心の地図を少しずつ描いていきます。

① 回答 → 心の地図を更新する(EMA)

3問の回答を1つにまとめ、指数移動平均(EMA)でプロファイルを更新します。急に変えず、過去を引き継ぎながら「最近の傾向」をなめらかに映すための方式です。

当日デルタ  todayDelta[f] = 3問の因子fへの増減の合計(理論上 −6〜+6)
当日スコア  todayScore[f] = clamp( 50 + (50/6) × todayDelta[f] , 0, 100 )
更新       profile[f] = clamp( α × todayScore[f] + (1−α) × 前回profile[f] , 0, 100 )
            α(平滑化係数)= 0.15

この式が意味すること

具体例: 好奇心(FC)が今日の3問で最大の +6 動いたとき
todayScore_FC = 50 + (50/6)×6 = 100
新FC = 0.15×100 + 0.85×50 = 57.5(50 → 57.5 へ、そっと7.5だけ前進)
翌日FCに触れなければ:新FC = 0.15×50 + 0.85×57.5 = 56.4 … と少しずつ50へ戻る。

この「心の地図(プロファイル)」が、次の STEP 2・3 を動かす唯一の入力です。これがエゴグラム分析の中核です。

② 名言を選ぶ(コサイン類似度 × 抽選)

名言は1枚ずつ、5因子への 親和性(affinity) を持っています(例:ある名言は {CP:0.7, A:0.5, FC:0.3})。これと、あなたの心の地図の「偏りの方向」を照合します。

1. 方向の一致度(コサイン類似度)

プロファイルから50を引いて「中心からどちらへ傾いているか」のベクトルにし、名言の親和性ベクトルとのコサイン類似度(向きの近さ、−1〜+1)を測ります。大きさではなく方向を見るのがポイントで、「いまの心が向いている方角」に共鳴する名言が高得点になります。

2. クールダウン(重複を避ける)

3. 上位8枚から確率で1枚(softmax抽選)

スコア上位8枚を取り、softmax(温度 0.15)の重みで抽選します。最も近い1枚に固定せず、近いものほど出やすいが確定ではない――「運命感」を残すための確率抽選です。心の地図が完全に均一なときは、一様抽選にフォールバックします。

まとめると:いまの心の傾きに方向が近い名言ほど出やすい。ただし最近見たものは避け、上位の中からくじを引く。

4. 名言のゆらぎ ― 影のカード(週に2日ほど)

日付から決まるハッシュで hash("quote-shadow|日付") % 7 < 2 のとき(約 2/7、週におよそ2日)、「影のプロファイル」で名言を選びます。影のプロファイルは各因子を中庸50で反転したもの(mirror[f] = 100 − profile[f])で、いま低い=ふだん表に出ていない要素ほど高く扱われます。

その結果、ふだんとは違う角度から深く共鳴する一枚が「運命のカード」として届きます。たとえば好奇心(FC)が高い人に、ある日そっと協調(AC)や分析(A)に響く名言が現れ、気づき・戒め・補いを与えます。クールダウンや上位8枚のsoftmax抽選はそのまま効くので、雑音ではなく厳選された一枚であることは保たれます。声かけ(今日のひとこと)はいつものあなたの声のままなので、ゆらいだ一枚をやさしく受け取れます。

この系列は「声かけのゆらぎ」とは独立の日付ハッシュで決まり、両者が必ずしも同じ日に重ならないようにしています。

名言の解説について

名言の解説(「解説を読む」)は、その名言に固定で結びついた文章です。アルゴリズムで選ぶのではなく、選ばれた名言にもとから付随しています。したがって、ある名言が出れば必ず同じ解説が表示されます(解説は名言ごとに1本)。

③ 今日のひとこと・そっと、ひとつを選ぶ

この2つは、「名言のテーマ」×「あなたの因子」という格子から選ばれます。文章は因子ごとに用意された束(バケツ)に入っています。

テーマ(10種):継続 / 挑戦 / 受容 / 自己信頼 / 休息 / 学び / 感謝 / 勇気 / 今 / 夢
今日のひとこと:1バケツ 6本(計360本)
そっと、ひとつ:1バケツ 5本(計300本)

1. テーマの決まり方

選ばれた名言が持つテーマ(1〜数個)から、1つを選びます。

2. どの因子の「声」で語りかけるか

因子をスコア順に並べ(同点は当日デルタ→固定順で安定化)、原則は1位(優勢因子)の声で語りかけます。ここに後述の「ゆらぎ」が入ります。

3. バケツから1本(直近回避つき)

該当バケツの中から、直近に表示した文(最大10件を記憶)を除いてランダムに1本選びます。除外すると候補が無くなる場合のみ、再会を許します。空のバケツは共通文(_default)にフォールバックします。

「ゆらぎ」の設計と頻度

「毎回同じでつまらない」を防ぐため、軸(あなたの傾向)は保ちつつ、複数層のゆらぎを重ねています。

ゆらぎ 0名言の影のカード ― 約7日に2日

2/7 (週におよそ2日)いま低い因子に共鳴する名言を「影のプロファイル」で選びます。ふだんと違う要素から、運命の一枚が強い示唆を与えます(詳細は STEP 2 の「4. 名言のゆらぎ」)。声かけのゆらぎとは独立の日付ハッシュ。

ゆらぎ 1声かけ因子のゆらぎ ― 約7日に2日

日付から決まるハッシュで hash("voice|日付") % 7 < 2 のとき、1位ではなく2位の因子の声で語りかけます。確率は 2/7 (約 28.6%、週におよそ2日)。「いつもの自分」への言葉と「もう一つの自分」への言葉が交互に届きます。残りの約5日は優勢因子の声です。

ゆらぎ 2直近回避 ― 同じ文の再会を遠ざける

今日のひとこと・そっとひとつは、それぞれ直近10件を記憶して候補から除外します。名言は直近14日を除外。同じ言葉にすぐ再会しないので、毎朝の新鮮さが保たれます(候補が尽きたときだけ再会を許容)。

ゆらぎ 3確率抽選 ― 同じ条件でも一通りに固定しない

名言は上位8枚の softmax 抽選、ひとこと・そっとひとつはバケツ内のランダム抽選。条件が同じでも結果に幅が出るため、機械的な繰り返しになりません。

これらに加え、そもそも STEP 1 でプロファイル自体が毎日少しずつ動くため、優勢因子・テーマ・親和する名言が緩やかに移ろいます。ゆらぎは「飽きさせない」ためであり、あなたの傾向(軸)を見失わせないよう、頻度は控えめに設計されています。

同じ日は同じ運命 ― 決定論について

主要な数値一覧

項目意味
因子の範囲 / 初期値0〜100 / 50中庸からの偏りで「傾き」を表す
EMA 平滑化係数 α0.151日の回答が結果に効く割合(残り85%は過去)
デルタのスケール50 / 6当日デルタ ±6 で 0〜100 に飽和
名言クールダウン14 日直近に出た名言を避ける窓
名言の上位枠 N8 枚抽選対象に残す上位の枚数
softmax 温度0.15小さいほど高得点に集中(運命感の強さ)
名言の影のカード頻度2 / 7(約29%)いま低い因子に共鳴する名言を選ぶ日の割合
声かけゆらぎ頻度2 / 7(約29%)2位因子の声で語る日の割合(影のカードとは独立)
ひとこと/そっと 直近回避各 10 件同じ文の再会を遠ざける記憶数
文章の蔵書数名言 351 / ひとこと 360 / そっと 300各バケツ複数本+日替わりで巡回

この文書はアプリの実装(OracleEngine の ProfileEngine・QuoteSelector・AdviceSelector、および DailyDrawService)に基づいて作成されています。数値や規則は今後の調整で変わることがあります。