# LivingSR-Staleness-Kor / 리빙에스알스테일니스코어

> ⚠️ **참고용·연구용 (research/reference only, NOT for clinical decisions).**
> 본 도구는 **합성(synthetic) 데모 데이터**로만 동작하며, 실제 PROSPERO/PubMed/ClinicalTrials.gov
> 레코드가 아닙니다. 임상 의사결정 근거로 사용하지 마십시오.

## 목적
항비만(anti-obesity) **체계적 문헌고찰(SR)** 또는 **PROSPERO 프로토콜**의
PICO를 구조화하고, 검색일(search date) 이후 새로 색인된 임상시험을 매칭하여
해당 SR이 **노후화(out-of-date)** 되었는지("검색일 이후 N건의 신규 적격 연구") 자동으로 알리는
완전 오프라인 MVP입니다. 추가로 미출판/중복 PROSPERO 등록과 커버되지 않은 PICO 갭을 탐지합니다.

- **도메인(Domain):** 비만 (Obesity)
- **카테고리(Category):** 연구 알림 (research-alert / curation)

## 기능
1. **PICO 구조화** — SR/PROSPERO 레코드의 Population(비만/과체중+동반질환)·Intervention(약물/수술/행동중재)·Comparator·Outcome·inclusion 기준을 룰 기반으로 정규화. (`extract_pico_from_text`로 자유 텍스트 abstract도 키워드 추출 가능, 사용자 확인용 필드 형태.)
2. **신규 적격 트라이얼 매칭** — 합성 트라이얼 인덱스에서 SR 검색일 **이후** 색인된 RCT를 PICO 토큰 겹침(P/I/C/O 가중 점수) + 설계/기간 적격성으로 채점 → "이 SR을 노후화시키는 N건".
3. **노후화 지표 + 신호등 등급** — 검색일 경과일 / 신규 적격 트라이얼 수 / 신규 참가자 총 N → 🟢GREEN(최신) · 🟡YELLOW(주의 1~2건) · 🔴RED(노후 ≥3건).
4. **미출판 SR 추적 + 중복 등록 탐지** — `published=false` PROSPERO 등록의 경과일, 그리고 같은/유사 PICO를 가진 서로 다른 팀의 중복 등록(PICO Jaccard 유사도) → 연구낭비/협업 알림.
5. **PICO 갭 맵** — 관심 항비만 PICO 조합 격자 중 어떤 등록/출판 SR도 다루지 않는 조합 표시 (예: GLP-1 × 근감소성비만 × 근육량).

## 실행법
Python 3 표준 라이브러리만 필요 (외부 패키지/네트워크 불필요).

```bash
cd "2026-06-04-2-living-sr-staleness-kor"

python3 main.py            # 데모/기본: 전체 SR 노후화 스캔 + 미출판/중복/갭 요약
python3 main.py --demo     # 위와 동일
python3 main.py --sr SR-001   # 단일 SR 노후화 평가 (신규 적격 트라이얼 목록 + 등급)
python3 main.py --gaps     # 커버되지 않은 PICO 조합(갭) 출력
python3 main.py --list     # 데이터에 포함된 SR id 목록
python3 main.py --help     # 사용법
```

### 매칭 로직 (투명·설명가능)
- 필드별 겹침 = |SR토큰 ∩ 트라이얼토큰| / |SR토큰| (Jaccard 변형)
- 종합 점수 = Σ (필드 겹침 × 가중치), 가중치 P=0.25 / I=0.35 / C=0.15 / O=0.25
- 적격 임계값 0.45 이상 + 검색일 이후 색인 + 설계/기간 inclusion 충족 → "신규 적격"
- 각 매칭에 P/I/C/O 필드별 점수 내역(breakdown)을 함께 출력하여 근거 추적 가능.

## 데이터 출처 (개념 + 합성 명시)
- **개념적 출처:** PROSPERO(SR 프로토콜 등록), PubMed(출판 SR), ClinicalTrials.gov(트라이얼 인덱스).
- **실제 데이터:** 본 MVP는 위 출처의 **스키마만 모방한 합성 데모 데이터**(`data/srs.json`, `data/trials.json`)를 사용합니다. 실제 레코드를 수집하거나 호출하지 않습니다.
- 데이터는 의도적으로 최소 1개 SR이 ≥1건의 신규 적격 트라이얼로 노후 판정되고(SR-001, SR-002), 1쌍의 중복 등록(SR-003↔SR-004), 그리고 최소 1개의 PICO 갭(GLP-1×근감소성비만×근육량 등)이 존재하도록 설계되었습니다.

## 검수 체크리스트
- [ ] `python3 -c "import ast; ast.parse(open('main.py').read())"` 통과 (구문 오류 없음)
- [ ] `python3 main.py --help` 사용법 출력
- [ ] `python3 main.py` (데모) 실행 시 ≥1건의 staleness ALERT 발생
- [ ] `python3 main.py --sr SR-001` 단일 SR의 신규 적격 트라이얼 목록 + 신호등 등급 출력
- [ ] `python3 main.py --gaps` 에서 최소 1개의 GAP 출력
- [ ] `data/srs.json`, `data/trials.json` JSON 파싱 성공
- [ ] CLI 헤더와 README에 참고용·연구용 디스클레이머 표시
- 자세한 실행 로그: [`QA.md`](QA.md)

## 파일
- `main.py` — CLI 진입점 (검증 대상)
- `data/srs.json` — 합성 SR/PROSPERO 레코드 (PICO + 검색일 + 출판 여부)
- `data/trials.json` — 합성 RCT 인덱스 (색인일 + PICO 태그)
- `QA.md` — 검증 로그
- `app.py` — (선택) Streamlit UI. **검증 대상 아님.** CLI가 정식 진입점.

## 한계
- 합성 데이터 데모이며 실제 문헌 수집/NLP 파싱은 포함하지 않습니다.
- PICO 매칭은 키워드 토큰 겹침 기반의 단순·투명 휴리스틱으로, 실제 적격성 판정(전문가 스크리닝)을 대체하지 않습니다.
- 모든 출력은 연구 우선순위·노후화 모니터링 보조용이며 임상 근거가 아닙니다.
