2026山东大学软件学院项目实训记录个人(五)

2026山东大学软件学院项目实训记录个人(五) 项目智评罗盘EcoSentinel基于LDA与 llm 的电商评论智能分析平台项目目标面向中小电商商家通过Python爬虫爬取商品页面评论数据京东/淘宝公开评论页构建一个将海量买家评论自动转化为可视化洞察与决策建议的智能分析平台覆盖从数据采集、主题挖掘、情感分析、用户画像到 AI 对话问答与营销报告生成的完整闭环。本周我主要负责优化大模型SWOT分析同时修改了BHI计算公式引入了水军惩罚因子。优化大模型SWOT分析的生成SWOT分析是竞品对比中的经典框架分别代表Strengths优势、Weaknesses劣势、Opportunities机会和Threats威胁。为了确保每个象限都能生成足够数量的分析结论至少2条我在实现中设计了LLM生成加规则兜底的机制。async def generate_swot(self, products_info, llm_client) - dict: LLM 生成 SWOT每象限≥2 条不足时规则兜底补足。 main products_info[0] if products_info else {} comps products_info[1:] if len(products_info) 1 else [] prompt f你是电商竞争战略分析师。基于以下本品与竞品数据生成 SWOT 分析。 本品BHI{main.get(bhi_score, 0)}, 好评率{main.get(positive_rate, 0):.1%}, 差评率{main.get(negative_rate, 0):.1%}, 物流{main.get(logistics, 0):.2f}, 质量{main.get(quality, 0):.2f}, 外观{main.get(appearance, 0):.2f}, 客服{main.get(service, 0):.2f}, 价格{main.get(price, 0):.2f} 竞品{json.dumps([{name: p.get(name), bhi: p.get(bhi_score), 好评率: round(p.get(positive_rate, 0), 2), 质量: round(p.get(quality, 0), 2), 价格: round(p.get(price, 0), 2)} for p in comps], ensure_asciiFalse)} 请严格返回 JSON 对象每个象限**至少 2 条**简短结论每条不超过 25 字 {{strengths: [优势1,优势2], weaknesses: [劣势1,劣势2], opportunities: [机会1,机会2], threats: [威胁1,威胁2]}} swot {} try: response await llm_client.achat( [{role: system, content: 你是竞争战略分析师只返回 JSON。}, {role: user, content: prompt}], temperature0.5, max_tokens800, ) m re.search(r\{.*\}, response, re.DOTALL) if m: swot json.loads(m.group()) except Exception as e: logger.error(fLLM SWOT 生成失败: {e}) return self._ensure_swot(swot, main, comps) def _ensure_swot(self, swot: dict, main: dict, comps) - dict: 保证每象限为 list 且 ≥2 条不足用规则兜底补足。 swot {k: list(swot.get(k, []) or []) for k in self._SWOT_KEYS} dims [(self._DIM_CN[d], float(main.get(d, 0) or 0)) for d in self._DIM_CN] strong [f{n}表现突出{v:.0%}好评倾向 for n, v in sorted(dims, keylambda x: -x[1])[:2]] weak [f{n}有待提升{v:.0%}好评倾向 for n, v in sorted(dims, keylambda x: x[1])[:2]] avg_comp_bhi round(sum(float(c.get(bhi_score, 0) or 0) for c in comps) / max(len(comps), 1), 1) if comps else 0 main_bhi float(main.get(bhi_score, 0) or 0) fallback { strengths: strong [fBHI 口碑指数达 {main_bhi}], weaknesses: weak [f差评率 {float(main.get(negative_rate, 0) or 0):.0%} 需关注], opportunities: [针对薄弱维度优化可抢占份额, 强化优势维度形成差异化卖点], threats: [f竞品平均 BHI 约 {avg_comp_bhi}竞争激烈 if comps else 市场竞品口碑追赶, 用户对薄弱维度敏感易流失], } for k in self._SWOT_KEYS: for item in fallback[k]: if len(swot[k]) 2: break if item not in swot[k]: swot[k].append(item) return swot_ensure_swot方法确保每个象限至少包含2条结论。当LLM生成的结论数量不足时该方法会基于本品的维度评分自动生成规则兜底结论。优势判定逻辑是找出评分最高的两个维度生成XX表现突出的结论劣势判定逻辑是找出评分最低的两个维度生成XX有待提升的结论。机会和威胁则基于与竞品的对比情况生成。这种设计确保了无论LLM调用成功与否SWOT分析都能返回满足要求的结果。BHI口碑健康指数的设计与实现修改BHI计算公式为BHI (好评率×40% 平均评分/5×30% 回复率×20% 近期趋势×10%) × (1 - 水军比例) × 100先综合好评率、平均评分、回复率、近期趋势四个维度的加权得分再乘以水军惩罚系数。具体实现代码位于CompetitorService类的compute_bhi方法中def compute_bhi(self, df: pd.DataFrame, prev_df: pd.DataFrame None) - dict: 计算品牌健康指数 BHI含水军惩罚因子 BHI (好评率×40% 平均评分/5×30% 回复率×20% 近期趋势×10%) × (1 - 水军比例) × 100 total len(df) if total 0: return {bhi_score: 0} positive_rate float((df[rating] 4).sum() / total) if rating in df.columns else 0.5 avg_rating_norm float(df[rating].mean() / 5) if rating in df.columns else 0.5 # 近期趋势最近30%数据 vs 早期数据的好评率变化 trend_score 0.5 if len(df) 10 and review_time in df.columns: df_sorted df.sort_values(review_time).dropna(subset[review_time]) if len(df_sorted) 10: split int(len(df_sorted) * 0.7) early df_sorted.iloc[:split] recent df_sorted.iloc[split:] early_pos float((early[rating] 4).mean()) if rating in early.columns else 0.5 recent_pos float((recent[rating] 4).mean()) if rating in recent.columns else 0.5 trend_score min(1.0, max(0.0, 0.5 (recent_pos - early_pos))) # 水军比例来自 spam 检测落库的 is_spam 标记未检测则为 0不惩罚 spam_rate 0.0 if is_spam in df.columns: spam_rate float(pd.to_numeric(df[is_spam], errorscoerce).fillna(0).clip(0, 1).mean()) bhi_raw ( positive_rate * 0.40 avg_rating_norm * 0.30 0.5 * 0.20 # 回复率默认0.5需要平台数据 trend_score * 0.10 ) * 100 bhi bhi_raw * (1 - spam_rate) return { bhi_score: round(bhi, 1), bhi_raw: round(bhi_raw, 1), spam_rate: round(spam_rate, 3), positive_rate: round(positive_rate, 3), avg_rating: round(float(df[rating].mean()), 2) if rating in df.columns else 0, trend_score: round(trend_score, 3), }在权重分配上好评率权重最高设为40%因为好评率直接反映了用户的正面态度平均评分权重设为30%反映了用户对商品的满意程度回复率权重设为20%反映了品牌对用户反馈的重视程度近期趋势权重设为10%反映了品牌口碑的变化方向。水军惩罚机制通过spam_rate字段实现当评论数据中包含is_spam标记时系统会自动计算水军比例并通过(1-spam_rate)系数降低BHI得分从而实现对疑似水军评论的降权处理。总结完成了BHI口碑健康指数计算含水军惩罚因子、优化大模型SWOT分析等工作。