🧬 연구 허브

Skill

biblio-analysis 바로 실행

여러 논문 DB 를 합치고 CrossRef 로 교차검증해 계량서지 분석과 보고서를 낸다.

언제 쓰나

여러 데이터베이스에서 뽑은 논문 목록을 합쳐 "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 Title

scripts/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.pyLotka/Bradford 등 계량서지 법칙
generate_author_leadership.py제1저자·교신저자 기반 리더십

시기 구분(get_period)을 여러 스크립트가 공유한다 — 한 군데서 정의해라. 스크립트마다 다르게 나누면 표끼리 안 맞는다.

연관 skill

paper-collect·bibliography-fetcher·batch-author-extractor(수집·저자추출), lit-relevance-classify, excel-case-validator