Spaces:
Running
Running
File size: 4,093 Bytes
21bdc64 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # 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 ์กฐํ ๊ฐ๋ฅ.
|