🏷️ 命名實體識別 (NER)
FLAT・CKIP・PaddleNLP UIE · 醫療診斷書・對話 Slot-Filling · ~100 天踩坑
作者:TonTon Huang Ph.D.|投入時間:2019/12/02–2020/02/29(~100 天)+ 2023 醫療場景再投入|更新:2026-07-28
命名實體識別(NER)的核心任務是「從文本中找出有特定意義的詞,並標記它屬於哪個類別」。開放域標準類別包括人名、地名、組織名、時間、日期;特定領域如醫療診斷書則延伸到藥名、疾病名、手術名稱等。
NER 在實際系統中幾乎無處不在:對話意圖理解、關係抽取、輿情分析、多輪對話 Slot-Filling——只要需要「從語言中提取結構化信息」的場景,NER 就是第一步。
#NER
#FLAT
#CKIP
#PaddleNLPUIE
#醫療NER
#SlotFilling
直觀理解
NER 在做什麼?一個例子說清楚
輸入:「你好,我是台北富邦銀行ORG的王志明PER,想跟您聊聊個人信貸PRODUCT的事情,您方便嗎?」
NER 模型把「台北富邦銀行」標為機構(ORG)、「王志明」標為人名(PER)、「個人信貸」標為產品名(PRODUCT)。有了這些結構化信息,下游系統就能自動分類為「貸款類來電」並決策是否代接。
醫療診斷書範例:「病患於2023/08/15TIME接受腹腔鏡膽囊切除術SURGERY,術後使用頭孢氨苄 500mgMEDICINE預防感染」
NER:傳統方法 vs LLM
💡 核心論點:封閉域 NER(實體類型固定、如醫療藥名)用 BERT+CRF 效果更穩定且成本更低。開放域 NER(實體類型多變、需要常識推斷)LLM 優勢明顯。
| 比較維度 |
BERT+CRF / UIE 封閉域推薦 |
LLM(GPT-4o / Gemini)開放域推薦 |
| 固定實體類型 | F1 90–95%,穩定 | F1 85–92%,prompt 稍有變化結果就不同 |
| 新領域實體 | 需重新標注 500+ 筆微調 | 描述給 LLM,zero-shot 可到 F1 70–80% |
| 嵌套實體 | FLAT 架構原生支援嵌套 | LLM 理解嵌套,但輸出格式不穩定 |
| 批量處理成本 | GPU 1 萬筆/秒,成本極低 | Token 計費,1 萬筆中等長度文本 ~$5–50 |
| 資安/隱私 | 私有化部署,醫療/金融適用 | 文本傳送外部,HIPAA 等法規要求需謹慎 |
✅ 2026 最佳策略:UIE(通用信息抽取) — PaddleNLP UIE 允許你用自然語言定義實體類型,少量標注(50–200 筆)即可微調,兼具傳統 NER 的效率與 LLM 的靈活性,是目前中文 NER 的最佳起點。
主流框架
中文 NER 框架大比拼
🏆 PaddleNLP UIE(通用信息抽取)2022 推薦
UIE(Universal Information Extraction)最大特點是用自然語言描述要抽取的實體,例如輸入 schema=["疾病名稱", "藥物名稱", "手術名稱"] 即可零樣本使用,少量標注(50–200 筆)微調後效果接近領域專用模型。支援實體識別、關係抽取、事件抽取三合一,是 2022 年以後的首選框架。
📐 FLAT(Flat-Lattice Transformer,2020)
解決中文 NER 的核心問題:詞邊界不確定性(中文沒有空格)。FLAT 把詞典中每個可能的詞都加入 Lattice 圖,用 Transformer 統一處理詞粒度和字粒度,無需對詞語進行硬切分。在嵌套實體(如「台北富邦銀行信貸部門」包含「台北富邦銀行」)場景尤為優異。
🏫 CKIP Tagger(中研院,Academia Sinica)
中央研究院詞庫小組開發,針對繁體中文優化,整合了詞性標注(POS tagging)和 NER。是台灣場景最「在地化」的選擇,對繁體中文特有詞彙和命名習慣(如台灣地名、政府機構名稱)表現最好。缺點是需要下載 ~2GB 的 BERT 模型。
🔬 Stanford NER / spaCy
英文/多語言支援佳
Stanford NER 是 CRF-based 的老牌工具,規則可解釋性強。spaCy 3.x 提供可訓練的中文 pipeline,但預訓練中文模型在繁體中文上的表現遜於 CKIP 與 UIE。適合英文或多語言混合場景的 POC 階段。
⚙️ 哈爾濱工業大學 LTP
LTP(Language Technology Platform)整合分詞、詞性標注、依存句法分析、語義角色標注、NER,一站式中文 NLP 管線。但以簡體中文為主,台灣繁體場景需額外調整。
2023 實戰
醫療診斷書 NER:住院/手術/急診觸發詞
2023 年,團隊將 NER 應用於醫療診斷書自動分析:從非結構化的診斷文字中抽取關鍵信息,觸發保險理賠自動審核流程。
✅ 三大觸發詞類別:
• 住院觸發詞:「住院」「入院」「留院觀察」「病房」等 → 觸發住院給付
• 手術觸發詞:「切除術」「縫合術」「攝影術」「內視鏡」等 → 觸發手術給付
• 急診觸發詞:「急診」「急救」「緊急入院」「CPCR」等 → 觸發急診給付
⚠️ 醫療 NER 的特殊挑戰:
• 縮寫和簡稱:診斷書常用 "Fx"(骨折)、"DM"(糖尿病)、"HTN"(高血壓),需維護醫學縮寫詞典
• 否定表達:「排除肺炎」≠「確診肺炎」,NER 必須搭配否定偵測(Negation Detection)
• 數量詞與實體邊界:「500mg 頭孢氨苄」是否把「500mg」包入實體邊界,不同應用場景需求不同
💡 LLM 在醫療 NER 的角色:醫療縮寫詞典維護成本極高,LLM(如 GPT-4)能夠理解醫學縮寫並補全詞典,與傳統 NER 搭配使用:傳統 NER 處理高頻已知實體,LLM 處理低頻縮寫和新詞,形成互補。
應用延伸
NER 的延伸應用:對話 Slot-Filling
Slot-Filling(槽位填充)是 NER 在對話系統中的直接應用:把用戶說的話裡的關鍵信息填入預定義的欄位(Slot),再觸發後端業務邏輯。
用戶說:「我想預約明天下午三點TIME去台大醫院LOCATION的心臟科DEPARTMENT門診」
→ Slot: {time: "明天下午三點", hospital: "台大醫院", dept: "心臟科"}
電話助理場景中,我們嘗試用拼音、注音幫助識別品牌名(例如用戶說「蘋果」但 ASR 轉錄成「頻果」),並用「改寫」技術修正語句後再做 NER,整個 pipeline 複雜但效果顯著。
✅ ChineseAnnotator 推薦:標注 NER 數據最痛苦的是格式轉換和標注效率。
ChineseAnnotator 是專為中文設計的標注工具,支援 NER/分類/相似度三種任務,Web 界面友善,是當時找到的最好用選擇。
踩坑記錄
NER 的萬年大坑
⚠️ 斷詞帶來的邊界問題:「台灣大學」應該是一個實體(ORG),還是「台灣」(地名)+「大學」(通用名詞)?Jieba 可能把它切成兩個詞,FLAT 則視為一個候選片段。不同斷詞工具輸出不同,NER 邊界定義必須在標注規範中寫清楚。
⚠️ 品牌名/注音拼音實驗的坑:為了讓 NER 能識別品牌名(ASR 輸出可能只有注音或拼音),我們做了大量實驗:用注音替換文字、把拼音加入 Embedding。結果:效果有限,且標注成本翻倍。後來改用詞典 lookup + 後處理的方式,反而更簡單有效。
⚠️ RASA 整合的坑:RASA 是對話框架的好選擇,但強行把自訓練的 NER 模型嵌入 RASA pipeline,需要配合其 Featurizer 架構做大量適配工作。除非你的場景 RASA 原生 NER 不夠用,否則不建議硬整合。
✅ 數據是一切:試了 FLAT、Stanford NER、CKIP、LTP 各種工具,最終 F1 的差異主要來自數據標注質量,而非模型選擇。500 筆高品質標注數據 > 5000 筆粗糙標注數據。