# LDA 計画: 02 技術方針

[計画トップ](lda.md)

---

## 3.1 LDA の性質

- **入力**: 文書ごとの語の出現回数（Bag of Words）。LSA で使っている TF-IDF 行列の「TF 部分」や、二値/カウント行列を LDA 用に用意する。
- **出力**:
  - 文書-トピック分布 θ（文書数 × K）。**K の規定値は 128**。ユーザー指定で変更可能で、変更時は再学習・再構成する。
  - トピック-語分布 φ（K × 語彙数）
- **推論**: 新規クエリ文を「既存の φ で固定」してトピック分布だけ推定し、その分布と各チャンクの θ で類似度を計算する。

## 3.2 Rust 実装の候補

- **latentdirichletallocation**（[crates.io](https://crates.io/crates/latentdirichletallocation)）: 純粋な LDA。学習・推論の API を確認し、語彙を LSA と揃えられるか検討する。
- **自前実装**: Collapsed Gibbs Sampling や Variational Bayes を ndarray で実装。既存の `utils::lsa` と同様に `utils::lda` を用意する案。
- いずれにしても **語彙は LSA の TermDocumentMatrixBuilder と共通化**し、LDA 用の BoW 行列を同じ語彙で作る。

## 3.3 ストレージ

- **items_lda**: チャンク ID と K 次元のトピック分布（blob または vec0 の 1 行）を保存。**K の規定値は 128**。ユーザーが K を変更したら再学習し、items_lda を新しい K で再構成する。
- 検索時は **現在の設定が「LSA」なら items_lsa / vec_items（LSA）、「LDA」なら items_lda** を参照する。切り替え時は選択中の方式のインデックスのみを使う。

```mermaid
flowchart TB
  subgraph 学習
    M[全チャンク BoW] --> LDA[LDA 学習]
    LDA --> phi[φ: トピック×語]
    LDA --> theta[θ: 文書×トピック]
    theta --> DB[(items_lda)]
  end
  subgraph 検索
    Q[クエリ文] --> Qbow[BoW]
    Qbow --> inf[θ_q 推定 φ 固定]
    inf --> sim[コサイン類似度]
    DB --> sim
    sim --> rank[ランキング]
  end
```
