왜 필요한가
수집은 재현율 우선이다. 놓치는 것보다 섞이는 게 낫다. 그 대가로 잡음이 들어온다.
수집 단계는 재현율 우선(놓치지 않기)이라 WoS 검색식을 넓게 잡았다. 그 대가로 담도암이 아닌 논문이 섞인다(실측 11.9%). 이 모듈은 지우지 않고 등급을 붙인다.
정본 코드
~/Documents/혜연/BTC_KOL_PoC/
relevance.py 168줄 등급 판정
backfill_mesh.py 77줄 WoS 단독 논문의 MeSH 보강
fill_topics_gpt.py 122줄 MeSH·키워드 둘 다 없는 건만 GPTpython3 relevance.py --topic btc_merged # 분포 확인
python3 relevance.py --topic btc_merged --list 무관 # 해당 등급 표본핵심 — 지우지 말고 등급을 붙여라
잡음을 삭제하면 되돌릴 수 없고, 판정 기준이 바뀔 때마다 다시 수집해야 한다. 등급을 필드로 붙이면 분석 단계에서 필요한 등급만 골라 쓴다.
| 등급 | 조건 |
|---|---|
| 확정 | 질환 MeSH 보유 또는 (부위 MeSH + 악성 MeSH) |
| 추정 | MeSH 없음/불충분하나 제목·키워드에 질환명 |
| 주변 | 부위 MeSH 는 있으나 악성 신호 없음 (담석·담도염 등 양성질환) |
| 무관 | MeSH 가 있고 질환·부위 어느 쪽도 아님 |
| 미판정 | MeSH 없고 제목·키워드에도 단서 없음 |
'주변' 등급이 중요하다. 담도암 코퍼스에 담석·담도염 논문이 섞이는데, 이건 완전한 잡음이 아니라 같은 장기의 양성질환이다. 무관과 섞으면 나중에 "양성질환도 같이 보자"가 안 된다.
'미판정' 을 '무관' 과 나눠라. 판정할 근거가 없는 것과 근거가 있어서 아니라고 판정한 것은 다르다. 미판정은 보강 대상이고 무관은 제외 대상이다.
질환어는 검색식에서 뽑는다
질환어는 topics/<id>.json 의 PubMed 검색식에서 뽑는다 → 다른 암종에도 그대로 동작.
질환별 키워드 목록을 코드에 박지 않는다. 이미 검색식에 다 적어 놨으니 거기서 읽는다. 새 암종을 추가할 때 검색식만 쓰면 판정기가 따라온다.
MeSH 결측 — 3단계로 채운다
MeSH 는 NLM 인덱서가 붙이는 통제어휘라 판정 근거로 가장 좋지만, 약 19%가 비어 있다(최신 논문·국내지).
① relevance.py 있는 MeSH 로 판정
② backfill_mesh.py WoS 단독 논문의 MeSH 를 PubMed 에서 보강
③ fill_topics_gpt.py MeSH도 저자키워드도 없는 논문에만 GPT③의 조건이 요령이다 — "MeSH도 저자키워드도 없는 논문에만" GPT를 돌린다. 전체에 돌리면 비용이 수십 배고, 이미 통제어휘가 있는 건에 LLM 추측을 덮어쓰는 건 품질을 떨어뜨린다.
싼 근거부터 쓰고 비싼 근거는 남은 것에만. medical-code-extract 의 규칙 우선 원칙과 같다.
분포를 먼저 본다
python3 relevance.py --topic btc_merged # 등급 분포
python3 relevance.py --topic btc_merged --list 무관 # 그 등급 표본 훑기판정기를 만들면 등급별 표본을 눈으로 봐야 기준이 맞는지 안다. '무관'에 진짜 관련 논문이 섞여 있으면 기준이 잘못된 것이다.
함정
- 등급은 필드로 남기고 원본은 그대로 둔다. 삭제하지 않는다.
- 판정 근거(어느 MeSH 때문에 그 등급인지)를 함께 남기면 검수가 된다.
- GPT 결과는 캐시한다 —
lit-relevance-classify참조. - 이 스킬은 질환 관련도를 본다. 주제 관련성·전문분야 같은 다른 축의 분류는
lit-relevance-classify다.
연관 skill
paper-source-collect(재현율 우선 수집), lit-relevance-classify, kol-profile, biblio-normalize