Files
homeclaw/scripts/fill_latin_terms_v2.py
T
kimandClaude Sonnet 5 f014fec7e2 v4.0.0: 라이브 서비스 /srv/homeclaw로 이전 + Android 실기기 USB 연동 + 관리자 IP 차단 뷰어
- homeclaw 라이브 서비스를 /home/kim/homeclaw에서 /srv/homeclaw(480G 전용 파티션)로
  컷오버, 하드코딩된 절대경로 전부 치환 (config, mcp-servers, routes, scripts, web-ui)
- Android 에뮬레이터 컨테이너 리소스를 32스레드 Xeon 기준으로 상향(3g/3cpu → 6g/10cpu)
- 코드 에디터에 USB 실기기 패널 추가: 기기 감지, APK 설치, Logcat, scrcpy 화면 미러링
  (companion.py에 독립 프로세스로 scrcpy 스폰하는 로직 포함)
- 관리자 컨텍스트 뷰어에 차단된 IP 목록 탭 추가
- ollama primary 모델을 gemma4:31b-cloud로, 음성 TTS를 edge_tts로 전환

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 13:31:28 +09:00

1140 lines
48 KiB
Python

#!/usr/bin/env python3
"""
Fill missing Latin terms in dental_dict.db using a comprehensive dictionary
and PubMed MeSH terms for verification.
Usage:
python3 fill_latin_terms_v2.py # Preview changes (dry-run)
python3 fill_latin_terms_v2.py --apply # Apply changes to DB
python3 fill_latin_terms_v2.py --category 임플란트
python3 fill_latin_terms_v2.py --pubmed # Also search PubMed for remaining
"""
import sqlite3
import json
import sys
import time
import urllib.request
import urllib.parse
import re
DB_PATH = '/srv/homeclaw/.smallclaw/databases/dental_dict.db'
EUTILS = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils'
# ── Comprehensive Latin dictionary ──
# Key = lowercase english term, Value = Latin term
LATIN_DICT = {
# ===== ANATOMY =====
'alveolar bone': 'os alveolare',
'alveolar bone loss': 'resorptio ossis alveolaris',
'alveolar ridge augmentation': 'augmentatio cristae alveolaris',
'alveolar crest': 'crista alveolaris',
'alveolar process': 'processus alveolaris',
'alveolar bone assessment': 'evaluatio ossis alveolaris',
'alveoloplasty': 'alveoloplastica',
'periosteum': 'periosteum',
'mandible': 'mandibula',
'maxilla': 'maxilla',
'mandibular': 'mandibularis',
'maxillary': 'maxillaris',
'temporal muscle': 'musculus temporalis',
'masseter muscle': 'musculus masseter',
'salivary gland': 'glandula salivaria',
'parotid gland': 'glandula parotidea',
'submandibular gland': 'glandula submandibularis',
'sublingual gland': 'glandula sublingualis',
'trigeminal nerve': 'nervus trigeminus',
'facial nerve': 'nervus facialis',
'inferior alveolar nerve': 'nervus alveolaris inferior',
'lingual nerve': 'nervus lingualis',
'mental nerve': 'nervus mentalis',
'incisive nerve': 'nervus incisivus',
'dental anatomy': 'anatomia dentalis',
'oral mucosa': 'mucosa oralis',
'gingiva': 'gingiva',
'attached gingiva': 'gingiva inserta',
'free gingiva': 'gingiva libera',
'interdental papilla': 'papilla interdentalis',
'gingival sulcus': 'sulcus gingivalis',
'gingival recession': 'recessio gingivae',
'periodontal ligament': 'ligamentum periodontale',
'periodontal pocket': 'sacculus periodontalis',
'cementum': 'cementum',
'enamel': 'enamelum',
'dentin': 'dentinum',
'pulp': 'pulpa dentis',
'pulp chamber': 'cavum pulpi',
'root canal': 'canalis radicis dentis',
'pulp horn': 'cornu pulpi',
'apex': 'apex radicis dentis',
'occlusion': 'occlusio',
'tmj': 'articulatio temporomandibularis',
'temporomandibular joint': 'articulatio temporomandibularis',
'articular disc': 'discus articularis',
'articular eminence': 'tuberculum articulare',
'condyle': 'condylus mandibulae',
'coronoid process': 'processus coronoideus',
'ramus': 'ramus mandibulae',
'angle of mandible': 'angulus mandibulae',
'mental foramen': 'foramen mentale',
'incisive foramen': 'foramen incisivum',
'greater palatine foramen': 'foramen palatinum majus',
'nasopalatine canal': 'canalis nasopalatinus',
'maxillary sinus': 'sinus maxillaris',
'nasal cavity': 'cavum nasi',
'hard palate': 'palatum durum',
'soft palate': 'palatum molle',
'uvula': 'uvula',
'tongue': 'lingua',
'floor of mouth': 'solum cavi oris',
'lip': 'labium',
'upper lip': 'labium superius',
'lower lip': 'labium inferius',
'buccal mucosa': 'mucosa buccalis',
'palate': 'palatum',
'teeth': 'dentes',
'tooth': 'dens',
'primary tooth': 'dens deciduus',
'permanent tooth': 'dens permanens',
'deciduous tooth': 'dens deciduus',
'crown': 'corona dentis',
'root': 'radix dentis',
'cervical line': 'linea cervicalis',
'cementoenamel junction': ' junctio cementoenamelis',
'enamel prism': 'prisma adamantina',
'dentin tubule': 'tubulus dentinalis',
'odontoblast': 'odontoblastus',
'ameloblast': 'ameloblastus',
'cementoblast': 'cementoblastus',
'osteoblast': 'osteoblastus',
'osteoclast': 'osteoclastus',
'fibroblast': 'fibroblastus',
'collagen': 'collagen',
'bone': 'os',
'cortical bone': 'os corticale',
'cancellous bone': 'os spongiosum',
'lamina dura': 'lamina dura',
'bundle bone': 'os fasciculatum',
# ===== ORAL SURGERY (구강외과) =====
'extraction': 'extractio dentis',
'tooth extraction': 'extractio dentis',
'impacted tooth': 'dens impactus',
'impacted tooth extraction': 'extractio dentis impacti',
'wisdom tooth': 'dens serotinus',
'wisdom tooth extraction': 'extractio dentis serotini',
'third molar extraction': 'extractio dentis serotini',
'open reduction internal fixation': 'reductio aperta fixatio interna',
'tooth sectioning': 'sectio dentis',
'post-extraction hemorrhage': 'haemorrhagia post extractionem',
'dry socket': 'alveolitis sicca',
'alveolar osteitis': 'alveolitis',
'fracture mandible': 'fractura mandibulae',
'fracture maxilla': 'fractura maxillae',
'mandibular fracture': 'fractura mandibulae',
'maxillary fracture': 'fractura maxillae',
'zygomatic fracture': 'fractura ossis zygomatici',
'le fort fracture': 'fractura Le Fort',
'cyst oral': 'cystis oralis',
'odontogenic cyst': 'cystis odontogenica',
'radicular cyst': 'cystis radicularis',
'dentigerous cyst': 'cystis dentigera',
'keratocyst': 'cystis keratocystica',
'tumor oral': 'tumor oralis',
'ameloblastoma': 'ameloblastoma',
'odontoma': 'odontoma',
'biopsy': 'biopsia',
'incisional biopsy': 'biopsia incisionalis',
'excisional biopsy': 'biopsia excisionalis',
'frozen section biopsy': 'biopsia cryosectionis',
'needle biopsy': 'biopsia per acus',
'frozen section': 'sectio congelata',
'oral mucosal flap': 'lamina mucosae oris',
'mucoperiosteal flap': 'lamina mucoperiostealis',
'bone graft': 'transplantatio ossis',
'bone grafting': 'transplantatio ossis',
'sinus lift': 'elevatio sinus maxillaris',
'bone resection': 'resectio ossis',
'enucleation': 'enucleatio',
'marsupialization': 'marsupializatio',
'wound dehiscence': 'dehiscentia vulneris',
'wound healing': 'sanatio vulneris',
'hemostasis': 'haemostasis',
'suturing': 'sutura',
'abscess incision': 'incisio abscessus',
'drainage': 'drainage',
'trismus': 'trismus',
'lip laceration': 'laceratio labii',
'tongue laceration': 'laceratio linguae',
'nerve injury': 'laesio nervi',
'nerve repair': 'reparatio nervi',
'skin graft': 'transplantatio cutis',
'free flap': 'lamina libera',
'skin flap': 'lamina cutanea',
'vascularized graft': 'transplantatum vascularizatum',
'platelet-rich plasma': 'plasma plateletis divite',
'prf': 'fibrina plateletis divite',
'cleft lip': 'labium fissum',
'cleft palate': 'palatum fissum',
'cleft lip and palate': 'labium et palatum fissum',
'distraction osteogenesis': 'osteogenesis distractione',
'orthognathic surgery': 'chirurgia orthognathica',
'genioplasty': 'genioplastica',
'maxillectomy': 'maxillectomia',
'mandibulectomy': 'mandibulectomia',
'glossectomy': 'glossectomia',
'maxillary osteotomy': 'osteotomia maxillae',
'mandibular osteotomy': 'osteotomia mandibulae',
'segmental osteotomy': 'osteotomia segmentalis',
'tissue engineering': 'ingeniaria textus',
# ===== ORTHODONTICS (교정) =====
'orthodontic bracket': 'bracket orthodonticum',
'bracket': 'bracket',
'archwire': 'filarum arcus',
'orthodontic force': 'vis orthodontica',
'orthodontic wire': 'filarum orthodonticum',
'retainer orthodontic': 'retentor orthodonticus',
'orthodontic retainer': 'retentor orthodonticus',
'malocclusion': 'malocclusio',
'overjet': 'overjet',
'overbite': 'overbite',
'crossbite': 'crossbite',
'open bite': 'apertura mordendi',
'deep bite': 'morsus profundus',
'anterior crossbite': 'crossbite anterior',
'posterior crossbite': 'crossbite posterior',
'scissor bite': 'morsus scissors',
'class i malocclusion': 'malocclusio classis I',
'class ii malocclusion': 'malocclusio classis II',
'class iii malocclusion': 'malocclusio classis III',
'crowding': 'congestio dentium',
'spacing': 'diastema',
'diastema': 'diastema',
'midline deviation': 'deviatio lineae medialis',
'palatal expander': 'expansor palatinus',
'rapid maxillary expansion': 'expansio maxillaris rapida',
'lingual orthodontic appliance': 'apparatus orthodonticus lingualis',
'headgear': 'apparatus capitis',
'clear aligner': 'aligner transparentis',
'orthodontic elastic': 'elastica orthodontica',
'orthodontic band': 'fascia orthodontica',
'orthodontic bonding': 'connexio orthodontica',
'orthodontic debonding': 'deconnexio orthodontica',
'orthodontic tooth movement': 'motio dentis orthodontica',
'anchorage': 'anchorage',
'temporary anchorage device': 'dispositivum anchorae temporarium',
'mini-screw': 'mini-stria',
'mini-implant orthodontic': 'implantatum orthodonticum parvum',
'functional appliance': 'apparatus functionalis',
'twin block': 'twin block',
'bionator': 'bionator',
'herbst appliance': 'apparatus Herbst',
'orthognathic surgery orthodontic': 'chirurgia orthognathica orthodontica',
'serial extraction': 'extractio serialis',
'interproximal reduction': 'reductio interproximalis',
'retention orthodontic': 'retentio orthodontica',
'relapse orthodontic': 'recidiva orthodontica',
'root resorption orthodontic': 'resorptio radicis orthodontica',
'cleft orthodontics': 'orthodontia fissurae',
'growth modification': 'modificatio crescentiae',
'cephalometric analysis': 'analysis cephalometrica',
'cephalometric tracing': 'tracing cephalometricum',
'bolton analysis': 'analysis Bolton',
'space analysis': 'analysis spatii',
'treatment planning orthodontic': 'planatio therapiae orthodonticae',
# ===== CONSERVATIVE DENTISTRY (보존) =====
'dental caries': 'caries dentis',
'caries': 'caries',
'enamel caries': 'caries enameli',
'dentin caries': 'caries dentini',
'root caries': 'caries radicis',
'secondary caries': 'caries secundaria',
'rampant caries': 'caries rampantis',
'early childhood caries': 'caries infantum praecox',
'bottle caries': 'caries lactis',
'nursing caries': 'caries lactis',
'cavity preparation': 'preparatio cavitatis',
'class i cavity': 'cavitas classis I',
'class ii cavity': 'cavitas classis II',
'class iii cavity': 'cavitas classis III',
'class iv cavity': 'cavitas classis IV',
'class v cavity': 'cavitas classis V',
'acid etching': 'acidum etching',
'etching': 'etching acidum',
'bonding': 'connexio chemicalis',
'dental bonding': 'connexio dentalis chemicalis',
'composite resin': 'resina composita',
'composite restoration': 'restauratio resinae compositae',
'resin-modified glass ionomer cement': 'cementum ionomerum vitreum resina modificatum',
'glass ionomer': 'cementum ionomerum vitreum',
'glass ionomer cement': 'cementum ionomerum vitreum',
'amalgam': 'amalgama',
'amalgam restoration': 'restauratio amalgamae',
'porcelain': 'porcellana',
'porcelain restoration': 'restauratio porcellanae',
'gold restoration': 'restauratio auri',
'inlay': 'inlay',
'onlay': 'onlay',
'pulp capping': 'operculatio pulpi',
'direct pulp capping': 'operculatio pulpi directa',
'indirect pulp capping': 'operculatio pulpi indirecta',
'pulpotomy': 'pulpotomia',
'pulpectomy': 'pulpectomia',
'root canal treatment': 'therapia canalis radicis',
'root canal therapy': 'therapia canalis radicis',
'endodontic treatment': 'therapia endodontica',
'apicoectomy': 'apicectomia',
'retrograde filling': 'obturatio retrograda',
'gutta-percha': 'gutta-percha',
'endodontic file': 'lima endodontica',
'rubber dam': 'dammen rubber',
'dental operating microscope': 'microscopium dentale operativum',
'magnification': 'magnificatio',
'cracked tooth syndrome': 'syndroma dentis fissi',
'cracked tooth': 'dens fissus',
'tooth fracture': 'fractura dentis',
'crown fracture': 'fractura coronae dentis',
'root fracture': 'fractura radicis dentis',
'tooth wear': 'abrasio dentis',
'dental erosion': 'erosio dentalis',
'erosion dental': 'erosio dentalis',
'abrasion dental': 'abrasio dentalis',
'attrition dental': 'attritio dentalis',
'abfraction': 'abfractio',
'tooth bleaching': 'albor dentium',
'whitening': 'albor',
'vital bleaching': 'albor vitalis',
'non-vital bleaching': 'albor non-vitalis',
'fluoride treatment': 'therapia fluoridi',
'fissure sealant': 'sealant fissurae',
'pit and fissure sealant': 'sealant fossae et fissurae',
'sealant': 'sealant',
'varnish dental': 'varnish dentale',
'prophylaxis dental': 'prophylaxis dentalis',
'scaling dental': 'scalatio dentalis',
'polishing dental': 'politura dentalis',
'air polishing': 'politura aerea',
'ultrasonic scaling': 'scalatio ultrasonica',
'hand scaling': 'scalatio manualis',
'sponge retention': 'retentio spongiae',
'matrix band': 'fascia matricis',
'wedge dental': 'cuneus dentalis',
'liner dental': 'liner dentale',
'base dental': 'basis dentalis',
'varnish cavity': 'varnish cavitatis',
'desensitizing agent': 'agens desensibilizans',
'remineralization': 'remineralizatio',
'demineralization': 'demineralizatio',
# ===== PROSTHODONTICS (보철) =====
'prosthodontics': 'prosthodontia',
'crown prosthodontic': 'corona',
'bridge prosthodontic': 'pons',
'denture': 'prosthesis mobilis',
'complete denture': 'prosthesis mobilis totalis',
'partial denture': 'prosthesis mobilis partialis',
'removable partial denture': 'prosthesis mobilis partialis removibilis',
'fixed partial denture': 'prosthesis fixa partialis',
'overlay denture': 'prosthesis mobilis overlay',
'immediate denture': 'prosthesis mobilis immediata',
'implant denture': 'prosthesis mobilis implantatis',
'veneer': 'fornix laminaris',
'porcelain veneer': 'fornix laminaris porcellanae',
'porcelain fused to metal crown': 'corona porcellanae et metalli',
'all-ceramic crown': 'corona tota ceramica',
'full metal crown': 'corona tota metalli',
'gold crown': 'corona auri',
'zirconia crown': 'corona zirconiae',
'abutment prosthodontic': 'palum',
'pontic': 'corona pontis',
'retainer prosthodontic': 'retentor',
'clasp': 'clasp',
'connector': 'connexor',
'retention prosthodontic': 'retentio',
'support prosthodontic': 'supportum',
'stability prosthodontic': 'stabilitas',
'impression prosthodontic': 'impressio',
'impression material': 'materia impressionis',
'alginate': 'alginate',
'polyether': 'polyether',
'silicone impression': 'impressio siliconis',
'bite registration': 'registratio mordendi',
'facebow': 'arcus facialis',
'articulator': 'articulator',
'mounting': 'montatio',
'wax pattern': 'pattern cerae',
'wax try-in': 'probatio cerae',
'metal framework': 'framework metalli',
'porcelain firing': 'coctio porcellanae',
'glazing': 'glaciatio',
'shade matching': 'concordantia coloris',
'shade guide': 'dux coloris',
'titanium': 'titanium',
'cobalt-chromium': 'cobaltum-chromium',
'noble metal': 'metal nobile',
'base metal': 'metal basis',
'acrylic resin': 'resina acrylica',
'porcelain prosthodontic': 'porcellana',
'ceramic': 'ceramica',
'composite prosthodontic': 'resina composita',
'dental laboratory': 'laboratorium dentale',
'denture repair': 'reparatio prostheseos mobilis',
'denture reline': 'reline prostheseos mobilis',
'denture rebasing': 'rebasing prostheseos mobilis',
'denture adjustment': 'adjustatio prostheseos mobilis',
'occlusal adjustment': 'adjustatio occlusalis',
'occlusal splint': 'splint occlusalis',
'night guard': 'guardia noctis',
'mouth guard': 'guardia oris',
'sports guard': 'guardia athletica',
'tmj splint': 'splint TMJ',
'provisional restoration': 'restauratio provisoria',
'temporary crown': 'corona provisoria',
'temporary bridge': 'pons provisorius',
'post and core': 'palum et cor',
'ferrule': 'ferrule',
'crown lengthening prosthodontic': 'elongatio coronae',
'margin prosthodontic': 'margo',
'finish line': 'linea finitionis',
'chamfer': 'chamfer',
'shoulder': 'humerus',
'feather edge': 'margo tenuis',
'die': 'die',
'dies': 'dies',
'investment': 'investimentum',
'casting': 'casting',
'spruing': 'spruing',
'burnout': 'burnout',
# ===== PEDIATRIC DENTISTRY (소아치과) =====
'pediatric dentistry': 'odontiatria paediatrica',
'primary tooth': 'dens deciduus',
'permanent tooth': 'dens permanens',
'mixed dentition': 'dentitio mixta',
'deciduous dentition': 'dentitio decidua',
'permanent dentition': 'dentitio permanens',
'eruption': 'eruptio',
'tooth eruption': 'eruptio dentis',
'eruption sequence': 'sequentia eruptionis',
'delayed eruption': 'eruptio dilata',
'premature eruption': 'eruptio praematura',
'premature loss of primary tooth': 'pematura amissio dentis decidui',
'early childhood caries': 'caries infantum praecox',
'nursing caries': 'caries lactis',
'baby bottle tooth decay': 'caries lactis',
'bottle caries': 'caries lactis',
'rampant caries pediatric': 'caries rampantis infantilis',
'pulp therapy for primary teeth': 'therapia pulpi dentium deciduorum',
'pulpotomy primary': 'pulpotomia dentis decidui',
'pulpectomy primary': 'pulpectomia dentis decidui',
'stainless steel crown': 'corona chalybis inoxydabilis',
'ssc': 'corona chalybis inoxydabilis',
'strip crown': 'corona strip',
'preventive resin restoration': 'restauratio resinae preventiva',
'interim therapeutic restoration': 'restauratio therapeutica interim',
'itr': 'restauratio therapeutica interim',
'art restoration': 'restauratio therapeutica artis',
'atraumatic restorative treatment': 'therapia restaurativa atraumatica',
'space maintainer': 'maintenitor spatii',
'band and loop': 'fascia et circuitus',
'distal shoe': 'calceus distalis',
'lingual arch': 'arcus lingualis',
'nance appliance': 'apparatus Nance',
'space regainer': 'recuperator spatii',
'behavior management': 'directio comportamenti',
'tell-show-do': 'dic-monstra-face',
'sedation pediatric': 'sedatio paediatrica',
'nitrous oxide': 'oxidum nitrosum',
'conscious sedation': 'sedatio conscia',
'general anesthesia pediatric': 'anaesthesia generalis paediatrica',
'local anesthesia pediatric': 'anaesthesia localis paediatrica',
'sealant pediatric': 'sealant paediatricus',
'fluoride pediatric': 'fluoridum paediatricum',
'fluoride varnish': 'varnish fluoridi',
'topical fluoride': 'fluoridum topicum',
'systemic fluoride': 'fluoridum systemica',
'fissure sealant pediatric': 'sealant fissurae paediatricus',
'molar incisor hypomineralization': 'hypomineralizatio molaris incisivi',
'mih': 'hypomineralizatio molaris incisivi',
'amelogenesis imperfecta': 'amelogenesis imperfecta',
'dentinogenesis imperfecta': 'dentinogenesis imperfecta',
'dent dysplasia': 'dysplasia dentis',
'regenerative endodontics': 'endodontia regenerativa',
'apexification': 'apexificatio',
'apexogenesis': 'apexogenesis',
'traumatic dental injury': 'laesio dentis traumatica',
'tooth avulsion': 'avulsio dentis',
'tooth intrusion': 'intrusio dentis',
'tooth luxation': 'luxatio dentis',
'tooth concussion': 'concussio dentis',
'tooth subluxation': 'subluxatio dentis',
'root fracture pediatric': 'fractura radicis paediatrica',
'replantation': 'replantatio',
'splinting dental': 'splinting dentalis',
'ankylosis': 'ankylosis',
'pulp necrosis': 'necrosis pulpi',
'pulpal vitality': 'vitalitas pulpi',
'vitality test': 'test vitalitatis',
'electric pulp test': 'test pulpi electricus',
'thermal test': 'test thermalis',
'radiographic examination pediatric': 'examinatio radiographica paediatrica',
'bitewing radiograph pediatric': 'radiographia bitewing paediatrica',
'periapical radiograph pediatric': 'radiographia periapicalis paediatrica',
'panoramic radiograph pediatric': 'radiographia panoramica paediatrica',
# ===== PERIODONTICS (치주) =====
'periodontitis': 'periodontitis',
'gingivitis': 'gingivitis',
'chronic periodontitis': 'periodontitis chronica',
'aggressive periodontitis': 'periodontitis aggressiva',
'necrotizing periodontitis': 'periodontitis necroticans',
'periodontitis classification': 'classificatio periodontitidis',
'gingivitis classification': 'classificatio gingivitidis',
'plaque-induced gingivitis': 'gingivitis plack inducta',
'non-plaque-induced gingivitis': 'gingivitis non-plack inducta',
'periodontal abscess': 'abscessus periodontalis',
'gingival abscess': 'abscessus gingivalis',
'pericoronitis': 'pericoronitis',
'periodontal pocket': 'sacculus periodontalis',
'probing depth': 'profunditas probandi',
'clinical attachment level': 'nexus clinicalis attachmentis',
'clinical attachment loss': 'amissio nexus clinicalis',
'bleeding on probing': 'haemorrhagia in probando',
'suppuration': 'suppuratio',
'gingival enlargement': 'enlargement gingivae',
'gingival hyperplasia': 'hyperplasia gingivae',
'drug-induced gingival hyperplasia': 'hyperplasia gingivae pharmacogenica',
'gingival fibromatosis': 'fibromatosis gingivae',
'desquamative gingivitis': 'gingivitis desquamativa',
'gingivectomy': 'gingivectomia',
'gingivoplasty': 'gingivoplastica',
'periodontal flap surgery': 'chirurgia laminae periodontalis',
'mucogingival surgery': 'chirurgia mucogingivalis',
'osseous surgery': 'chirurgia ossea',
'bone surgery': 'chirurgia ossea',
'bone grafting periodontal': 'transplantatio ossis periodontalis',
'guided tissue regeneration': 'regeneratio textus directa',
'guided bone regeneration': 'regeneratio ossis directa',
'enamel matrix derivative': 'derivatum matricis enameli',
'emd': 'derivatum matricis enameli',
'barrier membrane': 'membranula barrierae',
'connective tissue graft': 'transplantatio textus conectivi',
'free gingival graft': 'transplantatio gingivae liberae',
'coronally advanced flap': 'lamina coronarie provecta',
'laterally positioned flap': 'lamina lateraliter posita',
'double papilla flap': 'lamina papillarum duplicium',
'tunnel technique': 'technica tunnel',
'pinhole technique': 'technica foraminis',
'scaling and root planing': 'scalatio et planatio radicis',
'root planing': 'planatio radicis',
'dental scaling': 'scalatio dentalis',
'curettage': 'curettage',
'open curettage': 'curettage aperta',
'closed curettage': 'curettage clausa',
'periodontal maintenance': 'manutentio periodontalis',
'supportive periodontal therapy': 'therapia periodontalis supportiva',
'occlusal adjustment periodontal': 'adjustatio occlusalis',
'occlusal splint periodontal': 'splint occlusalis',
'bruxism': 'bruxismus',
'furcation involvement': 'involvement furcationis',
'furcation': 'furcatio',
'root amputation': 'amputatio radicis',
'root resection': 'resectio radicis',
'hemisection': 'hemisectio',
'bicuspidization': 'bicuspidizatio',
'tunnel preparation': 'preparatio tunnel',
'furcation therapy': 'therapia furcationis',
'periodontal diagnosis': 'diagnosis periodontalis',
'periodontal risk assessment': 'evaluatio risk periodontalis',
'periodontal charting': 'charting periodontalis',
'bleeding index': 'index haemorrhagiae',
'plaque index': 'index plack',
'gingival index': 'index gingivae',
'probing charting': 'charting probandi',
'radiographic assessment periodontal': 'evaluatio radiographica periodontalis',
'mobility test': 'test mobilitatis',
'tooth mobility': 'mobilitas dentis',
'fremitus': 'fremitus',
'occlusal trauma': 'trauma occlusale',
'primary occlusal trauma': 'trauma occlusale primarium',
'secondary occlusal trauma': 'trauma occlusale secundarium',
# ===== PREVENTIVE DENTISTRY (예방치학) =====
'preventive dentistry': 'odontiatria preventiva',
'dental prophylaxis': 'prophylaxis dentalis',
'prophylaxis': 'prophylaxis',
'oral hygiene': 'hygiena oris',
'toothbrushing': 'pulzatio dentium',
'toothbrush': 'penicillus dentium',
'electric toothbrush': 'penicillus dentium electricus',
'flossing': 'flossing',
'dental floss': 'floss dentalis',
'interdental brush': 'peniculus interdentalis',
'interdental cleaning': 'purgatio interdentalis',
'toothpick': 'dentiscalpium',
'oral irrigation': 'irrigatio oralis',
'mouthwash': 'collutorium',
'antimicrobial mouthwash': 'collutorium antimicrobicum',
'fluoride': 'fluoridum',
'fluoride application': 'applicatio fluoridi',
'fluoride varnish': 'varnish fluoridi',
'fluoride gel': 'gel fluoridi',
'fluoride rinse': 'rinse fluoridi',
'topical fluoride application': 'applicatio fluoridi topica',
'systemic fluoride': 'fluoridum systemica',
'water fluoridation': 'fluoridatio aquae',
'fluorosis': 'fluorosis',
'dental plaque': 'plaque dentale',
'plaque control': 'directio plack',
'plaque formation': 'formatio plack',
'plaque removal': 'remotio plack',
'dental calculus': 'calculus dentalis',
'supragingival calculus': 'calculus supragingivalis',
'subgingival calculus': 'calculus subgingivalis',
'dental biofilm': 'biofilm dentale',
'caries prevention': 'preventio cariei',
'caries risk assessment': 'evaluatio risk cariei',
'caries activity test': 'test activitatis cariei',
'diet counseling': 'consilium diaetae',
'sugar intake': 'introitus sacchari',
'oral health education': 'educatio salutis oralis',
'oral health promotion': 'promotio salutis oralis',
'community oral health': 'salus oralis communitatis',
'school dental health': 'salus dentalis scholae',
'pit and fissure sealant': 'sealant fossae et fissurae',
'sealant preventive': 'sealant preventivus',
'dmft index': 'index DMFT',
'dmfs index': 'index DMFS',
'dfs index': 'index DFS',
'caries index': 'index cariei',
'oral hygiene index': 'index hygienae oralis',
'patient education': 'educatio patientis',
'motivational interviewing': 'interview motivans',
'health belief model': 'model credentiae salutis',
'smoking cessation': 'cessatio fumandi',
'tobacco cessation': 'cessatio tabaci',
'alcohol counseling': 'consilium alcohol',
'periodontal screening': 'screening periodontale',
# ===== ORAL MEDICINE (구강내과) =====
'oral medicine': 'medicina oralis',
'oral diagnosis': 'diagnosis oralis',
'oral mucosal examination': 'examinatio mucosae oralis',
'oral examination': 'examinatio oralis',
'extraoral examination': 'examinatio extraoralis',
'intraoral examination': 'examinatio intraoralis',
'stomatitis': 'stomatitis',
'aphthous stomatitis': 'stomatitis aphthosa',
'recurrent aphthous stomatitis': 'stomatitis aphthosa recurrens',
'herpes simplex': 'herpes simplex',
'herpes labialis': 'herpes labialis',
'oral herpes': 'herpes oralis',
'herpes zoster': 'herpes zoster',
'candidiasis oral': 'candidiasis oralis',
'oral candidiasis': 'candidiasis oralis',
'thrush': 'candidiasis oralis',
'angular cheilitis': 'cheilitis angularis',
'cheilitis': 'cheilitis',
'glossitis': 'glossitis',
'geographic tongue': 'lingua geographica',
'fissured tongue': 'lingua fissurata',
'hairy tongue': 'lingua villosa',
'black hairy tongue': 'lingua villosa nigra',
'burning mouth syndrome': 'syndroma ardens oris',
'xerostomia': 'xerostomia',
'dry mouth': 'xerostomia',
'xerostomia management': 'directio xerostomiae',
'artificial saliva': 'saliva artificialis',
'saliva stimulant': 'stimulus salivae',
'saliva substitute': 'substitutum salivae',
'sialadenitis': 'sialadenitis',
'sialolithiasis': 'sialolithiasis',
'salivary gland dysfunction': 'dysfunctio glandulae salivariae',
'mucocele': 'mucocele',
'ranula': 'ranula',
'halitosis': 'halitosis',
'oral malodor': 'malodor oralis',
'oral lichen planus': 'lichen planus oralis',
'lichen planus': 'lichen planus',
'pemphigus': 'pemphigus',
'pemphigoid': 'pemphigoides',
'mucous membrane pemphigoid': 'pemphigoides membranae mucosae',
'erythema multiforme': 'erythema multiforme',
'stevens-johnson syndrome': 'syndroma Stevens-Johnson',
'oral allergy': 'allergia oralis',
'contact allergy oral': 'allergia contactus oralis',
'drug reaction oral': 'reactio pharmacogenica oralis',
'oral leukoplakia': 'leukoplakia oralis',
'leukoplakia': 'leukoplakia',
'erythroplakia': 'erythroplakia',
'oral submucous fibrosis': 'fibrosis submucosa oralis',
'oral potentially malignant disorder': 'disorder potentialiter malignus oralis',
'oral cancer': 'cancer oralis',
'oral squamous cell carcinoma': 'carcinoma cellulis squamosis oralis',
'oral precancer': 'praecancer oralis',
'oral manifestation systemic disease': 'manifestatio oralis morbi systemici',
'oral manifestation': 'manifestatio oralis',
'oral ulcer': 'ulcer oralis',
'oral pain': 'dolor oralis',
'neuropathic pain oral': 'dolor neuropathicus oralis',
'trigeminal neuralgia': 'neuralgia trigemini',
'atypical facial pain': 'dolor faciei atypicus',
'temporomandibular disorder': 'disorder temporomandibularis',
'tmj disorder': 'disorder TMJ',
'tmj pain': 'dolor TMJ',
'myofascial pain': 'dolor myofascialis',
'bruxism oral': 'bruxismus',
'oral dysplasia': 'dysplasia oralis',
'oral infection': 'infectio oralis',
'oral viral infection': 'infectio viralis oralis',
'oral fungal infection': 'infectio fungosa oralis',
'oral bacterial infection': 'infectio bacterialis oralis',
'hiv oral manifestation': 'manifestatio HIV oralis',
'oral ulceration': 'ulceratio oralis',
'vesiculobullous disease': 'morbus vesiculobullous',
'desquamative gingivitis': 'gingivitis desquamativa',
'immune-mediated oral disease': 'morbus oralis immunitate mediatus',
# ===== ORAL PATHOLOGY (구강병리) =====
'oral pathology': 'pathologia oralis',
'histopathology': 'histopathologia',
'pathology': 'pathologia',
'histology': 'histologia',
'cytology': 'cytologia',
'immunohistochemistry': 'immunohistochemia',
'immunohistochemistry ihc': 'immunohistochemia',
'ihc': 'immunohistochemia',
'frozen section': 'sectio congelata',
'biopsy pathology': 'biopsia',
'lesion': 'lesio',
'neoplasm': 'neoplasma',
'benign tumor': 'tumor benignus',
'malignant tumor': 'tumor malignus',
'dysplasia': 'dysplasia',
'hyperplasia': 'hyperplasia',
'metaplasia': 'metaplasia',
'neoplasia': 'neoplasia',
'carcinoma': 'carcinoma',
'squamous cell carcinoma': 'carcinoma cellulis squamosis',
'adenocarcinoma': 'adenocarcinoma',
'sarcoma': 'sarcoma',
'lymphoma': 'lymphoma',
'metastasis': 'metastasis',
'inflammation': 'inflammatio',
'acute inflammation': 'inflammatio acuta',
'chronic inflammation': 'inflammatio chronica',
'granuloma': 'granuloma',
'abscess': 'abscessus',
'necrosis': 'necrosis',
'apoptosis': 'apoptosis',
'cell death': 'mors cellularis',
'cell proliferation': 'proliferatio cellularis',
'angiogenesis': 'angiogenesis',
'fibrosis': 'fibrosis',
'calcification': 'calcificatio',
'ossification': 'ossificatio',
'amyloidosis': 'amyloidosis',
'cyst pathology': 'cystis',
'odontogenic cyst': 'cystis odontogenica',
'odontogenic tumor': 'tumor odontogenicus',
'ameloblastoma pathology': 'ameloblastoma',
'odontoma pathology': 'odontoma',
'odontogenic fibroma': 'fibroma odontogenicum',
'odontogenic myxoma': 'myxoma odontogenicum',
'cementoblastoma': 'cementoblastoma',
'cementoma': 'cementoma',
'periapical granuloma': 'granuloma periapicale',
'periapical cyst': 'cystis periapicalis',
'radicular cyst pathology': 'cystis radicularis',
'residual cyst': 'cystis residualis',
'dentigerous cyst pathology': 'cystis dentigera',
'keratocystic odontogenic tumor': 'tumor keratocysticus odontogenicus',
'nasopalatine duct cyst': 'cystis ductus nasopalatini',
'nasolabial cyst': 'cystis nasolabialis',
'medication-related osteonecrosis of the jaw': 'osteonecrosis mandibulae pharmacogenica',
'mrnoj': 'osteonecrosis mandibulae pharmacogenica',
'osteonecrosis': 'osteonecrosis',
'osteoradionecrosis': 'osteoradionecrosis',
'fibrous dysplasia': 'dysplasia fibrosa',
'paget disease': 'morbus Paget',
'cherubism': 'cherubism',
'eosinophilic granuloma': 'granuloma eosinophilicum',
'lipoma oral': 'lipoma',
'hemangioma oral': 'haemangioma',
'lymphangioma': 'lymphangioma',
'neurofibroma': 'neurofibroma',
'schwannoma': 'schwannoma',
'papilloma oral': 'papilloma',
'fibroma oral': 'fibroma',
'pyogenic granuloma': 'granuloma pyogenicum',
'peripheral ossifying fibroma': 'fibroma ossificans periphericum',
'peripheral giant cell granuloma': 'granuloma cellulare gigans periphericum',
'verrucous carcinoma': 'carcinoma verrucosum',
'mucoepidermoid carcinoma': 'carcinoma mucoepidermoidum',
'adenoid cystic carcinoma': 'carcinoma adenoides cysticum',
'polymorphous adenocarcinoma': 'adenocarcinoma polymorphum',
'clear cell carcinoma': 'carcinoma cellulare clarum',
'basal cell carcinoma oral': 'carcinoma basocellulare',
# ===== DENTAL RADIOLOGY (방사선) =====
'dental radiography': 'radiographia dentalis',
'radiography': 'radiographia',
'radiograph': 'radiographia',
'x-ray': 'radius X',
'x-ray tube': 'tubus radiographicus',
'radiation': 'radiatio',
'radiation dose': 'dosim radiations',
'radiation protection': 'protectio radiations',
'radiation safety': 'securitas radiations',
'radiation exposure': 'expositio radiations',
'ionizing radiation': 'radiatio ionizans',
'non-ionizing radiation': 'radiatio non-ionizans',
'scatter radiation': 'radiatio dispersa',
'primary radiation': 'radiatio primaria',
'secondary radiation': 'radiatio secundaria',
'image receptor': 'receptor imaginis',
'digital radiography': 'radiographia digitalis',
'conventional radiography': 'radiographia conventionalis',
'film radiography': 'radiographia pelliculae',
'periapical radiograph': 'radiographia periapicalis',
'bitewing radiograph': 'radiographia bitewing',
'panoramic radiograph': 'radiographia panoramica',
'occlusal radiograph': 'radiographia occlusalis',
'cephalometric radiograph': 'radiographia cephalometrica',
'cbct': 'tomographia computata conorum fasciculorum',
'cone beam computed tomography': 'tomographia computata conorum fasciculorum',
'computed tomography': 'tomographia computata',
'ct dental': 'tomographia computata dentalis',
'magnetic resonance imaging': 'imago resonantia magnetica',
'mri': 'imago resonantia magnetica',
'ultrasonography': 'ultrasonographia',
'tomography': 'tomographia',
'cephalometry': 'cephalometria',
'sialography': 'sialographia',
'contrast': 'contrast',
'contrast medium': 'medium contrast',
'density radiographic': 'densitas radiographica',
'exposure radiographic': 'expositio radiographica',
'collimation': 'collimatio',
'filtration': 'filtratio',
'scattering': 'dispersio',
'image quality': 'qualitas imaginis',
'image resolution': 'resolutio imaginis',
'image sharpness': 'acuitas imaginis',
'image contrast': 'contrast imaginis',
'image noise': 'strepitus imaginis',
'image artifact': 'artefactum imaginis',
'sensitivity': 'sensibilitas',
'specificity': 'specificitas',
'accuracy': 'accuratio',
'pixel': 'pixel',
'voxel': 'voxel',
'field of view': 'campus visionis',
'magnification radiographic': 'magnificatio radiographica',
'distortion': 'distortio',
'superimposition': 'superimpositio',
'paralleling technique': 'technica parallela',
'bisecting angle technique': 'technica anguli bisecti',
'right angle technique': 'technica anguli recti',
'radiographic landmark': 'landmark radiographicum',
'anatomic landmark': 'landmark anatomicum',
'radiolucent': 'radiolucens',
'radiopaque': 'radiopacum',
'intensifying screen': 'schermo intensificans',
'grid radiographic': 'grill radiographicum',
'lead apron': 'apron plumbi',
'thyroid collar': 'collare thyroideum',
'dosimeter': 'dosimeter',
'alara principle': 'principium ALARA',
'radiographic interpretation': 'interpretatio radiographica',
'radiographic diagnosis': 'diagnosis radiographica',
'radiographic anatomy': 'anatomia radiographica',
'radiographic pathology': 'pathologia radiographica',
'radiographic technique': 'technica radiographica',
'radiographic positioning': 'positio radiographica',
'radiographic error': 'error radiographicus',
'processing radiographic': 'processio radiographica',
'developer': 'developer',
'fixer': 'fixer',
'darkroom': 'camera obscura',
'safelight': 'lux securitatis',
'digital sensor': 'sensor digitalis',
'phosphor plate': 'lamina phosphoris',
'ccd sensor': 'sensor CCD',
'cmos sensor': 'sensor CMOS',
'picture archiving communication system': 'systema archivandi communicandi imaginum',
'pacs': 'systema archivandi communicandi imaginum',
'dicom': 'DICOM',
# ===== IMPLANTOLOGY (임플란트) =====
'bone-implant contact': 'contactus os-implantatis',
'reverse torque': 'momentum reversum',
'lekholm classification': 'classificatio Lekholm',
'all-on-4': 'All-on-4',
'osseointegration': 'osseointegratio',
# ===== BASIC DENTAL SCIENCE (기초치의학) =====
'apical periodontitis': 'periodontitis apicalis',
'oral microbiome': 'microbioma oralis',
'oral microbiology': 'microbiologia oralis',
'oral flora': 'flora oralis',
'oral biofilm basic': 'biofilm oralis',
'occlusal force': 'vis occlusalis',
'tooth wear basic': 'abrasio dentis',
'dental erosion basic': 'erosio dentalis',
'dental anatomy basic': 'anatomia dentalis',
'dental histology': 'histologia dentalis',
'dental embryology': 'embryologia dentalis',
'tooth development': 'development dentis',
'odontogenesis': 'odontogenesis',
'bell stage': 'stadium campanae',
'bud stage': 'stadium gemmae',
'cap stage': 'stadium pilei',
'dental papilla': 'papilla dentalis',
'enamel organ': 'organum enameli',
'dental sac': 'saccus dentalis',
'hertwig epithelial root sheath': 'vagina epithelialis radicis Hertwig',
'epithelial rests of malassez': 'restae epitheliales Malassez',
'reduction enamel epithelium': 'epithelium enameli reductum',
'amelogenesis': 'amelogenesis',
'dentinogenesis': 'dentinogenesis',
'cementogenesis': 'cementogenesis',
'physiology': 'physiologia',
'oral physiology': 'physiologia oralis',
'mastication': 'masticatio',
'deglutition': 'deglutitio',
'salivation': 'salivatio',
'taste': 'gustus',
'tactile sensation oral': 'sensio tactilis oralis',
'pain oral': 'dolor oralis',
'temperature sensation oral': 'sensio temperaturae oralis',
'proprioception oral': 'proprioceptio oralis',
'biochemistry': 'biochemia',
'oral biochemistry': 'biochemia oralis',
'pharmacology': 'pharmacologia',
'oral pharmacology': 'pharmacologia oralis',
'local anesthetic': 'anaestheticum locale',
'vasoconstrictor': 'vasoconstrictor',
'analgesic': 'analgesic',
'antibiotic': 'antibioticum',
'antifungal': 'antifungale',
'antiviral': 'antivirale',
'anti-inflammatory': 'anti-inflammatorium',
'corticosteroid': 'corticosteroidum',
'autonomic drug': 'pharma autonomicum',
'controlled drug': 'pharma temperatum',
'prescription': 'prescriptio',
'drug interaction': 'interactio pharmacorum',
'adverse drug reaction': 'reactio adversa pharmacorum',
'allergy drug': 'allergia pharmacorum',
'anaphylaxis': 'anaphylaxis',
'emergency dental': 'emergentia dentalis',
'medical emergency': 'emergentia medica',
'cardiopulmonary resuscitation': 'resuscitatio cardiopulmonalis',
'cpr': 'resuscitatio cardiopulmonalis',
'basic life support': 'supportus vitae basicus',
'advanced cardiac life support': 'supportus vitae cardiacus provectus',
'infection control': 'directio infectionis',
'sterilization': 'sterilizatio',
'disinfection': 'disinfectio',
'aseptic technique': 'technica aseptica',
'cross-contamination': 'contaminatio crucis',
'universal precaution': 'praecautio universalis',
'standard precaution': 'praecautio standard',
'personal protective equipment': 'instrumentum protectionis personalis',
'ppe': 'instrumentum protectionis personalis',
'hand hygiene': 'hygiena manuum',
'sharps disposal': 'dispositio acutorum',
'biohazard': 'biohazardum',
'bloodborne pathogen': 'pathogen sanguineum',
'hepatitis b': 'hepatitis B',
'hiv': 'HIV',
'infection control protocol': 'protocol directio infectionis',
'dental law': 'lex dentalis',
'dental ethics': 'ethica dentalis',
'informed consent': 'consensus informatus',
'malpractice': 'malpractice',
'patient rights': 'jura patientis',
'dental record': 'record dentalis',
'dental charting': 'charting dentalis',
'treatment planning': 'planatio therapiae',
'dental insurance': 'assecuration dentalis',
'evidence-based dentistry': 'odontiatria evidentia fundata',
'critical appraisal': 'evaluatio critica',
'research methodology': 'methodologia investigationis',
'statistical analysis': 'analysis statistica',
'epidemiology': 'epidemiologia',
'oral epidemiology': 'epidemiologia oralis',
}
# ── PubMed MeSH search ──
def search_mesh(term: str, api_key: str = None) -> str:
"""Search PubMed MeSH for Latin anatomical terminology."""
params = {
'db': 'mesh',
'term': term,
'retmode': 'json',
'retmax': 1,
}
url = f"{EUTILS}/esearch.fcgi?{urllib.parse.urlencode(params)}"
if api_key:
url += f"&api_key={api_key}"
try:
req = urllib.request.Request(url)
req.add_header('User-Agent', 'SmallClaw/2.0')
with urllib.request.urlopen(req, timeout=10) as resp:
data = json.loads(resp.read().decode())
ids = data.get('esearchresult', {}).get('idlist', [])
if not ids:
return ''
# Fetch MeSH term details
fetch_url = f"{EUTILS}/efetch.fcgi?db=mesh&id={ids[0]}&retmode=xml"
if api_key:
fetch_url += f"&api_key={api_key}"
req2 = urllib.request.Request(fetch_url)
req2.add_header('User-Agent', 'SmallClaw/2.0')
with urllib.request.urlopen(req2, timeout=10) as resp2:
xml = resp2.read().decode()
# Look for Entry terms that might be Latin
latin_match = re.search(r'<EntryTerm>([^<]*?(?:is|um|us|a|ae|ia|or|ix|as|es))</EntryTerm>', xml, re.I)
if latin_match:
return latin_match.group(1).strip()
except Exception as e:
pass
return ''
def get_api_key():
try:
with open('/srv/homeclaw/.smallclaw/config.json') as f:
cfg = json.load(f)
return cfg.get('pubmed', {}).get('api_key') or cfg.get('search', {}).get('pubmed_api_key')
except:
return None
def fuzzy_match(english: str, dictionary: dict) -> str:
"""Try various fuzzy matching strategies."""
e = english.lower().strip()
# Direct match
if e in dictionary:
return dictionary[e]
# Try without "dental" prefix/suffix
e_stripped = e.replace('dental ', '').replace(' oral', '').replace('oral ', '')
if e_stripped in dictionary:
return dictionary[e_stripped]
# Try singular/plural
if e.endswith('s') and e[:-1] in dictionary:
return dictionary[e[:-1]]
if e + 's' in dictionary:
return dictionary[e + 's']
# Try without hyphens
e_no_hyphen = e.replace('-', ' ')
if e_no_hyphen in dictionary:
return dictionary[e_no_hyphen]
# Try lowercase of first letter only
e_title = english.strip()
if e_title in dictionary:
return dictionary[e_title]
return ''
def main():
apply = '--apply' in sys.argv
category_filter = None
do_pubmed = '--pubmed' in sys.argv
for i, arg in enumerate(sys.argv):
if arg.startswith('--category='):
category_filter = arg.split('=', 1)[1]
elif arg == '--category' and i + 1 < len(sys.argv):
category_filter = sys.argv[i + 1]
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
query = 'SELECT id, korean, english, latin, category FROM terms WHERE (latin IS NULL OR latin = "")'
if category_filter:
query += f' AND category = "{category_filter}"'
query += ' ORDER BY category, id'
rows = conn.execute(query).fetchall()
print(f"Missing Latin terms: {len(rows)} total")
api_key = get_api_key()
updated = 0
still_missing = []
for row in rows:
english_lower = row['english'].lower().strip()
# Try dictionary with fuzzy matching
latin = fuzzy_match(row['english'], LATIN_DICT)
if latin:
action = "UPDATE" if apply else "WOULD UPDATE"
print(f" [{action}] #{row['id']} {row['korean']} / {row['english']} → {latin}")
if apply:
conn.execute('UPDATE terms SET latin = ?, updated_at = datetime("now","localtime") WHERE id = ?',
(latin, row['id']))
updated += 1
else:
still_missing.append(row)
# PubMed MeSH search for remaining terms
if still_missing and do_pubmed and api_key:
print(f"\n--- MeSH search for {len(still_missing)} remaining terms ---")
pubmed_found = 0
for i, row in enumerate(still_missing):
if i > 0 and i % 3 == 0:
time.sleep(0.5) # Rate limit
latin = search_mesh(row['english'], api_key)
if latin:
action = "UPDATE" if apply else "WOULD UPDATE"
print(f" [{action}] #{row['id']} {row['korean']} / {row['english']} → {latin} (MeSH)")
if apply:
conn.execute('UPDATE terms SET latin = ?, updated_at = datetime("now","localtime") WHERE id = ?',
(latin, row['id']))
updated += 1
pubmed_found += 1
else:
still_missing[i] = None # Mark as not found
still_missing = [r for r in still_missing if r is not None]
print(f" MeSH found: {pubmed_found}")
if apply:
conn.commit()
print(f"\n✓ Updated {updated} terms in database")
else:
print(f"\n--- DRY RUN: {updated} terms would be updated ---")
# Print remaining
remaining = [r for r in still_missing if r is not None] if do_pubmed else still_missing
if remaining:
print(f"\nStill missing Latin ({len(remaining)} terms):")
by_cat = {}
for r in remaining:
by_cat.setdefault(r['category'], []).append(r)
for cat in sorted(by_cat.keys()):
print(f"\n [{cat}] ({len(by_cat[cat])} terms)")
for r in by_cat[cat][:5]:
print(f" {r['english']}")
if len(by_cat[cat]) > 5:
print(f" ... and {len(by_cat[cat])-5} more")
conn.close()
if __name__ == '__main__':
main()