7月份,我们更新了UI界面,将搜索的热门品类放在顶级分类中。针对类似“礼物”这样的查询,用户都能获得相关的搜索结果了。会进行这样宽泛搜索的用户通常并不确定自己具体要找什么东西,所以很有可能空手而归。
我们的团队主管Gio上个月发布了一篇博文,描述了我们修改UI的动机与过程,对了解这个项目的背景会有所帮助。本文着重于描述在对“泛类”进行分类查询的启发式搜索上,我们是如何进行开发与迭代的。
下图是Etsy网站针对“极客礼品”的一个搜索:
量化“宽泛”
在对团队以外的人描述工作内容时,总会被质疑:如何利用机器学习技术从代码上来确定哪类查询属于宽泛?尽管我们可以利用类似“点击”这样复杂的线下信号或者购买行为,来学习哪类查询应当触发分类界面,但实际上却是基于对单次访问的完整评估统计,其中只运用到针对搜索结果集的基本统计。
坚持较为简单的标准有几大好处:通过避开了针对具体商品查询的行为信号,我们的方法一开始就适用于所有语言和长尾查询,调试时性能很高也相当简单,也很稳定并易于维护,同时对于外部的依赖或者移动部件也很少。下文会解释具体的工作方式,并在过程中对本文标题进行论证。
下面用“极客”作为泛类查询的案例,在搜索什么物品上,这个词提供的信息甚少:珠宝是搜索“极客”的顶级分类,不过顶级分类中还有多个其他分类。
根据搜索结果统计,搜索“极客”的顶级分类
对照“极客杯子”搜索结果的类型分布——可以想见结果会集中在家居分类。
根据搜索结果统计,“极客杯子”的顶级分类
简单来讲,我们使用的算法是衡量查询所返回的商品品类广度的。搜索“极客”得到的分布结果显示了用户可能找到所需物品的顶级分类涵盖之广,从元素周期表图样的领结到饰有π图案的杯子都有涉猎。而搜索“极客杯子”的结果则集中在一个分类中,不应触发分类界面。
查询“极客”显示出的分类
做做算术题
为了量化这些商品的“广度”,我们从计算查询所返回的各个顶级分类结果的数量开始,得到了商品在各个分类中的概率。鉴于结果中有20%属于珠宝分类,15%属于配件分类,那么珠宝和配件分类的概率值分别就是两成与一点五成。我们将这些值代入香农公式(即熵公式):
香农公式
根据公式可以得出概率分布的紊乱程度。本质上相当于计算一个物理系统的热力学熵,概念模型十分类似。
为了达到我们的目的,以rt作为结果总值,ri作为分类i的值。下面方程式的概率将会是ri/rt,而搜索结果集的类型分布熵可以表达为:
搜索结果集的熵
这样一来,无需线下信号,我们就可以确定何时该显示多个分类了。这并不代表我们在开发过程中完全不使用数据。为了确定显示多个分类的阀值,我们查看了大量查询样本,并确立了相当自由的分隔判断(即使用低阀值)。一旦从给真实用户展示新界面的AB实验中得到结果,我们希望看到低阀值查询方式对用户行为的影响,并根据数字对边缘值进行优化。不过这是个一次性的分析,由于网站分类变化很少,我们期望阀值也在长时间内维持静态。
再次升级
宽泛的查询在顶级分类中未必有很高的熵。毫无疑问,针对“极客珠宝”的搜索结果基本都在珠宝分类,但还返回了其他一些分类的结果。我们希望指引用户进入更具体的子类,比如耳饰项链这样的。因此我们引入了第二轮针对查询的熵计算,这一轮并不像顶级分类那么宽泛。过程如下:如果结果集在顶级分类中没有触发很高的熵,我们确定结果最多子类的熵值(即子分类的熵),并在结果值超过熵限的情况下显示那些子分类。
“珠宝”的顶级子分类
上图显示查询“珠宝”的结果中,珠宝顶级分类之下不同子类的分布情况。这一方法让我们得以在类似案例中深入顶级分类,坚持基于分类计数来确定单次访问。