diff --git a/backend/crawler_copy/jd_pc_search/jd_competitor_report.py b/backend/crawler_copy/jd_pc_search/jd_competitor_report.py index 3322f26..13800e2 100644 --- a/backend/crawler_copy/jd_pc_search/jd_competitor_report.py +++ b/backend/crawler_copy/jd_pc_search/jd_competitor_report.py @@ -142,6 +142,10 @@ COMMENT_FOCUS_WORDS: tuple[str, ...] = ( "回购", "包装", "物流", + # 规格/分量(与「硬」等质地问题并列的常见抱怨维度) + "分量", + "量少", + "克重", ) # 用途/场景:每组 (展示名, 触发子串…)。每条评价若命中组内任一子串则该组 +1;同一条可属多组。 @@ -638,12 +642,21 @@ _POS_LEXEME_DETAIL = ( "软硬适中", ) _NEG_LEXEME_DETAIL = ( + # 质地(保留;与分量类并列,避免统计只突出硬而不计少量) "口感偏硬", "口感很硬", "咬不动", "发硬", "硬邦邦", "口感发粘", + # 分量/规格(常见生活化抱怨,与条形图、§8.2 归纳对齐) + "分量少", + "量太少", + "太少了", + "不够吃", + "一袋很少", + "比想象少", + "克重不足", "太甜了", "甜得发腻", "甜度过高", @@ -753,6 +766,7 @@ def _comment_sentiment_lexicon(texts: list[str]) -> dict[str, Any]: "「正向短语」仅在命中正向词表的评价条内统计(含混合条);" "「负向短语」仅在命中负向词表的评价条内统计(含混合条);每条每短语最多计 1 次;" "统计的是预设口语片段,非分词模型。" + "预设表无法覆盖全部说法(如「一袋就一点点」),条形图条数低不代表用户未在别处表述同类不满,须结合语义池原文。" ), } @@ -2580,7 +2594,7 @@ def build_competitor_markdown( _embed_chart( run_dir, "chart_sentiment_overview_pie.png", - "评价语气四象限占比(扇形图;与上表条数一致)", + "评价语气占比(扇形图;与上表条数一致)", ) ) lines.extend( diff --git a/backend/pipeline/llm/generate.py b/backend/pipeline/llm/generate.py index 5b901c7..1fbe7f7 100644 --- a/backend/pipeline/llm/generate.py +++ b/backend/pipeline/llm/generate.py @@ -126,12 +126,13 @@ SENTIMENT_LLM_SYSTEM = """你是电商/食品类用户研究助手。输入 JSON - **不要编造**样本中未出现的具体事实、品牌、价格、医学功效; - **定量数字**(条数、占比、lexicon 各字段)须与 ``comment_sentiment_lexicon`` **一致**,勿编造; - **定性归纳**(满意点/抱怨点、引语是否算差评):以**整句语义**为准;若某句在语义上为褒义或中性描述,**不得**放入「质地差、口感硬」等负向归因;若词表归类结果与句意冲突,**以句意为准**,并在「使用注意」点明「关键词归类**仅反映子串计数,不作态度判断**」。 +- **负向主题优先级(硬性)**:写「主要」「集中」「突出」类抱怨前,**必须对照** ``negative_lexeme_hits_top`` 各短语的 ``texts_matched``:若「口感硬/咬不动/发硬」等**预设短语命中为 0 或明显低于**其它维度(如分量、少、物流),**不得**把质地硬写成首要负向主题;若抽样原文与语义池里**反复出现**「分量少、太少、不够吃」等而预设短语未列出,仍须**单独归纳**(用户常用生活化表述,不必与预设表完全一致)。 - 若某措辞**未**出现在任一抽样原文(含前缀后正文)中,**禁止**用引号写成直接引语。 - **不要**只复述「某词出现 N 次」——条形图已展示;你的价值是**语义归纳**。 **建议结构**(使用四级标题 ``####``): 1. ``#### 正向体验主题``:3~6 条;概括满意点(口感、甜度、性价比等),**尽量**用「」引用 ``sample_reviews_semantic_pool`` 或其它样本中**语义确为正面**的短句(勿把对比褒义句当差评例子)。 -2. ``#### 负向评价主题归因``:**核心段落**。依据你读后判定为**确有不满**的句子,归纳 **4~8 个**问题维度(口味、质地、价格、物流等)。引文优先取自句意确为批评的原文(可来自任一档位键,不限于 ``sample_reviews_negative_biased``);引文须含 ``【细类…|…店铺…】`` 或同义店铺+品名/SKU。 +2. ``#### 负向评价主题归因``:**核心段落**。依据你读后判定为**确有不满**的句子,归纳 **4~8 个**问题维度(须覆盖**质地、分量/规格、价格、物流、包装**等中在原文中**实际出现**的类别,勿只写质地)。引文优先取自句意确为批评的原文(可来自任一档位键,不限于 ``sample_reviews_negative_biased``);引文须含 ``【细类…|…店铺…】`` 或同义店铺+品名/SKU。 3. ``#### 混合评价中的典型张力``(可选):同一评价里褒贬并存时,说明在争什么;若无则略写。 4. ``#### 使用注意``:关键词子串统计的局限、``sample_reviews_semantic_pool`` 与词表归类的差异、抽样截断、非医学结论。