要点

Koeiの英語学習ループは、daily-translation (SRS運用)english-corpus (ギャップ分析) を接続することで、 「出題 → 回答 → mastered判定 → 言語空間更新 → 次の出題最適化」の循環を作れている。

特に今回の改善で、mastered 後の反映先が

  • 単語空間(personal_corpus
  • チャンク空間(personal_chunks) の二層になり、語彙とフレーズの双方で学習履歴が活きる設計になった。

システム全体像

flowchart LR
    A[Daily Translation 問題出題] --> B[回答 + 添削]
    B --> C{score}
    C -->|3 mastered| D[masteredタグ付与]
    C -->|0-2| E[learning状態]

    D --> F[ingest_personal.py]
    D --> G[ingest_personal_chunks.py]

    F --> H[personal_corpus 単語空間]
    G --> I[personal_chunks チャンク空間]

    H --> J[gap analysis words]
    I --> K[gap analysis chunks]

    J --> L[次の単語出題最適化]
    K --> M[次のチャンク出題最適化]

    L --> A
    M --> A

出題トラック分離(競合回避)

flowchart TB
    Q[pick_question.py] --> T{track}
    T -->|word| W[gap_chunk除外]
    T -->|chunk| C[gap_chunkのみ]
    T -->|mixed| R[確率選択 chunk_ratio=0.25]

    R --> R1[25% chunk]
    R --> R2[75% word]

    P[pending] --> PX{pending.track}
    PX -->|一致/ mixed/all| Q
    PX -->|不一致| S[他トラックへ流さない]
  • register_question.py --track chunkCategory=gap_chunk を既定化
  • pendingtrack を保存し、別トラックの誤処理を防止
  • mixed は 25% チャンク、75% 単語(曜日依存なし)

チャンク反映の仕様(重要)

以前:

  • mastered後の同期は personal_corpus(lemma)中心
  • チャンク学習が単語に分解され、フレーズ構造としては残りにくい

現在:

  • record_answer.py --sync-personal-corpus
    • ingest_personal.py(単語)
    • ingest_personal_chunks.py(チャンク) を連続実行
  • masteredチャンクが personal_chunks に保存されるため、 チャンクギャップ分析と次回出題に直接効く

運用ルール

  1. 出題は mixed を基本にし、--chunk-ratio 0.25 を標準運用
  2. score=3(mastered)でのみ「言語空間の確定知識」とみなす
  3. ギャップ分析は単語・チャンクを別々に出し、キューも分離管理
  4. 1ターンで単語とチャンクを混在させない(認知負荷と運用バグ回避)

データベース / ストレージの役割

実体役割
SRS本体Anki English Practice出題履歴・間隔反復・mastered判定の一次ソース
セッション状態memory/anki_pending.jsonいま出している1問の状態管理(未回答保護)
出題履歴補助memory/anki_last_asked.json直近出題カードの再出題抑制
単語知識空間ChromaDB personal_corpusmastered回答から抽出したlemma知識
チャンク知識空間ChromaDB personal_chunksmastered回答/targetから抽出したphrase知識
参照語彙空間ChromaDB reference_corpusNAWL/NGSL基準(単語ギャップ計算の母集団)
参照チャンク空間data/english-corpus/oxford_chunks_master.csv などOxford等由来のチャンク母集団
発話ログdata/wna/utterances.parquet, data/wna/ngrams.parquetWNAセッション起点の個人言語データ

nani / daily-translation / wna 連携フロー

flowchart LR
    N[#nani: なんていうんだっけ] --> NI[nani_ingest.py]
    W[#wna: ロールプレイ + FB] --> WI[nani_ingest.py --category wna]
    D[#daily-translation: 出題/回答] --> DR[record_answer.py]

    NI --> A[(Anki English Practice)]
    WI --> A
    DR --> A

    A -->|mastered| IP[ingest_personal.py]
    A -->|mastered chunk| IPC[ingest_personal_chunks.py]

    IP --> PC[(Chroma personal_corpus)]
    IPC --> PCH[(Chroma personal_chunks)]

    PC --> GAPW[単語ギャップ分析]
    PCH --> GAPC[チャンクギャップ分析]

    GAPW --> D
    GAPC --> D

チャンネル別の役割

  • daily-translation
    • 主ループ(出題・回答・添削・SRS更新)
    • track=word/chunk/mixed で出題トラックを制御
  • nani
    • 「知りたい表現」の即時キャプチャ入口
    • 回答提示後に Anki 登録し、後日 review で再出題
  • wna
    • 実戦発話(ロールプレイ)から改善表現を抽出
    • フィードバックで出た表現を SRS に還流

連携の設計意図

  1. nani/wna = インプット収集口(必要表現を獲得)
  2. daily-translation = 定着ループ(再現可能な運用)
  3. english-corpus = 定量評価(次に何を学ぶかを自動最適化)

次の改善候補

  • personal_chunks 用の専用 gap script を標準化(rank/priority付き)
  • チャンクの正規化強化(i'd / i would など)
  • mastered解除時の厳密同期(再計算/削除戦略)

関連

  • このノート
  • 実装参照: skills/daily-translation/scripts_py/ / skills/english-corpus/scripts/