sql5 4.0.2

SQLite compatible database with CJK FTS5 full-text search and vector similarity
# Tokenizer - 分詞演算法理論

`src/fts/tokenizer.rs`

## 分詞的必要性

自然語言需要切分為可索引的單位:

```
英文:"Hello, World!" → ["hello", "world"]
中文:"你好世界" → ["你", "你好", "好", "世界"]
```

## 英文分詞流程

```
1. Unicode Normalization (NFKC)
2. Case Folding (大小寫統一)
3. Tokenization (分詞)
4. Filtering (過濾停用詞,可選)
5. Stemming (詞幹提取,可選)
```

## Unicode 斷字 (Unicode Segmentation)

基於 Unicode 屬性:

```rust
// Grapheme Cluster Boundary
// Word Boundary
// Sentence Boundary
```

### Unicode Line Breaking Algorithm (UAX #14)

决定在何處換行/斷字:
```
"Hello"  → 可以在 o 後換行
"您好"    → 不可以在字中間換行
```

## Bigram 分詞 (CJK)

### 為何需要特殊處理?

中文、日文、韓文(CJK)沒有自然分界。

### Bigram 演算法

滑動窗口取兩個相鄰字:

```
輸入:你 好 世 界
窗口:[你好] [好世] [世界]
輸出:你/好/你好/好世/世界
```

### 單字 + Bigram 混合

```
輸入:"你好"
輸出:
  - 單字:你、好
  - Bigram:你好
```

好處:召回率高,平衡精確度。

## 詞典分詞 (Dictionary-based)

最大匹配演算法(Maximum Matching):

```
輸入:"研究生物"
詞典:研究生、研究、生物

正向最大匹配:
  研究生物 → 研究 + 生物 ✓

反向最大匹配:
  研究生物 → 研究生 + 物 ✗

結果:研究生/生物
```

## 理論參考

- Unicode Standard Annex #29: Text Segmentation
- Unicode Standard Annex #14: Line Breaking
- Stanford NLP - Word Segmentation