把闭环搭起来
App store 优化通常是靠品味做的。有人看竞品排什么词,写个标题和关键词串,等,然后调。这件事有可能做得好,也有可能花一个月把事情改坏而永远不知道坏在哪。
于是我们把闭环搭了出来。每个 app 有自己的迭代目录,放自己的读数、自己的历史、自己的推理。一个共享脚本做机械那部分:取我们真实出现过的排名查询,从每个商店拉竞品集,给每个词元分类。另一个脚本单独给候选词打意图匹配分——搜它的人是不是想要我们做的东西——与价值分(它能买到多少曝光)分开。结果应该是可执行的,而不是描述性的:一份该留的词和一份该删的词。
然后我们把它跑在十个产品上,它叫我们删掉其中最好的几个词。
它错的三条原因都值得写下来,因为它们与 ASO 无关。它们关于的是:当一个分类器的输入被它要去评判的那件事悄悄塑造时,会发生什么。
偏差一:Apple 给我们的品类,不是我们竞争的品类
分类器最强的特征很简单。对每个排名查询,看结果里什么占主导。如果那个主导品类不是 Apple 给我们应用分配的品类,就判成错配——我们为一个结果在别的市场里的词排名,这通常意味着排名是偶然的。
这个特征合理。前提是错的。
Apple 给每个应用一个主品类。那个品类是为商店导航选的,而它经常不是这个应用实际竞争的品类。我们在十个产品上的实测:
- 一个照片取证应用,被归在工具,而它 57% 的真实竞品是摄影和视频应用——它那些查询的前排是三种不同语言下的相机和取证应用;
- 一个色号查询应用被归在照片与视频,而它的竞品其实在 iPad 工具类里(31% 游戏、31% iPad、20% 工具);
- 一个过敏扫描应用被归在医疗,而它 46% 的竞品是贴纸应用;
- 一个计时应用被归在财务,而它 53% 的竞品是商务应用。
十个里有五个。对一个建立在「主导品类是否等于我们的品类」上的特征来说,谓词 dominant_genre != our_genre 对半个组合来说恒成立——于是那些品类下的每一条查询都回一个错配,不管它契合得多好。
一个产品是最坏的情况,也是最好的例子。它 214 条已排名查询里,87 条被判错配,只有 16 条作为契合活下来。照字面读,这个工具在说:删掉你四分之三的排名词,包括那些把你带到第一位的词。
偏差二:THIN 是供给,不是意图
第二个偏差更小,造成的破坏却更大。
搜索会返回一个结果数,我们把任何不足十条结果的归为 THIN。最初的理由是近空的结果集是低价值目标。我们真正写下来的是对供给的测量——那个角落里有几个应用——然后把它和意图放在了一起。
接着 THIN、错配和噪音被合并成一个布尔量,「这个词不行」。于是最好的结果和最坏的结果拿到了同一个标记:
两条结果里的第一条,而另一条是直接竞品,我们是那个搜索里唯一像样的答案。
这是一个小的、有辩护力的、高意图的胜利——一个糟糕关键词的反面。它和一个满屏不相关塔防游戏得分完全相同。
十个产品的实测:648 个被标记词元里,249 个(38%)只是 THIN。 极端的两个案例就是全部故事。某个产品 27 个被标记词元里真错配 0 个——27 个全是 THIN。照标记删,会删掉它在最高价值市场里得分最高的那个词,以及它在另一个市场里排第一的那个词。
有意思的是,打分那一侧其实已经知道区别:THIN 词元按 fit*0.3 记分,错配按 0.1 记。被骗的只有那个说「删掉它」的布尔标记。同一行数据上有一个字段是对的、另一个是错的,而错的那个驱动着删除。
偏差三:竞品集只在我们已经排名的地方被学到
第三个偏差让前两个自我印证,而它是这里最可外推的一条。
要判断一条排名查询是否契合,你需要知道竞品是谁。我们从已经排上的查询里推出这个集合——那是唯一可得的来源。然后我们又用这个集合去判断那些查询。
于是分类器对竞争场域的认知,与我们既有成就有成正比的关系。排名好的地方,种子多,竞品集丰富,结果看起来像邻居。排名差的地方,种子少,集合单薄,几乎什么看起来都像属于别的市场。
实测非常直白:
| 我们的位置 | 查询数 | 错配率 |
|---|---|---|
| 1-10 | 541 | 0.0% |
| 61-200 | — | 30.2% |
30 个百分点的跨度,与意图毫无关系。每一条深位次错配判决,实质上都是在判决我们自己的排名。
这一条没法完全修好——没有种子查询时确实没有任何证据。但它改变了那个数字的含义,而这就够了:集中在深位次的错配数是「我们排名弱」的证据,把它读成「关键词选得差」的证据,会让你去删词——而真正的问题是没人听说过你。
改了什么
两处改动,第二处更可外推。
不再要求种子长得像我们。 竞品的前排不再必须落在我们被分配的品类里才算竞品。只要我们为这条查询排得上、且前排自成一体(某一品类占其中至少一半),邻居就照记,不管 Apple 把它们归在哪。一个产品的已知竞品从 29 个涨到 108 个;它的错配数从 87 降到 38,契合数从 16 涨到 77。
把我们自己的前 10 名当作证据。 如果我们排在一条查询的前十条里,这就是该查询与我们强相关的有力信号;还要求它额外通过一次品类比较,正是最初造成伤害的那个特征本身。
THIN 的拆分来自同一轮,并附上一条值得推广的通则:删任何词之前,先看它最好的那条查询的 class,不要看聚合出来的 misfit_ranked。
而那个对账动作本身,现在被写进了规则而不是留在记忆里。改阈值或品类逻辑之前,按产品对账两件事:已排名查询里各类各占多少,以及错配集合的前排主导的是什么品类。竞品少到无法推理的产品会被标为不可靠,在它攒出一些排名之前,它的读数不算证据。
小结
任何一个训练信号来自「你已经成功的地方」的分类器,都会在评判你的弱势。这不是你调参能消掉的 bug,它是结构性的,而它的信号是一个随你没放进去的变量剧烈变化的判定率。如果你的错配率在排第一时是零、在排不到时是三成,你量的是自己的排名。
审一遍你的特征所依赖的标签。「我们的主品类」是商店做的一个导航决定,不是竞争事实,把分类器建在它上面,等于把每一家商店的分门别类怪癖一并引入。当一个特征这么强时,该被更仔细审视的是它的前提,而不是它的阈值。
把「你测量的」和「你想要的」分开。供给、意图、曝光是三个不同的问题,把它们并成一个「坏关键词」标记,意味着最便宜的胜法和真正的错误会一起被删。当同一行上两个字段意见不一致时,信那个职责更具体的那个——并查清楚哪一个接在破坏性动作上。
并且把那个对账留在规则里。上面每一条都是靠把两张表对着真实数据互相对出来的——那是一件人会做而工具不会做的事,于是它现在被写在了下一个想调低阈值的人会读到的地方,连同理由一起。