在保險理賠自動化與醫療申報系統的開發中,最令後端工程師頭痛的痛點之一,就是各家醫療院所的「醫療收據項目命名並無統一標準」。

以最常見的**「藥費」**為例:

  • 台大醫院 收據上顯示為:藥費
  • 馬偕醫院 收據上顯示為:藥品費
  • 耕莘醫院 收據上顯示為:西藥費

在實務上,後端系統必須將這些五花八門的異質名稱,精確對齊到保險核心系統標準的「100+ 項核心收費項目代碼」(例如:統一對齊到 016 藥費)。

傳統的做法是寫幾百行 Regular Expression (Regex) 正則表達式,或者維護一張極為龐大的資料庫 SQL 關鍵字對照表(CASE WHEN ... LIKE ...)。然而,當對接的醫院數量變多、名稱稍微變動或有錯字時,這種硬刻規則的方式高度依賴人工維護,隨著資料來源增加,容易產生規則衝突,也會使後續維護成本快速上升。這篇我們分享如何利用 AI Embedding 模型 計算語意向量相似度,實現自動化、具備容錯力的項目對齊。

核心概念:Embedding 向量相似度計算

用 Embedding 對齊項目的思路,是將文字從「字面比對」升級為「語意距離計算」,主要分為三個核心步驟:

語意向量對齊三步驟

  1. 文字向量化 (Embedding):利用預訓練的 Text Embedding 模型,將輸入的「異質收費項目名稱」與系統的「標準項目名稱」,分別轉換成高維度的語意向量(例如一個包含 768 或 1536 個浮點數的陣列)。
  2. 相似度計算 (Cosine Similarity):利用幾何學上的「餘弦相似度」公式,計算這兩個高維向量在空間中的夾角餘弦值,數值愈接近 1 代表語意愈相似。
  3. 自動映射對齊:系統將輸入項目的向量與標準項目資料庫進行比對,自動推薦或直接映射到相似度得分最高的標準項目(如:自動將「西藥費」對齊至「016 藥費」)。

數學原理:餘弦相似度 (Cosine Similarity)

餘弦相似度是計算兩個向量在方向上相似程度的經典幾何指標。給定異質項目向量 $\mathbf{A}$ 與標準項目向量 $\mathbf{B}$,其餘弦相似度計算公式如下:

$$\text{Cosine Similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{\Vert{}\mathbf{A}\Vert{} \Vert{}\mathbf{B}\Vert{}} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}}$$

這個公式的巧妙之處在於,它不受字串長度的工作影響,只專注於向量在高維語意空間中的指向方向。即使兩個詞字面完全不同(如「西藥費」與「藥品費」),只要在模型訓練中它們的上下文含意相近,計算出來的相似度依然會非常高(通常 > 0.85)。

Python 程式碼實作與測試結果

以下我們使用 sentence-transformers 套件,搭配適合繁體中文語意的輕量模型,來實作這套對齊管線:

import numpy as np
from sentence_transformers import SentenceTransformer

# 1. 載入支援繁體中文的高效語意向量模型
# 在地端執行時會自動下載並載入此輕量化模型
model = SentenceTransformer('intfloat/multilingual-e5-base')

# 2. 定義系統內核心標準收費項目 (我們想對齊的目標)
standard_items = [
    "004 診察費",
    "015 檢驗費",
    "016 藥費",
    "017 注射處置費",
    "018 病房費",
    "019 膳食費"
]

# 預先計算標準項目的向量 (Production 環境中可存入向量資料庫或記憶體快取中)
standard_embeddings = model.encode(standard_items)

# 3. 定義各家醫院收據上可能出現的異質收費項目
raw_hospital_inputs = [
    "台大醫院: 藥費",
    "馬偕醫院: 藥品費",
    "耕莘醫院: 西藥費",
    "住院膳食費用",
    "常規血液檢驗費",
    "雙人病房差額"
]

def cosine_similarity(v1, v2):
    # 計算兩個向量的餘弦相似度
    dot_product = np.dot(v1, v2)
    norm_v1 = np.linalg.norm(v1)
    norm_v2 = np.linalg.norm(v2)
    return dot_product / (norm_v1 * norm_v2)

# 4. 進行語意對齊匹配
print("=== 異質醫療項目向量對齊結果 ===")
for raw_text in raw_hospital_inputs:
    # 去除醫院字樣,只保留項目名稱進行 Embedding 運算
    clean_text = raw_text.split(":")[-1].strip()
    input_embedding = model.encode(clean_text)
    
    best_score = -1.0
    matched_standard = None
    
    # 與所有的標準項目向量計算相似度
    for std_item, std_emb in zip(standard_items, standard_embeddings):
        score = cosine_similarity(input_embedding, std_emb)
        if score > best_score:
            best_score = score
            matched_standard = std_item
            
    print(f"原始輸入: 【{raw_text}】")
    print(f" -> 語意自動對齊: 【{matched_standard}】 (相似度得分: {best_score:.4f})")
    print("-" * 50)

生產環境落地避坑指南

雖然向量語意對齊非常強大,但在商用環境落地時,我們建議搭配以下策略以確保系統穩定性:

  • 慎選 Embedding 模型:若使用過於輕量或非中文原生的模型,處理短字串時常會因為缺乏上下文而導致相似度失準。
  • 設定門檻值閥值 (Threshold filtering):在實際專案中,應設定相似度門檻值(實際門檻值應根據驗證資料集與實際錯誤成本進行調整。)。若最高得分依然低於此數值,代表可能出現了全新的收費科目,系統應引導至人工進行覆核判定,而非強行映射,以避免帳目出錯。
  • 使用向量資料庫加速:若您的標準項目多達數千項,每次即時計算餘弦相似度會造成 CPU 負擔。也可以使用如 Milvus, Qdrant 等向量資料庫 (Vector Database) 進行快速的索引與相似度近鄰檢索 (ANN Search)。
  • 預先向量化與快取:標準項目的 Embedding 向量通常是靜態不變的,建議在系統啟動時一次性計算並常駐於記憶體中,運行時只需對輸入的字串進行單次 Embedding 運算即可。

如果您正尋求高精度、高安全性的企業級文檔處理解決方案,歡迎了解並測試我們的 ezAcquire AI+OCR 系統。 另外,我們也供AI+OCR雲端辨識服務 https://aiocr.io