# ObesityGrantIITRadar (오베시티그랜트아이아이티레이더)

## 1. 목적 / 도메인 / 카테고리 / 대상 사용자

- **목적**: 비만대사질환(Obesity) 중심 funding/grant/IIT call을 multi-source로 자동 큐레이션하고, 연구자 프로파일과 적합도 매칭 + 한국어 weekly digest를 제공하는 MVP.
- **도메인**: Obesity 중심. 인접한 T2DM·MASLD·MASH·sarcopenic obesity·DKD grant 포함 (대사 sub-domain 통합).
- **카테고리**: 연구 알림 (PubMed/ClinicalTrials.gov/conference abstract 큐레이션) — grant call 알림에 특화.
- **대상 사용자**: 한국 임상 PI (junior~senior), 펠로우, 연구간호사 코디네이터, 약물 개발 IIT 의향자.

## 2. 설치

- Python 3.11 (또는 3.10 이상). 외부 패키지 불필요. stdlib 만 사용.
- 별도 `pip install` 없음.

```bash
git clone <repo>
cd 2026-05-07-2-obesity-grant-iit-radar
python3 main.py --help
```

## 3. 실행법

```bash
# 1. multi-source grant ETL 시뮬레이션
python3 main.py ingest --source all
python3 main.py ingest --source khidi
python3 main.py ingest --source company-iit

# 2. 연구자 적합도 매칭
python3 main.py match --researcher R001 --top 10
python3 main.py match --researcher R002 --top 5      # MASLD 전문 senior
python3 main.py match --researcher R005 --top 5      # junior PI

# 3. 마감일 임박 grant
python3 main.py deadlines --days 30
python3 main.py deadlines --days 14

# 4. 기업 IIT call + ClinicalTrials.gov sub-investigator 추적
python3 main.py iit-watch --country korea

# 5. 한국어 weekly digest + Telegram/Slack alert 시뮬레이션
python3 main.py digest --korean                       # 전체 연구자
python3 main.py digest --korean --researcher R001     # 특정 연구자
```

## 4. 데이터 출처

본 MVP는 **합성(mock) 데이터** 기반 데모. 실제 운영 시 다음 공개 사이트 ETL 어댑터 필요:

| 소스 | URL/시스템 | 비고 |
|---|---|---|
| KHIDI | https://www.khidi.or.kr | 한국보건산업진흥원 R&D 공고 |
| NRF | https://www.nrf.re.kr | 한국연구재단 |
| 복지부 | https://www.mohw.go.kr | 보건복지부 |
| MFDS | https://www.mfds.go.kr | 식약처 |
| KDA / KSSO / KASL | 각 학회 사이트 | 학회 임상연구 grant |
| NIH RePORTER | https://reporter.nih.gov | 미국 NIH |
| EU Horizon | https://ec.europa.eu/info/funding-tenders/opportunities | EU |
| AMED | https://www.amed.go.jp | 일본 |
| CIHR / NHMRC / MRC / BMBF | 각 국가 연구재단 | 캐나다·호주·영국·독일 |
| 기업 IIT portal | Novo Nordisk, Lilly, Madrigal, Bayer, Pfizer 등 sponsor 별 IIT submission portal | |
| ClinicalTrials.gov | https://clinicaltrials.gov | sub-investigator 모집 trial |

## 5. 적합도 매칭 알고리즘

연구자 ↔ grant 매칭 점수 (0~100 정규화):

```
score = 0.40 * expertise_match
      + 0.20 * publication_relevance
      + 0.15 * site_capability_match
      + 0.15 * drug_experience_match
      + 0.10 * korean_site_recruiting_feasibility
```

- **expertise_match**: `grant.domain_keywords` ∩ `researcher.sub_domains` 의 Jaccard 유사도.
- **publication_relevance**: grant title (KR+EN) 토큰 vs researcher publications title 토큰의 set overlap (단순 토큰 기반 — 외부 라이브러리 없이 stdlib 만 사용).
- **site_capability_match**: required ⊆ available 비율 (IRB, CT-experience, biopsy, MRI, DXA, CGM, BIA).
- **drug_experience_match**: grant 요구 약물 ⊆ 연구자 약물 경험 비율 (semaglutide, tirzepatide, resmetirom, finerenone 등).
- **korean_site_recruiting_feasibility**: 0.0~1.0 직접 점수 (한국 사이트 모집 실현가능성).

추가로 digest에서는 **D-7 이내 마감 boost (+5점)**, D-14 이내 (+2점) 적용.

## 6. 검수 체크리스트

- [x] `python3 -c "import ast; ast.parse(open('main.py').read())"` 구문 OK
- [x] `python3 main.py --help` 도움말 정상
- [x] 5개 서브커맨드 (ingest/match/deadlines/iit-watch/digest) 모두 작동
- [x] mock data 5개 파일 (grants/researchers/clinicaltrials/company_iit/mentors) 로드 검증
- [x] 적합도 score 검증 (R001 김철수 @ KHIDI-2026-001 = 72.9/100)
- [x] 디스클레이머 모든 서브커맨드 출력에 포함
- [x] `digest.md` 자동 저장
- [x] Telegram/Slack alert 시뮬레이션 stdout 출력

## 7. 디스클레이머

본 도구는 mock data 기반 데모 MVP입니다. **참고용**이며 실제 grant 신청 전 공고 원문 및 연구자 본인 검토 필수. 본 도구의 출력은 실제 grant 채택을 보장하지 않으며, 적합도 점수는 단순 휴리스틱(Jaccard + token overlap) 기반입니다.

## 8. 한계

- mock data 기반 — 실제 ETL 어댑터 미구현 (KHIDI/NRF 사이트 크롤러, NIH RePORTER API, EU Funding Tenders Portal API, 기업 IIT submission portal scraper 필요).
- ORCID API 연동 미구현 — 실제 운영 시 publication 자동 동기화 필요.
- 외부 네트워크 호출 금지 (정책상 본 MVP는 self-contained).
- TF-IDF·embedding 미적용 (sentence-transformers 등 외부 패키지 미사용 정책). 실제 운영에서는 sub-domain 매칭 품질 향상을 위해 임베딩 기반 유사도 권장.
- Telegram/Slack alert는 stdout 시뮬레이션만 — 실제 webhook 연동 미구현.
- 디스클레이머: grant 신청 자체의 의사결정은 연구자 본인의 판단.

## 9. 자율 결정 사항 (build agent)

- TODAY 기준일 = 2026-05-07 로 고정 (재현성을 위해 `datetime.today()` 미사용).
- 적합도 점수 가중치는 사용자 지시 그대로 (0.40 / 0.20 / 0.15 / 0.15 / 0.10).
- digest 생성 시 D-7 이내 grant +5점, D-14 이내 +2점 boost 추가 (마감 임박 우선 반영).
- 디덥은 grant_id 유일성 검증으로 단순화.
- 기업 IIT call 별도 데이터셋(`company_iit_calls.json`) + grants.json 의 IIT 항목 모두 유지 (이중 채널: grants는 적합도 매칭, company_iit_calls는 IIT-watch 별도 알림).
- 멘토 매칭은 grant.domain_keywords ∩ mentor.expertise 의 단순 overlap count 최대 멘토.
