언제 쓰나
여러 데이터베이스에서 뽑은 논문 목록을 합쳐 "30년간 한국 AML/MDS 연구 동향" 같은 분석 보고서를 낼 때. 논문 수집은 ~/.claude/skills/의 paper-collect·bibliography-fetcher 계열이 하고, 이 skill은 통합·검증·분석을 맡는다.
정본 코드
~/Documents/IMOK/AML260130_Korea AML MDS 30y/
consolidate_bibliometrics.py 749줄 ★ 3소스 통합 (정본)
journal_analysis.py / keyword_analysis.py / trend_analysis.py
scripts/verify_koremed.py, verify_pubmed.py, validate_data.py
scripts/institutional_network.py, international_collaboration.py, bibliometric_laws.py
scripts/extract_institutions_gpt.py, gpt_verify_*.py
.claude/agents/ 6종: data-validator, pubmed-verifier, koremed-verifier,
report-verifier, biblio-analyst, feedback-processor
report_template.html, generate_pdf_report.py
~/Documents/IMOK/BTC_KOL_PoC/ collect_pubmed/openalex/koreamed.py (다중 소스 수집).claude/agents/ 6종을 새 서지 프로젝트에 그대로 복사해 쓸 수 있다. 다만 기대 건수가 하드코딩돼 있으니 프로젝트 숫자로 바꿔야 한다.
바로 쓰는 코드
python3 scripts/crossref_verify.py --title "논문 제목" --year 2020 --mailto you@example.org
python3 scripts/crossref_verify.py --excel papers.xlsx --title-col Titlescripts/crossref_verify.py — verify_koremed.py 의 3단계 검증을 추출. DOI 조회 → 제목 검색 → KoreaMed 수동확인 URL 생성. --mailto 를 주면 polite pool(~50 req/sec).
소스 통합 순서가 중요하다
WoS 기준으로 시작 (1,679건)
→ PubMed 병합 (merge_wos_pubmed): 겹치는 건 정보 보강, PubMed-only 234건 추가
→ KoreaMed 추가 (add_koremed): 기존에 없는 670건만
→ 최종 2,583건, Source 컬럼으로 출처 표시가장 정보가 풍부한 소스를 기준(base)으로 잡고 나머지를 병합한다. WoS는 저자 소속(C1)·교신저자(RP) 필드가 구조화돼 있어 기준으로 적합하다. 순서를 바꾸면 소속 정보가 빈 레코드가 늘어난다.
소스별로 파서가 따로 필요하다 — parse_wos_c1(소속), parse_wos_rp(교신저자), parse_koremed_authors, parse_koremed_affiliation. KoreaMed는 저자와 소속이 분리돼 있지 않아 저자 목록을 참조해 소속을 매핑해야 한다.
Excel 출력 시 소스별 행 색상을 다르게 준다(WoS 흰색 / PubMed-only 연녹색 / KoreaMed 연주황). 검수자가 한눈에 출처를 본다.
교차검증: API가 없는 DB 대응
PubMed는 PMID로 efetch하면 끝이지만, KoreaMed는 공식 API가 없다. 3단계 전략:
1) DOI 있음 → CrossRef REST API로 메타데이터 조회. 제목 유사도 70%↑ + 연도 일치
2) DOI 없음 → CrossRef query.bibliographic 로 제목+연도 검색
부가효과: 없던 DOI를 찾아낸다
3) 그래도 없음 → KoreaMed SearchBasic.php URL 생성 → 수동 확인CrossRef는 무료이고 API 키가 필요 없다. mailto 파라미터를 넣으면 polite pool로 들어가 ~50 req/sec까지 쓸 수 있다. 안 넣으면 훨씬 느리다.
KoreaMed URL 검색 태그: [TI] 제목, [AU] 저자, [DPY] 출판연도.
"API 없음 = 검증 불가"가 아니다. DOI를 중간 다리로 삼으면 대부분 검증된다. 남은 것만 사람이 본다.
GPT 정규화 결과는 반드시 캐싱한다
기관명 정규화("Asan Medical Center" = "울산대학교 의과대학 서울아산병원"), 키워드 추출, AML/MDS 분류 등에 GPT를 쓴다. 프로젝트에 캐시 파일이 여럿 있다:
institution_cache.json / institution_cache_corrections.json
keyword_cache.json / keyword_cache_v2.json
aml_mds_gpt_cache.json / gpt_kr_foreign_cache.json수천 건을 분석 스크립트 돌릴 때마다 다시 물으면 비용과 시간이 폭발하고, 무엇보다 결과가 매번 조금씩 달라져 분석이 재현되지 않는다.
_corrections.json을 캐시와 분리한 게 중요하다 — 사람이 고친 내용을 별도 파일에 두면 캐시를 새로 만들어도 수정이 살아남는다.
gpt_verify_*.py 계열은 GPT 결과를 다시 GPT로 검증한다(기관 병합, 국내/해외 판정, 공동연구 쌍). 자동 정규화는 반드시 틀리므로 검증 단계를 따로 둔다.
보고서는 검증 대상이다
report-verifier agent가 생성된 보고서의 모든 수치를 원본 Excel과 대조한다. verify_chart21_final.py, verify_charts_collab.py처럼 차트별 검증 스크립트도 있다.
LLM이 쓴 보고서 문장의 숫자는 틀린다. 보고서를 만들면 숫자 검증을 반드시 붙여라.
feedback-processor agent는 사람 피드백을 받아 스크립트 수정 → 보고서 재생성 → 재검증까지 돌린다.
분석 축
| 스크립트 | 내용 |
|---|---|
journal_analysis.py | 저널 분류, 국내/국제 판별(is_korean_journal) |
keyword_analysis.py | 키워드 빈도, 시기 구분(get_period) |
trend_analysis.py | 연도별 추세 |
institutional_network.py | 기관 공저 네트워크 |
international_collaboration.py | 국제 공동연구 |
bibliometric_laws.py | Lotka/Bradford 등 계량서지 법칙 |
generate_author_leadership.py | 제1저자·교신저자 기반 리더십 |
시기 구분(get_period)을 여러 스크립트가 공유한다 — 한 군데서 정의해라. 스크립트마다 다르게 나누면 표끼리 안 맞는다.
연관 skill
paper-collect·bibliography-fetcher·batch-author-extractor(수집·저자추출), lit-relevance-classify, excel-case-validator