Spaces:
Running
Running
| # checklist โ ๊ฒ์ ์ธํ ํธ ๋ถ์ ๋์๋ณด๋ | |
| ๋ชฉํ: ์ฌ์ฉ์๊ฐ ํค์๋๋ฅผ ์ ๋ ฅํ๋ฉด ์ค์๊ฐ์ผ๋ก ๊ฒ์ ์ธํ ํธ๋ฅผ ๋ถ์ํ๋ React ์น ์๋น์ค. | |
| ๋ฐฉ์: ์จ๋๋งจ๋ + ์บ์ฑ. ๋ฐฑ์๋ Python(FastAPI), ํ๋ก ํธ React. | |
| ## 1๋จ๊ณ โ ๋ฐฑ์๋ ๊ณจ๊ฒฉ + ๋ค์ด๋ฒ ์ค์๊ฐ (์๋ฃ) | |
| - [x] `naver_collector.py` โ `fetch_keywords()` ์ฌ์ฌ์ฉ (์๋ ํ๋์ฝ๋ฉ ์ ๊ฑฐ) | |
| - [x] `analyzer.py` โ ์์ df โ Overview ์ง๊ณ (์ด๊ฒ์๋ยท๊ฒฝ์๋ถํฌยท์ค์๊ฐยท์์ ํค์๋) | |
| - [x] `cache.py` โ SQLite ์บ์ (ํค์๋+๋ ์ง ๋จ์, ์ฌ์กฐํ ์ฆ์ ๋ฐํ) | |
| - [x] `api.py` โ FastAPI `GET /analyze?keyword=` ์๋ํฌ์ธํธ | |
| - [x] ๋ก์ปฌ ์คํ + ์์ ํค์๋ ๊ฒ์ฆ (๊ณจํ 0.36s, ๊ฐ์์ง์ฌ๋ฃ 0.22s, ์บ์ ์ฌ์กฐํ 0.00s) | |
| ## 2๋จ๊ณ โ ์๋ฏธ ํด๋ฌ์คํฐ๋ง (์๋ฃ) | |
| - [x] `sentence-transformers` + `umap-learn` + `hdbscan` ์ค์น | |
| - [x] S-BERT โ UMAP(5D) โ HDBSCAN(leaf) ํ์ดํ๋ผ์ธ (`clusterer.py`) | |
| - [x] ๋ ธ์ด์ฆ(-1) ํํฐ๋ง, ๊ทธ๋ฃน๋ณ ๊ฒ์๋ ์ง๊ณ, `/analyze`์ ์ฐ๊ฒฐ | |
| - [x] ๊ฒ์ฆ: ์บ ํ์ฉํ 37๊ฐ ํด๋ฌ์คํฐ(์์/์ง๊ฐ/์บ ํํ ์ด๋ธ/์ผ์ ์นจ๋/๋๋ก๋ฅ ๋ฑ ์๋ฏธ ๊ตฐ์งํ ํ์ธ) | |
| - [x] **2.5 ์๋ ๊ด๋ จ์ฑ ํํฐ** (`filter_by_relevance`, ์๊ณ๊ฐ 0.35) โ ๊ณ์ฐ๊ธฐ ๋ฑ 197๊ฐ ์ ๊ฑฐ, | |
| ์ด ๊ฒ์๋ 4.13Mโ2.34M, ๋จ์ผ ๋ ธ์ด์ฆ ์ง๋ฐฐ ํด์. (์ฌ๋ฆฌํผยท์๋ค ๋ฑ ๊ฒฝ๊ณ์ด๋ ์์กด โ ํ์ ์ ์ ์ฌ์ง) | |
| ## 3๋จ๊ณ โ ์๋ ๋ถ๋ฅ ๋ฌถ์ (Claude Haiku 4.5) โ ์๋ฃ | |
| - [x] ํด๋ฌ์คํฐ ๋จ์ ์๋ ๋ถ๋ฅ(์ ๋ณด/๊ฑฐ๋/๋ด๋น/ํผํฉ) โ 1ํ ํธ์ถ๋ก ๋ฌถ์ | |
| - [x] ๋๋ ๋น์ค + ์๋ ๋ฐฐ์ง | |
| - [x] ํ ๋งํ ๊ทธ๋ฃน๋ช ์์ฑ("์บ ํ ํ ํธ"ยท"์ผ์ ์นจ๋ ๋ฐ ์นจ๋ญ" ๋ฑ) | |
| - [x] SMB ๋ง์ผํ ์ก์ ์ ์ ์์ฑ (์ฐจ๋ฐ ๋ฒ๋ค ์ ๋ต ๋ฑ ์ค๋ฐ์ดํฐ ์ธ์ฌ์ดํธ) | |
| - [x] ๊ฒ์ฆ: ์บ ํ์ฉํ โ ๋๋ยทํ ๋งยท์ ์ ๋ชจ๋ ์ถ๋ ฅ, ๋น์ฉ ํค์๋๋น 11.7์ | |
| - [x] **ํด๋ฌ์คํฐ ๋จ์ ๊ด๋ จ์ฑ ํํฐ(ํ๊ท 0.45 ์ปท)** โ ๋ฐฑํฉยท์๋คยท๊ฐ๋๊ฑด ๋ฑ ํจ์ ๊ตฐ์ง ์ ๊ฑฐ. | |
| ํจ๊ณผ: ํด๋ฌ์คํฐ 27โ19, ๊ฑฐ๋ํ ๋น์ค 1,021,575โ464,120, ์์ ํ ๋ง ์ ๋ถ ์บ ํ ์ฉํ์ผ๋ก ์ ํ. | |
| (๊ฐ๋ฐฉ๋ฅ 0.518๋ ์บ ํ ์ธ์ ์ด๋ผ ์์กด โ ์๋ฒ ๋ฉ์ ์์ ๋ถ๋ฆฌ๋ ๋ถ๊ฐ, ํ์ฉ) | |
| ## 4๋จ๊ณ โ React ํ๋ก ํธ ์ฐ๋ (์๋ฃ) | |
| - [x] ๋ชฉ์ HTML โ React ๋จ์ผ ํ์ผ ์ฑ(`dashboard.html`, ๋น๋ ๋๊ตฌ ์์) | |
| - [x] `/analyze` ์ฐ๋, ๋ถ์ ์คํ ๋ฒํผ ์ค๋์ (๋ฏธ๋ฆฌ๋ณด๊ธฐ์์ ๊ฒ์ฆ: ์นด๋ 3๊ฐยทํด๋ฌ์คํฐ 18ํ) | |
| - [x] ๋ก๋ฉ/์๋ฌ/์บ์ ์ํ ์ฒ๋ฆฌ, ๋๋ยท์ธ๊ตฌํต๊ณ ๋ฏธ์ถฉ์กฑ ์ ์๋ด ์๋ฆฌ ํ์ | |
| - ๋น๊ณ : Babel standalone ๊ธฐ๋ณธ์ด automatic JSX runtime์ด๋ผ `import` ๊ตฌ๋ฌธ์ด ๋ผ์ด ๋ ๋๊ฐ ์ฃฝ์ โ | |
| classic runtime์ ๋ช ์ ์ง์ ํด ์ปดํ์ผยท์คํํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ | |
| ## ์คํ ๋ฐฉ๋ฒ | |
| 1. ๋ฐฑ์๋: `cd keyword && python -m uvicorn api:app --port 8000` | |
| 2. ํ๋ก ํธ: `cd keyword && python -m http.server 5500` โ ๋ธ๋ผ์ฐ์ ์์ http://127.0.0.1:5500/dashboard.html | |
| ## 5๋จ๊ณ โ ๋ณด์กฐ | |
| - [x] ๊ฒ์ ๊ฒฝ๋ก: **๋ค์ด๋ฒ ์๋์์ฑ(์ค์ ๋์๊ฒ์) ์ฐ์ + ์๋ฒ ๋ฉ ์ถ์ ํด๋ฐฑ** (`autocomplete.py` + `search_path.py`) | |
| ๊ฒ์ฆ: ์บ ํ์ฉํโ์๋์์ฑ 14๋ ธ๋("๋ค์ด๋ฒ ์๋์์ฑ" ๋ฐฐ์ง), ๊ฐ์์ง์ฌ๋ฃโ์๋ฒ ๋ฉ ํด๋ฐฑ 13๋ ธ๋("์๋ฒ ๋ฉ ์ถ์ " ๋ฐฐ์ง). | |
| ์๋์์ฑ์ ๋น๊ณต์ ์๋ํฌ์ธํธ(๋น์ฝ/์ฐจ๋จ ๊ฐ๋ฅ) โ 5๋ ธ๋ ๋ฏธ๋ง์ด๋ฉด ์๋ฒ ๋ฉ์ผ๋ก graceful ๋์ฒด. | |
| - [x] ์ธ๊ตฌํต๊ณ: ๋ฐ์ดํฐ๋ฉ ๊ฒ์ํธ๋ ๋ + ์ต์ปค("๋ ์จ") ์ ๊ทํ๋ก ์ฑ๋ณร์ฐ๋ น ์ถ์ ๋น์ค (`datalab.py` + ํ๋ก ํธ ๋ง๋) | |
| **์ค๋ฐ์ดํฐ ๊ฒ์ฆ ์๋ฃ** โ ๊ฐ์์ง์ฌ๋ฃ: ์ฌ์ฑ>๋จ์ฑยท๊ณ ์ฐ๋ น>์ ์ฐ๋ น ๋ถํฌ๋ก ์๋ฏธ ์๊ฒ ์ถ๋ ฅ, ํ๋ก ํธ ๋ง๋ ๋ ๋ ํ์ธ. | |
| - [x] **Supabase ๋ง์ด๊ทธ๋ ์ด์ ** โ BI ํ๋ซ ํ ์ด๋ธ 3๊ฐ(analysis_run/cluster/demographic)์ ์ ์ฌ | |
| (`supabase_schema.sql` + `supabase_store.py`). SQLite๋ ๋น ๋ฅธ ์บ์ ์ ์ง, Supabase๋ ํตํฉ ๋ถ์ ์ ์ฅ์. | |
| ๊ฒ์ฆ ์๋ฃ: ์บ ํ์ฉํ ๋ถ์ โ run 1ํยทcluster 19ํยทdemographic 8ํ ์ ์ฌ ํ์ธ. Tableau/Looker ์กฐํ ๊ฐ๋ฅ. | |