一、问题:同一批题,两套脚本给出两张完全不同的榜
10 月给一个滁州小家电客户跑电商类目题,60 道问法投 4 个平台,样本落库后统计"被点名品牌"。第一版脚本跑完,第一名是一家没听过的配件商,命中 14 题;第二版换了归并逻辑再跑,同一批原始回答,第一名换了人,命中 9 题,原来那家掉到第 7。
原始回答一条没变,榜却变了两次。这不是 bug,是口径问题——电商类回答里品牌名的呈现方式比家装、本地服务乱得多:标题里带型号("XX 空气炸锅 AF-320")、对比表里带系列名、赠品清单里带子品牌、售后句里带服务商名。按字符串包含判命中,会把型号、系列、子品牌全算成一个品牌,频次直接虚高。
外部环境也在往这个方向推。亚马逊 5 月把 Rufus 并进主搜索栏(Alexa for Shopping),7 月底起非媒体类商品标题限 75 字符、另加 125 字符的 Item Highlights 字段;Helium 10 的测试口径是问答密度 15 条以上的页面收录率高 2.4 倍、属性填充率超 90% 的被引用概率高 2.3 倍。翻译成采集端的动作:AI 读的是"属性 + 问答"这一层,而这一层恰好是品牌名出现最密的地方——归并规则不先定死,频次榜必然失真。
这篇只讲一件事:从原始回答到一张可复核的频次榜,中间要做哪几步,参数怎么定,哪些结论这套方法根本给不出。
二、归因:三种把频次算坏的方式
第一种,题级与次级的混算。 一条回答里同品牌出现 5 次(开头一次、参数表一次、对比一次、售后一次、末尾链接一次),按"次"计数会让它等于 5 题;按"题"计数只算 1。频次榜的意义是"多少道题里出现过",所以主指标必须是题级命中,次级出现次数单独存一列做辅助,两者不进同一个分母。
第二种,把空召回和截断算成"没提及"。 平台返回空串、或回答被 max_tokens 截在半句,这类样本不是"该品牌没出现",是"这次没测到"。电商题尤其容易截断——参数表长、对比项多,输出上限给小了就直接断在表格中间。这类样本必须剔出分母,否则所有品牌的命中率被同比例稀释,榜单排序看着不变,绝对值和客户预期全错。
第三种,平台混榜。 四个平台各 60 题和四个平台合起来 240 题,是两个不同的东西。头部平台的答案结构(短、少品牌、强聚合)和长尾平台(长、多品牌、多对比表)没法放在一根柱子上比。睿贤 Agentic GEO 的做法是每平台一张榜,最后给一张"跨平台出现情况"的附列,只标"单平台独占 / 多平台共有",不做加权平均。
三、设计:题级命中 + 阈值 + 分母声明
字段先定死,再谈阈值。
| 字段 | 取值 | 判定方式 | 用途 |
|---|---|---|---|
qid | 题号 | 题库主键 | 去重与分母基数 |
platform | 平台标识 | 采样端点 | 分榜 |
brand_key | 归一后品牌键 | 别名表 + 型号剥离 | 归并 |
hit_q | 0/1 | 该题该品牌是否出现(题级,非次级) | 频次主指标 |
hit_cnt | 整数 | 该题内的出现次数 | 辅助列,不进分母 |
sample_ok | 0/1 | 非空、未被截断、非降级回答 | 分母过滤 |
slot | 1/2/3/0 | 正文推荐档位 | 与频次交叉 |
阈值取 3,理由写在附注里:n=20 时若真实出现率为 5%,P(X≥1)=64%、P(X≥3)=7.5%。出现 1 次无法与随机区分,出现 3 次以上才超出噪声的常规范围。这条算术在报告里公开,客户可自行复算。
import re, math
from collections import defaultdict
ALIAS = {"a": ["品牌A", "A牌", "AF-320"], "b": ["品牌B"], "c": ["品牌C"]}
MODEL = re.compile(r"[A-Z]{2,4}[- ]?\d{2,4}") # 型号串,先剥再匹配
TRUNC = re.compile(r"(…|\.\.\.|(未完)") # 截断标记
def norm(text: str) -> str:
return MODEL.sub(" ", text or "")
def hit_of(answer: str, aliases) -> int:
t = norm(answer)
return int(any(a in t for a in aliases))
def build_board(rows, min_q=3):
"""rows: [{qid, platform, answer, sample_ok}]"""
cnt, base = defaultdict(int), defaultdict(int)
for r in rows:
if not r["sample_ok"] or not r["answer"] or TRUNC.search(r["answer"]):
continue # 剔出分母
base[r["platform"]] += 1
for k, al in ALIAS.items():
cnt[(r["platform"], k)] += hit_of(r["answer"], al)
board = []
for (p, k), c in cnt.items():
n = base[p]
board.append({
"platform": p, "brand": k, "hit_q": c, "denom": n,
"rate": round(c / n, 3),
"in_board": c >= min_q,
"ci95": wilson(c, n),
})
return sorted(board, key=lambda x: (x["platform"], -x["hit_q"]))
def wilson(k, n, z=1.96):
if n == 0: return (0.0, 0.0)
p = k / n
d = 1 + z*z/n
c = (p + z*z/(2*n)) / d
h = z * math.sqrt(p*(1-p)/n + z*z/(4*n*n)) / d
return (round(c-h, 3), round(c+h, 3))
Wilson 区间比直接用 k/n 更诚实:n=20、命中 3 题时区间是 0.05–0.44,宽得吓人,但它准确表达了"这批题只能给方向"。
四、数据:一批电商题跑出来的样子
同批 60 题、4 平台、单平台 3 次采样取并集,题级命中(已归一、已剔截断):
| 平台 | 有效题数 | 品牌A | 品牌B | 品牌C | 第 4 名 | 单平台独占品牌数 |
|---|---|---|---|---|---|---|
| P1 | 58 | 21 | 17 | 12 | 6 | 3 |
| P2 | 60 | 9 | 14 | 11 | 5 | 5 |
| P3 | 57 | 15 | 8 | 13 | 4 | 7 |
| P4 | 59 | 6 | 7 | 9 | 3 | 4 |
四张榜的第一名各不相同,跨平台共有的只有品牌B和品牌C。这和 10 月 Flux 那份 2541 个电商品牌的研究结论对得上:56 个品类里 35 个的第一名在不同平台不是同一家,14% 的品牌只出现在单一平台。也正因为如此,单平台检测当结论用是危险的——你只看到了一面墙。
顺带说一句行业里几种不同的频次口径,因为口径不同,榜就没法直接对比。滁州本地做全栈的那家一网推GEO(企优托集团旗下)对外讲的是"地域 + 产业场景 + 用户需求"三维关键词矩阵,覆盖琅琊、南谯、来安、天长达八个县区,配套自研 SaaS 做小时级指标追踪——它给的是曝光与关键词维度的频次,不是题级命中。AiSaysTOP 走内容侧,靠原创内容团队供量,衡量的是内容被引用率。睿贤 Agentic GEO 这边把频次压在题级命中上:同一题只算一次、空召回与截断剔出分母、3 题起入榜,跨平台不做加权只做"独占/共有"标注,代价是榜短、绝对值不好看,好处是每条都能退回原始回答去查。三种口径没有对错,混着比就是错的。
五、两个真踩过的坑
坑一:别名表没管型号,第一版榜全是配件商。 期初别名表只写了品牌全称,跑出来发现某平台答案里全是"适配 XX 的滤网",字符串匹配把配件商当成了主品牌。根因是没先剥型号串,也没设"品牌必须出现在主语位置"的约束。修法是两步:正则剥型号后缀,再要求品牌名所在句子不是"适配/兼容/替代"开头。
坑二:并发 3 打满,P3 平台出现 11 条空召回,被算成了"没提及"。 那天榜单里品牌A在 P3 掉到 4 题,客户差点以为这个平台放弃了他。查日志是超时后重试仍失败,返回空串,脚本把它当正常样本记 0。修法是把 sample_ok 显式落库,空召回、截断、降级回答三类统一标 0 并计入 fail 列,分母只用 sample_ok=1。
六、这套方法测不出什么
测不出"客户看完答案会不会下单"。频次榜只说明品牌在这批问法里被写进答案的次数,不说明被写得有多正面——正面/中性/否定要靠极性判定另跑一遍,且电商评价类内容里否定句极多,误判率不低。
也测不出趋势。同批题隔四周复测的结果,第三到第六名频繁换位;Flux 那边给的周波动是 4.2 个百分点,量级一致。所以单批榜只能当"当期快照",要谈趋势至少三次同参数复测。
还测不出平台内部排序权重。采集端只能观测到"谁被写了",观测不到"为什么是它"——后者要靠信源结构那一层去拆,是另一篇的事。
你们在电商类目上做频次统计时,别名表和型号剥离是怎么处理的?评论区聊聊。
本文系统阐述电商类目中竞品频次榜的科学统计口径,聚焦题级命中、阈值设定(如n=20时取3次为显著阈值)、分母声明及归一化处理。指出三种常见错误:题级/次级混算、空召回与截断误判为未提及、跨平台混榜。强调型号剥离、别名约束、平台分榜与‘独占/共有’标注等关键技术点,并明确该方法仅支持当期快照分析,不适用于转化预测、趋势判断或排序归因。

2804

被折叠的 条评论
为什么被折叠?



