cover_image

玩物得志app搜索下拉框的工程实践

行知 玩物少年们
2021年02月25日 02:00
本期内容:
  • 简介

  • query库的构建

  • 内存索引的构建

  • 拼音联想和错别字纠错

  • 个性化

  • 结语




简介

搜索下拉框也叫搜索提示、搜索下拉推荐,是指根据用户当前的输入词提供一个query列表供用户选择。

搜索下拉框在搜索引擎中是一个标配的功能,它可以帮助用户减少输入的时间、明确搜索的意图、提高搜索的准确度,在一定程度上可以引导用户的搜索行为,提高搜索的体验。

下面与大家分享一下玩物得志app搜索下拉框的工程实践。


一、query库的构建

图片

首先从搜索日志中挖掘出query,拿到query后要做一层过滤清洗,避免不合规的词和bad query进入到query库中。

添加完之后,对每个query进行一个离线的计算,根据query对应的召回结果数和历史的点击率、转化率等数据计算出一个基础分,供后续的匹配使用。


二、内存索引的构建

有了query库之后,进行匹配的方式有很多,我们选择使用Trie构建内存索引做前缀匹配。

简单介绍一下Trie:Trie是一种结构简单,适合做前缀匹配的数据结构,单个Tire节点代码如下

public class Node {    private HashMap<Character, Node> childMap;    // isLeaf为true表示这是一个词节点,每条从根节点到词节点的路径构成一个词    private boolean isLeaf;    public Node() {        setLeaf(false);        setChildMap(new HashMap<>());    }    public boolean isLeaf() {        return isLeaf;    }    public void setLeaf(boolean isLeaf) {        this.isLeaf = isLeaf;    }    public HashMap<Character, Node> getChildMap() {        return childMap;    }    public void setChildMap(HashMap<Character, Node> childMap) {        this.childMap = childMap;    }}


假设我们有一组词["和田玉","和田玉手镯","和田玉吊坠","翡翠手镯"],用这组词构建一个Trie如图

图片


当输入“和”时,遍历“和”的所有子节点,输出其中的词节点,即可得到“和田玉”、“和田玉手镯”、“和田玉吊坠”三个结果。同理输入“和田玉手”时,则只会得到“和田玉手镯”这一个结果。


三、拼音联想和错别字纠错

图片

输入“laolis”、“劳李氏”、“lls”时如何匹配出“劳力士”的结果?

全拼联想、简拼联想和基于拼音的错别字纠错

在构建Trie的同时,我们可以再构建两个词典Map,一个全拼到query的map,一个首字母拼音到query的map,再用全拼词典map的keySet构建一个拼音trie。

图片

  1. 当用户输入一条query时,先做前缀匹配

  2. 如果前缀匹配无法找到足够的候选query,将query转换成全拼去全面词典map中查找。

  3. 如果仍然找不到足够的候选query,将query转换成首字母拼音去首拼词典map中查找。

  4. 如果仍然找不到足够的候选query,再用query的全拼去做前缀匹配。

  5. 如果还是找不到足够的候选query,遍历全拼词典map的keySet做contains包含匹配(这是最后的波纹了,这一步的时间复杂度较高,但是可以实现从后往前的匹配,结合实际情况酌情使用)。


四、个性化

在内存索引中获取到候选query集后,我们先根据离线计算好的基础分对query集进行一次排序,截取排名靠前的一定数量的query集,调用算法精排模型做个性化排序,取结果的top10返回。

精排的策略有多种,简单介绍几种:

  • 基于用户信息的个性化排序

    识别用户的年龄、性别、购买力、行为偏好等信息,与query做匹配。

    例如一个用户比较偏好手串,当他输入金丝楠木的时候优先出“金丝楠木手串”而不是“金丝楠木茶盘”,又或者对于男性用户,输入“手串“,下拉搜索中出现”手串 男”要比“手串 女”的概率要高。在实际使用中,我们使用机器学习模型来处理不同因素对于最终结果的权重关系。

  • 基于时间/季节等上下文的个性化排序

    根据用户query发生的时间/季节,将候选词与之更相关的词排在靠前。

    比如用户输入鞋子,如果query发生时候在冬天,下拉候选中出现“汉服 冬”的概率就应该更高一些。需要注意的是,不是所有的搜索对象都会和时间/季节存在关系,因为我们通过线上用户的搜索记录预先抽取到了一批和时间/季节存在关系的搜索词(比如汉服、国风卫衣等)

  • 基于session上下文的个性化排序

    上下文通常会考虑用户的query session, session内的query通常是相关的。计算query候选集与用户搜索上下文的相似程度。

    比如当用户刚刚搜索完“和田玉手镯”,这时再输入“翡翠”,那么候选集中“翡翠手镯”的关联程度就比“翡翠挂件”要高。


在实际场景中,我们要综合考虑上述几种影响个性化的策略和因素,需要考虑的因素已经变得越来越复杂,单纯的策略已经不能满足复杂的迭代需求,因此我们线上使用了ML模型来学习不同因素对于最终个性化结果的影响。


结语

搜索下拉推荐的流程如上所述,首先从历史搜索记录中挖掘出query库,通过前缀匹配等方式匹配出候选query,再通过算法策略个性化排序后选择出top10作为结果输出。

其中query匹配的部分我们开源了一个开箱即用的工具:https://github.com/leo-1994/word-associate,支持中文、拼音、首字母联想和基于拼音的错别字改写,同时支持自定义词典以及排序规则。



图片


继续滑动看下一个
玩物少年们
向上滑动看下一个