要点
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 chunkはCategory=gap_chunkを既定化pendingにtrackを保存し、別トラックの誤処理を防止mixedは 25% チャンク、75% 単語(曜日依存なし)
チャンク反映の仕様(重要)
以前:
- mastered後の同期は
personal_corpus(lemma)中心 - チャンク学習が単語に分解され、フレーズ構造としては残りにくい
現在:
record_answer.py --sync-personal-corpusでingest_personal.py(単語)ingest_personal_chunks.py(チャンク) を連続実行
- masteredチャンクが
personal_chunksに保存されるため、 チャンクギャップ分析と次回出題に直接効く
運用ルール
- 出題は
mixedを基本にし、--chunk-ratio 0.25を標準運用 - score=3(mastered)でのみ「言語空間の確定知識」とみなす
- ギャップ分析は単語・チャンクを別々に出し、キューも分離管理
- 1ターンで単語とチャンクを混在させない(認知負荷と運用バグ回避)
データベース / ストレージの役割
| 層 | 実体 | 役割 |
|---|---|---|
| SRS本体 | Anki English Practice | 出題履歴・間隔反復・mastered判定の一次ソース |
| セッション状態 | memory/anki_pending.json | いま出している1問の状態管理(未回答保護) |
| 出題履歴補助 | memory/anki_last_asked.json | 直近出題カードの再出題抑制 |
| 単語知識空間 | ChromaDB personal_corpus | mastered回答から抽出したlemma知識 |
| チャンク知識空間 | ChromaDB personal_chunks | mastered回答/targetから抽出したphrase知識 |
| 参照語彙空間 | ChromaDB reference_corpus | NAWL/NGSL基準(単語ギャップ計算の母集団) |
| 参照チャンク空間 | data/english-corpus/oxford_chunks_master.csv など | Oxford等由来のチャンク母集団 |
| 発話ログ | data/wna/utterances.parquet, data/wna/ngrams.parquet | WNAセッション起点の個人言語データ |
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 に還流
連携の設計意図
- nani/wna = インプット収集口(必要表現を獲得)
- daily-translation = 定着ループ(再現可能な運用)
- english-corpus = 定量評価(次に何を学ぶかを自動最適化)
次の改善候補
personal_chunks用の専用 gap script を標準化(rank/priority付き)- チャンクの正規化強化(
i'd/i wouldなど) - mastered解除時の厳密同期(再計算/削除戦略)
関連
- このノート
- 実装参照:
skills/daily-translation/scripts_py//skills/english-corpus/scripts/