왜 어려운가
한 사람이 논문마다 다르게 적힌다. Kim, Jae Heon · Kim JH · Kim J-H · Kim J.H. — 그리고 진짜 다른 사람도 Kim JH 다. 너무 좁게 묶으면 한 사람이 여러 명이 되고, 너무 넓게 묶으면 여러 명이 한 사람이 된다. 둘 다 저자 단위 집계를 망친다.
정본 코드에 두 방향의 실패가 모두 실측으로 적혀 있다.
| 방식 | 결과 |
|---|---|
| 구두점 정규화 없이 문자열 그대로 키 | 같은 사람이 332개 그룹으로 쪼개짐(과분할) |
| 성 + 이니셜로만 묶기 | KIM JH 하나에 71명이 뭉침(과병합) |
정본 코드
~/Documents/혜연/BTC_KOL_PoC/analyze_kol.py
same_name() 음절 동치 판정
author_key() 저자 식별 키 생성
build_alias_map() 표기 묶음 만들기 (234줄)--selfcheck 로 로직 자체를 검증한다.
기본 전략 — 풀네임 키 + 구두점 정규화
fullname (기본)
성 + 이름 전체. 'Kim, Jae Heon' → 'KIM JAE HEON'
구두점만 정규화: 'J-H' 'J.H.' 'JH' 'J H' → 모두 'J H'이 정규화 하나가 332개 과분할을 없앤다. 서로 다른 사람이 섞이지 않는 게 우선이고, 이니셜 표기 레코드와 풀네임 레코드가 갈리는 과분할은 다음 단계(alias map)에서 잡는다.
이니셜인지 이름인지는 소문자 유무로 판정한다
# 소문자 유무로 판정해야 한다 — 대문자로 바꾼 뒤 보면 'Shin'도 이니셜로 오인된다.
if fore and " " not in fore and len(fore) <= 4 and not re.search(r"[a-z]", raw):
fore = " ".join(fore)Shin 은 네 글자 이름이고 SHIN 으로 바꾸면 이니셜 4개처럼 보인다. 정규화 전 원문의 대소문자를 봐야 구분된다. 대문자 변환을 먼저 하면 이 정보가 사라진다.
표기 동치 — 두 규칙
same_name() 이 성을 뺀 이름 토큰들을 비교한다.
① 음절 수가 같고 각 음절이 동치 'SEONG KOO' ≡ 'SUNG KOO'
② 마지막 음절이 한 글자인 축약 표기 'DONG W' ≡ 'DONG WAN'①은 한글 로마자 표기 흔들림이다. 성구 → Seong Koo / Sung Koo / Seong Gu. 음절 동치표(_SYL)를 두고 매핑한다. ②는 이름 뒷부분만 이니셜로 적은 경우다. 앞 음절이 모두 같고 마지막만 한 글자면 접두어인지 확인한다.
둘 다 음절 수가 같을 것을 요구한다. 길이가 다르면 다른 사람으로 본다 — 안 그러면 Kim J 가 모든 김씨와 묶인다.
과분할과 과병합 중 하나를 골라야 한다
동시에 없앨 수 없다. 어느 쪽 오류가 덜 나쁜지 정하고 그 방향으로 기울인다.
- KOL·업적 분석 → 과병합이 치명적이다(남의 논문이 내 실적이 됨). 풀네임 기본 + alias 로 보수적으로 묶는다.
- 네트워크·규모 추정 → 과분할이 더 아프다. 이니셜 키를 쓰되 결과를 그렇게 읽는다.
정본은 KEY_MODE = "fullname" 을 기본으로 두고 initials 를 비교용으로 남겨 뒀다. 두 방식을 모두 돌려 차이를 보는 것 자체가 진단이다.
함정
- 묶은 결과를 반드시 사람이 본다.
build_alias_map은trace인자로 어떤 표기가 왜 묶였는지 남긴다. - 수동 교정은 코드가 아니라 데이터로 둔다(
load_merge_block()— 묶으면 안 되는 쌍 목록). - 애매한 건은
ambig_df로 따로 뽑아 검토 대상으로 출력한다. - ORCID 가 있으면 그것이 최우선이다. 이름 매칭은 ORCID 가 없을 때의 차선책이다.
연관 skill
kol-profile(이 판정 위에서 동작), corresponding-author-verify, institution-resolve(같은 종류의 정규화 문제)