中文斷詞技術與字數計算
英文的字詞之間有空格分隔,計算字數(word count)相對直觀。但中文沒有天然的詞彙邊界標記,這讓「字數」和「詞數」的計算成為一個既有趣又充滿挑戰的技術問題。
中文的「字」與「詞」
在討論中文字數計算之前,必須先釐清兩個基本概念:
- 字(Character) — 單一漢字,如「我」「是」「人」。在 Unicode 中,每個漢字佔一個碼位
- 詞(Word) — 由一個或多個漢字組成的語義單元,如「電腦」「人工智慧」「我們」
當我們說「這篇文章有 500 字」時,通常指的是 500 個漢字(字元數),而不是 500 個詞。這與英文的「500 words」概念不同。
重點摘要:中文的「字數」通常指字元數(character count),而英文的「word count」指詞數。一篇 1,000 字的中文文章,如果經過斷詞處理,詞數通常約為 600-700 個詞。
為什麼中文斷詞很困難
中文斷詞(Chinese Word Segmentation, CWS)是自然語言處理(NLP)中的基礎任務,也是一個尚未完全解決的問題。主要挑戰包括:
1. 歧義切分
同一串文字可能有不同的切分方式。例如:
- 「研究生命的起源」 — 「研究 / 生命 / 的 / 起源」還是「研究生 / 命 / 的 / 起源」?
- 「上海大學城」 — 「上海 / 大學城」還是「上海大學 / 城」?
這種歧義需要結合上下文語境才能正確判斷。
2. 未登錄詞(OOV)
語言不斷演化,新詞彙不斷產生。人名、地名、網路流行語等往往不在詞典中。例如「ChatGPT」「元宇宙」等詞彙在出現之初不會被詞典收錄。
3. 詞彙邊界模糊
有些語言單位到底算一個詞還是多個詞,即使語言學家也有分歧。例如「中華人民共和國」是一個詞還是多個詞的組合?
主要的斷詞方法
基於詞典的方法
最直觀的方法是維護一個詞典,將文本與詞典中的詞條進行匹配。常見的匹配策略包括:
| 方法 | 說明 | 優缺點 |
|---|---|---|
| 正向最大匹配(FMM) | 從左到右,每次取最長的詞 | 簡單快速,但會遇到歧義 |
| 逆向最大匹配(BMM) | 從右到左,每次取最長的詞 | 在中文中通常比 FMM 準確 |
| 雙向最大匹配 | 同時用 FMM 和 BMM,取較優結果 | 準確度更高,速度較慢 |
基於統計的方法
利用大量標註語料庫訓練統計模型。隱馬可夫模型(HMM)和條件隨機場(CRF)是常用的統計方法。它們能夠學習字與字之間的關聯模式,對未登錄詞有一定的處理能力。
基於深度學習的方法
近年來,基於 LSTM、BERT 等深度學習模型的斷詞方法取得了顯著進展。這些模型能夠捕捉更複雜的語言特徵,在標準測試集上達到了 97% 以上的 F1 值。
常用的中文斷詞工具
- Jieba(結巴) — 最流行的 Python 中文斷詞套件,結合了詞典和 HMM 模型
- CKIP Tagger — 中央研究院開發,對繁體中文支援最好
- HanLP — 功能豐富的中文 NLP 工具包
- PaddleNLP — 百度開發,基於深度學習的高精度斷詞
Unicode 與中文字元
在程式設計中處理中文字數計算,了解 Unicode 標準是必要的。中文字元主要落在以下 Unicode 區塊:
- CJK 統一漢字(U+4E00 - U+9FFF) — 最常用的 20,992 個漢字
- CJK 統一漢字擴展 A(U+3400 - U+4DBF) — 6,592 個較少用的漢字
- CJK 統一漢字擴展 B-F — 更多的罕用字和古字
- CJK 相容漢字(U+F900 - U+FAFF) — 相容用字
在 JavaScript 中,可以使用正則表達式 /[\u4e00-\u9fff]/g 來匹配最常用的漢字,並計算中文字數。
字數計算的實務建議
對於一般的中文字數統計需求,以下是實用的建議:
- 純字元數 — 適合學校作文、論文等有明確字數要求的場景
- 不含空白字元數 — 排除空格和換行,更準確地反映實際內容量
- 中文字元數 — 只計算漢字,排除英文和數字
- 混合計算 — 中文按字計算,英文按詞計算,這是最接近實際閱讀體驗的方式
結語
中文斷詞是一個看似簡單實則深奧的問題。對於一般使用者來說,了解「字」和「詞」的差異已經足夠。而對於開發者和研究者,中文斷詞仍然是一個活躍的研究領域,持續有新的方法和工具問世。
參考文獻
- Huang, Changning and Zhao, Hai. "Chinese Word Segmentation: A Decade Review." Journal of Chinese Information Processing, 21(3), 2007.
- Sun, Maosong et al. "Jieba Chinese Text Segmentation." GitHub Repository, 2023. https://github.com/fxsjy/jieba
- The Unicode Consortium. "CJK Unified Ideographs." The Unicode Standard, Version 15.0, 2022. https://www.unicode.org/charts/PDF/U4E00.pdf
- Xue, Nianwen. "Chinese Word Segmentation as Character Tagging." International Journal of Computational Linguistics and Chinese Language Processing, 8(1), 2003.