Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

67 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ICD-10 速查

輸入英文/中文診斷關鍵字 → 即時回傳 ICD-10-CM 代碼 + 官方繁中翻譯。單一 HTML 檔,純前端、可離線、零安裝。

🔗 線上版

https://xyzkiwi.github.io/icd10-ed-quickref/

手機可加到主畫面當 App。一般查詢純前端運算、不上傳;僅當你主動送出 ✏️ 回饋時,才會送出該次關鍵字與備註。⚠️ 僅供臨床查詢輔助,非官方編碼系統,最終以正式系統與專業判斷為準(詳見網頁底部免責聲明)。

怎麼用

  • 線上:開上面網址,手機可加到主畫面。
  • 離線dist/icd_ed.html(= repo 根目錄 index.html,約 7 MB 單檔)寄給自己/丟雲端,點開即用,完全離線。

查詢範例:

  • contusion left forearm → S50.12XA 左側前臂挫傷
  • lt radial fx → 左橈骨骨折候選(縮寫、拼錯字都能命中)
  • GB stone / AGE / APN / AoD / t2dm / ptb → 縮寫展開後命中
  • n/v / overdose / unconscious → 急診慣用語直接帶出正確碼(R11.2/T50.90x 中毒/R41.82 AMS)
  • abscess anus → K61.0 肛門膿瘍(俗稱靠官方字母索引命中)
  • 頭部撕裂傷 / 前臂挫傷 → 中文也能查
  • N20.1 / N20 / S50.12XA → 代碼反查診斷
  • 點整個框框即複製代碼;外傷碼可切換第 7 碼(初診 A/後續 D/後遺症 S/開放型等)
  • 勾「去小數點」(預設開啟)→ 複製時不含小數點(N20.0→N200),配合不吃小數點的診間系統;偏好存本機
  • +清單:把多個碼加進本次診斷籃,一鍵複製整段「碼+中文」;最近使用會記住
  • ✏️ 回報:搜不準的字一句回報,集中彙整後據此優化排序/縮寫
  • 右上角切換明亮/暗黑;偏好存本機瀏覽器

外傷小人圖

前(Front)後(Back)人體圖同頁,點部位 → 自動帶出該部位的 ICD 碼段:

  • 先選傷型(撕裂傷/挫傷/骨折/扭傷/擦傷/燒燙傷)和側別(自動/未指定/左/右/雙側),再點身體部位
  • 側別標示:Front 左 Rt 右 Lt;Back 為背面故相反(左 Lt 右 Rt)。點下去會依解剖正確的左右帶碼
  • 點部位後用既有搜尋核心做「碼段白名單」硬過濾,查無不會 fallback 全域(防帶錯碼)
  • 骨頭等內部構造(tibia/fibula、radius/ulna)用點選後的情境式細分按鈕處理
  • 開始搜尋後小人圖自動收合以保留結果版面

設計重點

  • 資料來源:衛福部健保署官方「2023 中文版 ICD-10-CM」XLSX,非機器翻譯⚠️ 不要用 data.gov.tw 的 CSV(Big5 編碼瑕疵,6,956 列中文變半形 ?);用 NHI 官方 XLSX(乾淨,僅 8 個「瘻」字 build 時補 ?管→瘻管)。
  • 不自己組碼:官方表已列出所有合法 billable 碼(含第 7 碼、X 補位),工具只做搜尋+排序,保證代碼合法。
  • 全章節收錄:38,301 條目。S/T/V/W/X/Y 有第 7 碼者以「診斷主幹」分組、前端重組第 7 碼;其餘直接收。
  • 分頁:全部/外傷(S·T)/一般診斷。
  • typo/同義詞/縮寫全本機處理、不用 LLM:選了離線單檔,LLM 會破壞離線/零安裝優勢。
    • 同義詞表(fx→fracture、stone→calculus、bite→bitten…)、急診縮寫表 ABBR(GB/UTI/COPD/AGE/APN…)、模糊比對(Levenshtein)、尾綴/連字號正規化
    • 官方字母索引:CMS FY2023 Alphabetic Index(62k 臨床用詞→碼)烤進每個碼的 ax(別名) 欄;別名命中封頂 0.5 分、正式碼名 1.0 主導,俗稱也查得到
  • 搜尋精準度
    • IDF 字詞權重(上限 5.5):罕見字主導、acute/unspecified 等常用字幾乎不計分 → 濾掉「只命中常用字」的洪水
    • 臨床安全懲罰(硬約束):極性相反(traumatic↔nontraumatic、displaced↔nondisplaced)score−0.9;專一構造詞(tendon/nerve/artery 未打出)懲罰;未查左右時帶側性的碼降權;急診沒查 chronic 時慢性碼降權(acute 優先);周產期 P 章與病史 Z 碼在成人急診語境降權(避免 SAH 誤中「生產傷害」、oral cancer 誤中「口腔癌病史」)
    • 同分排序規則:分數相同時 unspecified/未明示碼優先、碼名多餘條件少者優先(急診常用未明示碼自動上浮,不必逐條釘)
    • PHRASE_CODE:臨床慣用語直接置頂(nasal bleeding→R04.0、coma→R40.20、stroke→I63.9、overdose→T50.90x、無力→R53.1、意識不清/unconscious→R41.82…)
    • 縮寫稽核:aod→主動脈剝離、aom→急性中耳炎、ptx/htx、vf、bppv、brbpr、appy、t1dm/t2dm、ptb 等;展開字串貼官方碼名(aod 用 dissection of aorta 而非 aortic dissection 以免混進腫瘤);歧義過高者(ad/ap/ra/oa…)刻意不收
  • 打字外傷語意層:打字命中「傷型詞(挫傷/擦傷/裂傷/骨折/鈍傷/血腫…)+部位詞(顏面/胸/背/四肢…)」時,比照小人圖套用「部位×傷型→碼段白名單」硬過濾,杜絕中文外傷措辭滑進燒傷 T2x/生產傷害 P/大腦 S06/皮膚癌 C44。具名長骨的「遠端/近端/平台/Colles」自動轉成 ICD 官方「lower/upper end of 骨」(distal radius→S52.5、tibia plateau→S82.1)。
  • 效能:38k 條目單次查詢約 30 ms(indexOf 快篩 + 閘門化模糊比對)。
  • 單檔內嵌:資料、搜尋邏輯、兩張底圖(base64)全部內嵌進 HTML(file:// 下瀏覽器擋外部 JSON 的 CORS)。搜尋邏輯抽成 search_core.js、詞表(同義詞/縮寫/片語/外傷部位表)抽成 lexicon.js,HTML 與測試共用同一份——加詞只動 lexicon.js

重新產生(pipeline)

固定順序,每一步驗證方式如下:

# ── 1. 資料層(每年碼表更新時才跑)────────────────────────
# 1a. 碼表 — NHI 官方 XLSX,工作表 'ICD-10-CM'
curl -sL "https://www.nhi.gov.tw/ch/dl-80147-c2be3cea667a4214802554bbca90bb49-1.xlsx" -o data/icd_nhi.xlsx
python3 src/build_data.py      # XLSX → build/icd_data.json(38,301 條目 + 常見診斷排序加權)

# 1b. 字母索引(同義詞來源)— CMS FY2023,就地把別名烤進 icd_data.json 的 ax 欄
curl -sL "https://www.cms.gov/files/zip/2023-code-tables-tabular-and-index.zip" -o data/index_src/got.zip
cd data/index_src && unzip got.zip && cd ../..
python3 src/build_index.py     # icd10cm_index_2023.xml → 別名寫入 icd_data.json

# ── 2. 小人圖層(只在調整熱區/換底圖時跑)──────────────────
#   底圖:design/chart_{front,back}_final.png(乾淨無標籤,前後對稱)
python3 src/manual_zones.py    # 方框 ∩ silhouette → approxPolyDP 多邊形 → design/zones_{front,back}.json
                               # 同時輸出 design/_manual_{front,back}.png 除錯疊圖(顏色塊=熱區,肉眼校準)
python3 src/build_figure.py    # zones json → 寫進 template.html 的兩個 SVG
                               # 側別映射:front R→right、back R→left(背面解剖反轉);標題自動帶左右

# ── 3. 組裝 ──────────────────────────────────────────────
python3 src/build_html.py      # 注入 icd_data.json + lexicon.js + search_core.js + 兩張底圖 base64 → dist/icd_ed.html

# ── 4. 測試 ──────────────────────────────────────────────
node src/test_search.js        # 194 案例 + 極性/側別/手指/prefix 守門,應全過

# ── 5. 上線(GitHub Pages)────────────────────────────────
cp dist/icd_ed.html index.html
git add -A && git commit -m "update" && git push   # 1-2 分鐘後線上自動更新

驗證小人圖熱區:把所有 .zone 強制顯色截圖比對(不是用想的)——

python3 - <<'PY'
html=open('dist/icd_ed.html',encoding='utf-8').read()
inj='<style>.zone{opacity:.5!important;fill:#2563eb!important;stroke:#1e3a8a!important;stroke-width:2!important}</style>'
open('/tmp/dbg.html','w',encoding='utf-8').write(html.replace('</head>',inj+'</head>'))
PY
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --disable-gpu \
  --force-device-scale-factor=2 --window-size=760,950 --virtual-time-budget=1800 \
  --screenshot=/tmp/dbg.png "file:///tmp/dbg.html"

部署架構

  • repo:xyzKIWI/icd10-ed-quickref(public)
  • GitHub Pages:main 分支根目錄 index.html → 自動發佈
  • repo 只含 index.html + src/ + design/(含底圖與 zones)+ README;大型原始資料(XLSX/zip/CSV)走 .gitignore

檔案結構

data/    官方原始資料(XLSX、字母索引、損毀 CSV 備份)── .gitignore,不進版控
src/
  build_data.py     XLSX → build/icd_data.json(碼表 + 排序加權)
  build_index.py    CMS 字母索引別名 → 烤進 icd_data.json(ax 欄)
  lexicon.js        詞表資料層(同義詞/縮寫 ABBR/片語 PHRASE_CODE/外傷部位表)── 加詞只動這裡
  search_core.js    搜尋邏輯(norm/IDF/懲罰/外傷語意層/排序)── HTML 與測試共用同一份
  manual_zones.py   小人圖熱區:方框 ∩ silhouette → 多邊形 json
  build_figure.py   zones json → 寫進 template.html 的 SVG(側別映射)
  template.html     UI(CSS + SVG 小人圖 + JS)
  build_html.py     注入資料 + 詞表 + 邏輯 + 底圖 base64 → dist/icd_ed.html
  test_search.js    194 案例 + 守門函式
design/
  chart_{front,back}_final.png   小人圖乾淨底圖(內嵌進成品)
  zones_{front,back}.json        熱區多邊形座標
build/   icd_data.json(中間產物)
dist/    icd_ed.html ← 最終成品,這個就是工具本體

已知範圍與未來可擴充

  • 全章節 billable ICD-10-CM 皆收錄;常見診斷排序加權只影響急診常見診斷的排序。
  • 小人圖:負責快速選外表部位;內部骨頭/關節用點選後的情境式細分按鈕處理(前臂/肘/腕/膝/踝的 radius/ulna/tibia/fibula 細分皆已具備)。
  • 回饋循環:✏️ 累積搜不準的字 → 集中彙整後補 lexicon.js 的片語/同義詞/排序(詞表與邏輯已分離,加詞不碰核心)。
  • 未來選配:輸入一段診斷描述、自動抽取候選診斷的選配模式,MVP 刻意不做。

免責聲明

本工具僅供醫療專業人員臨床查詢之輔助參考,非官方編碼系統。代碼與中文名稱來源為衛福部健保署 2023 年版 ICD-10-CM 及 CMS 官方字母索引,可能存在錯漏、版本差異或更新延遲。最終編碼與診斷請以正式編碼系統及醫療專業判斷為準。一般查詢純前端運算、不上傳;僅當使用者主動送出回饋時,會送出該次關鍵字與備註,不蒐集其他輸入內容。

About

急診 ICD-10-CM 診斷碼速查(離線單頁,含官方字母索引同義詞)

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages