언제 쓰나
같은 기관이 수십 가지로 적혀 있어 집계가 안 될 때. 논문 소속만이 아니라 의뢰기관·검사기관·수탁기관 표기 통일에도 같은 구조를 쓴다.
resolve("Univ Ulsan, Asan Med Ctr, Seoul, South Korea") → "AMC"정본 코드
~/Documents/혜연/BTC_KOL_PoC/
institution_resolver.py 337줄
institutions.json 기관 마스터 137개
설계 문서: docs/02-design/features/institution-name-unify.design.md--selfcheck 내장. 규칙을 고치면 먼저 돌린다.
핵심 — 판정 순서가 전부다
기존 korean_institution() 은 C3(Clarivate 정규화 기관명)를 먼저 써서 서울아산병원 3,028건이 'University of Ulsan' 으로 뭉쳤다. 여기서는 병원 마커를 C3보다 먼저 본다.
이게 이 스킬의 존재 이유다. 외부 정규화(Clarivate C3, 기관 DB 등)는 대개 대학·법인 단위로 묶는다. 의학 연구에서 의미 있는 단위는 병원이다. 울산대 의대 서울아산병원을 '울산대'로 묶으면 기관 분석이 통째로 무의미해진다.
① 주소 문자열에서 병원 마커 탐지 (Asan Med Ctr, Samsung Med Ctr …)
② 없으면 C3(외부 정규화명) 사용
③ 그래도 없으면 raw_label 로 원문 보존남이 정규화해준 값을 먼저 믿지 마라. 그쪽이 쓰는 단위가 내가 원하는 단위와 다를 수 있다. 원문에서 내 단위를 먼저 찾고, 못 찾을 때만 외부 값으로 물러난다.
③이 중요하다. 판정 실패를 빈칸으로 두지 않고 원문을 남긴다. 나중에 마스터에 추가할 후보가 거기서 나온다.
구성
| 함수 | 역할 |
|---|---|
expand(s) | 축약형 전개 (Med Ctr → Medical Center) |
core(aff) | 주소에서 핵심 토큰만 남김 (도시·국가·우편번호 제거) |
_has_org_info(aff) | 기관 정보가 있기는 한지 |
resolve(aff, c3) | 메인 판정 → 코드 |
raw_label(aff) | 판정 실패 시 원문 보존 |
label(code, lang) · parent_label(code, lang) | 한/영 라벨, 상위기관 |
코드와 라벨을 분리한다. 내부는 AMC 같은 코드로 다루고 표시할 때만 라벨로 바꾼다. 한글·영문 보고서를 같은 데이터로 낼 수 있다.
parent_label 로 상위기관을 따로 둔다 — "서울아산병원"과 "울산대학교"를 둘 다 알아야 병원별·대학별 집계를 모두 낼 수 있다.
마스터는 사람이 관리한다
institutions.json 에 137개 기관이 있다. 새 기관이 나오면 여기 추가하지 코드를 고치지 않는다. 판정 로직과 기관 목록은 수명이 다르다.
함정
- 설계 문서를 남겨라. 판정 순서를 왜 이렇게 정했는지는 코드만 봐서는 안 보인다. 정본은
docs/02-design/features/에 설계서를 두고 파일 상단에서 가리킨다. - 마커 탐지는 대소문자·구두점에 취약하다.
expand→core를 거친 뒤에 비교한다. - 한 기관이 여러 이름을 갖는 경우(개명·통합)를 마스터에서 별칭으로 흡수한다.
- 집계 전에 판정 실패 건수를 먼저 본다. 실패율이 높으면 그 상태로 분석하면 안 된다.
연관 skill
biblio-normalize(같은 정리 단계), paper-merge-provenance, biblio-analysis