"""키워드 감성분석 탭. 키워드별 감성 요약, 브랜드x키워드 교차 분석, LLM 이유 태그. 패키지로 분리 (overview, drilldown, detail, cross_analysis, export_kw). """ import streamlit as st from .overview import render_keyword_overview, render_summary_table, render_sentiment_chart from .drilldown import render_keyword_drilldown, render_competitor_summary, render_competitor_drilldown from .cross_analysis import render_brand_keyword_cross def render(data: dict): """키워드 분석 탭 렌더링.""" st.markdown("##### 🔍 키워드 감성 분석") st.caption("키워드별 AI 답변 감성 분포와 브랜드 언급 분석") keyword_data = data.get("keyword_data", {}) keywords_list = keyword_data.get("keywords", []) if not keywords_list: st.info("키워드 분석 데이터가 없습니다. 실행요청 탭에서 키워드 분석을 실행해주세요.") return # Brand type toggle brand_mode = st.radio( "분석 대상", options=["🏠 자사 브랜드", "🏢 경쟁사 브랜드"], horizontal=True, key="sentiment:kw_brand_mode", ) is_competitor = brand_mode == "🏢 경쟁사 브랜드" if is_competitor: _render_competitor_view(data) else: _render_inhouse_view(data, keywords_list) def _render_inhouse_view(data: dict, keywords_list: list[dict]): """자사 브랜드 키워드 분석.""" # --- Overview Card --- render_keyword_overview(keywords_list) # --- Section 1: Summary Table --- render_summary_table(keywords_list) # --- Section 2: Sentiment Comparison Chart --- st.markdown("---") render_sentiment_chart(keywords_list) # --- Section 3: Keyword Drill-down (includes export) --- st.markdown("---") render_keyword_drilldown(data, keywords_list) # --- Section 4: Brand x Keyword Cross Analysis --- st.markdown("---") render_brand_keyword_cross(data) def _render_competitor_view(data: dict): """경쟁사 키워드 LLM 분석 결과.""" st.markdown("##### 🏢 경쟁사 키워드 LLM 분석") st.caption("경쟁사만 언급된 문장에 대한 LLM 감성 분석 결과") # Competitor summary card render_competitor_summary(data) # Cross analysis st.markdown("---") render_brand_keyword_cross(data, competitor=True) # Drill-down st.markdown("---") render_competitor_drilldown(data)