核心思路
中文錯別字識別**不像英文有明確單詞邊界**,需結合**分詞、詞典、語言模型**三層防線:
輸入文本 → 分詞 (斷句/切詞) → 候選詞生成 → 詞典過濾 → 語言模型打分 → 糾錯輸出
關鍵技術棧 (Spring MVC + iBatis/MyBatis 環境)
1. 分詞引擎選型
| 工具 | 特點 | 適用場景 |
| HanLP | Java 原生、字典+CRF/感知機、支援繁簡/命名實體/關鍵詞提取 | 生產環境首選,Jar 無原生依賴 |
| Jieba (Python) + JNA | 準確率高、詞庫豐富 | 可接受 Python 微服務或 JNA 呼叫 |
| IK Analyzer | Lucene/Solr 生態、智能分詞 | 全文檢索聯動場景 |
| Ansj | 輕量、支援用戶詞典 | 資源受限嵌入式 |
2. 詞典來源與結構
- **通用詞典**:現代漢語詞典、同義詞詞林、THUOCL、Sogou 細胞詞庫 (需授權)
- **領域詞典**:業務專有名詞 (如醫療、法律、電商 SKU),存入 DB 表 `dict_term(term, freq, tag)`
- **混淆集**:同音/同形字對表 (如 `的/地/得`、`沒/沒`),可從論文數據集 (SIGHAN, CSCD) 獲取
3. 識別算法流程
// 伪代碼
List detect(String text) {
List terms = HanLP.segment(text); // 分詞
List errors = new ArrayList<>();
for (Term t : terms) {
// 1. 詞典精確匹配
if (dict.contains(t.word)) continue;
// 2. 編輯距離候選 (Levenshtein ≤ 2)
List cands = confusionSet.getOrDefault(t.word, Collections.emptyList());
// 3. 語言模型打分 (KenLM / BERT / N-gram)
String best = cands.stream()
.max(Comparator.comparing(c -> lm.score(replace(text, t, c))))
.orElse(null);
if (best != null && !best.equals(t.word)) errors.add(t.word + "->" + best);
}
return errors;
}
4. 語言模型選擇
- N-gram (KenLM):輕量、離線、秒級加載,適合嵌入 Java 進程 (JNI)
- BERT / RoBERTa (Masked LM):準確率最高,需 Python 微服務 (Transformers + FastAPI),延遲 50-200ms
- 混合策略:短文本用 KenLM,長文本/高價值內容調用 BERT API
工程落地建議
- **微服務化**:分詞/糾錯獨立部署 (gRPC/REST),Java 主服務輕量調用
- **緩存熱詞**:Redis 緩存高頻查詢結果,降低延遲
- **增量更新**:詞典變更發布事件 → 分詞引擎熱加載 (HanLP `CustomDictionary.reload()`)
- **評估指標**:Precision/Recall/F1 在標註測試集 (如 SIGHAN15) 定期回歸
總結
**分詞 + 詞典過濾 + 語言模型打分** 是中文錯別字識別的標準範式。選型上:**HanLP + KenLM** 可全 Java 棧落地;追求 SOTA 準確率則引入 **BERT 微服務**。iBatis/MyBatis 僅負責詞典/混淆集的持久化讀取,核心算法在服務層實現。
- 上一篇文章: Struts1 Action 之間跳轉與參數傳遞實現方法
- 下一篇文章: WPF/UWP Image 控件 Binding 圖片路徑不顯示:Uri 協議、相對路徑、BitmapImage 完整解析
Copyright ©
程式碼之家 All Rights Reserved