한동훈 관련 뉴스를 실시간 분석하는 AI 플랫폼 'HanLab 동훈햄 분석기' 개발기. TF-IDF에서 SBERT+OpenAI 하이브리드 임베딩으로 이어지는 알고리즘 진화 과정. 비공개 API 리버스 엔지니어링으로 구현한 댓글 델타 트래킹 시스템 등 풀스택 구현 과정을 공개합니다.
# v4 핵심 파이프라인 — embedding_cluster.py # 입력: 제목 가중치 2배 + 본문 앞 3문장 text = f"{title} {title} {' '.join(body_sentences[:3])}" # 이중 임베딩 sbert_vec = sbert_model.encode(texts) # 768d, 한국어 특화 openai_vec = get_openai_embeddings(texts) # 1536d, 범용 문맥 # concatenate + PCA 압축 combined = np.concatenate([sbert_vec, openai_vec], axis=1) # 2304d reduced = PCA(n_components=128).fit_transform(combined) # 128d # 밀도 기반 클러스터링 — 클러스터 수 자동 결정 labels = hdbscan.HDBSCAN( min_cluster_size=3, min_samples=2 ).fit_predict(normalize(reduced))
comment.news.naver.com/comment/listCount 파라미터 구조 분석 및 요청 재현.Spoofing headers.증가량(Δ)이 화제성 지표로 유효함. 스캔 주기마다 증가분만 추출하는 스냅샷 델타 구조 설계.comment_radar.py 20분마다 실행. 수집 대상 기사를SQLite WAL에서 동적 조회하여 호출 최소화. 직렬화 → Streamlit 폴링.embedding_cluster.py와 교차 분석으로 이슈 클러스터와 댓글 화제성 동시 추적.# comment_radar.py — 델타 트래킹 핵심 로직 def fetch_naver_comment_count(article_id: str) -> int: # 비공개 엔드포인트 — DevTools 역추적 url = f"https://comment.news.naver.com/comment/listCount?ticket=news&objectId={article_id}" res = requests.get(url, headers=SPOOFED_HEADERS, timeout=5) return res.json()["result"]["count"]["total"] def compute_delta(articles: list) -> list: prev = load_snapshot() # 직전 스캔 스냅샷 current = {} for a in articles: count = fetch_naver_comment_count(a["id"]) current[a["id"]] = { "count": count, "delta": count - prev.get(a["id"], count) # 20분간 증가량 } save_snapshot(current) return sorted(current.values(), key=lambda x: x["delta"], reverse=True)
뉴스 모니터링, AI 분석 파이프라인, 비공개 API 연동, 모바일 앱 개발. 실서비스 운영 경험을 바탕으로 처음부터 끝까지 구현합니다.