个性化搜索的几个阶段
http://www.cnblogs.com/xing901022/p/7545568.html
在电商领域里,搜索是一种最直接的用户消费的场景。每个用户进入一个app,都有自己的一些意图,比如想买鞋子、想买衣服,而且对一些品牌以及颜色风格都有一定的要求。因此搜索对于商品的触达是非常重要的。
我这里就针对自己的理解,对个性化的搜索做一个粗略的总结。一般来说app内的搜索都会经历下面几个阶段:
- 应用的初期:基于关键字的搜索
- 应用的发展期:基于主副标题的全文检索
- 应用的成熟期:针对搜索进行排名优化
- 应用的进化期:个性化的搜索
下面就针对各个阶段描述下大概的过程。
关键字搜索
在应用最开始的阶段,应用内的内容不多,用户量也比较小,比如刚刚建立起来的电商网站和应用商店等。主要可以借助关键字进行搜索的匹配的,比如电商网站存储下面的表:
关键字 | 商品 |
---|---|
耐克 | 001 |
Nike | 001 |
阿迪达斯 | 002 |
三叶草 | 002 |
adidas | 002 |
这样在搜索的时候可以直接基于关键字定位到商品。这种方式针对于最基本的数据库就可以实现。
全文检索
随着应用的完善,直接基于关键字的匹配难以维护。因为商品逐渐增多,用户搜索的关键字变化也越开越大,单靠业务规则来定义关键字和商品的关系就太麻烦了,因此就引入了全文检索的系统。
关于全文检索的技术,说的通俗一点,就是维护了关键字跟相关“文档”的关系。举个典型的例子——词典,我们想要在词典中快速查一个英文汉字最简单的方式,就是通过目录进行定位,然后懂啊指定的页码去查找对应的字;而不是一页一页的遍历寻找。
比如,在商品的列表中,商品的主标题有下面的内容:
- 001doc的内容是:“2017年耐克最新款”
- 002doc的内容是:“小明同款 黑色耐克”
- ...
然后针对上面的文档进行分词建立倒排索引,就形成了:
关键字 | 文档位置 |
---|---|
耐克 | 001doc,2,3 002doc,4,5 |
阿迪达斯 | 003doc,6,7 004doc,1,3 |
这样搜索耐克
的时候,就可以直接基于后面的文档位置定位到目标的内容。
从另一方面来说,商品主要的搜索内容来源就是主标题和副标题。大家有兴趣的可以参考淘宝京东,看一下它们的商品标题的定义规则。当然商品的标题也是需要经过统一的设置培训的,不能卖一个牙膏,结果起的名字是一个身穿阿玛尼手握iphone x,带着阿玛尼开着玛莎拉蒂的b血型双子座青春美少男早晨专用的牙膏
——这不是扯淡么!
试想一下,搜索阿玛尼的时候,搜出来这个牙膏,得有多崩溃。因此,app的管理员一定要做好商品维护的培训,尽可能的让商品的标题突出商品的核心竞争力、当下热门的话题、主要的属性用途等等,尽量不要放一些不相关的内容。
主副标题定义好,就可以直接基于一些全文检索系统实现检索查询了。比如Elasticsearch, es也支持各种分词的插件,也可以让用户自定义分词插件。这样主副标题会根搜索的关键词以同样的方式进行分词,分词后才能通过关键字进行搜索。
另外,要注意的是搜索要符合用户的操作习惯。比如在淘宝中,搜索关键词运动鞋
就会出来匹配的商品;搜索运动鞋 男 白色
,就会出现白色的男款运动鞋,而不是白色
的衣服、男
性的洗面奶、女性的运动鞋
。当然,如果没有同时满足几个条件的商品,可以提示没有xxx相关的商品,我们为您推荐下面的商品
,然后就可以使用or的关系进行搜索了。
搜索排名优化
基本的全文检索已经做完了,默认来说,elasticsearch按照关键词的匹配做的分值的排序。各种app可以根据自己的业务需求,来进行排序规则的设置。比如一半的电商平台,都会又很多的卖家入驻,因此卖家之间会形成竞争的关系。比如a店铺卖阿迪的鞋子,b店铺也卖,那么搜索阿迪的时候,到底优先显示哪一家的呢?
这就涉及到排名的优化了,不同的商家信誉、客服的态度是不一样的,商品的质、销量也是不一样的。因此就可以根据商品相关的属性以及商家相关的属性进行排序。
商品的属性,有销售额、下单量、退货率、转化率、折扣、价格、上线的日期、适合的季节、pv、浏览的停留时间、库存等等
商家的属性,有pv、uv、关注数、图片的质量和数量、销量、销售额、转化率、专柜动态、退货率、客单价、复购率、im在线时间、im响应时间、发货的速度等等
根据这些属性,就可以针对搜索匹配的商品进行排序了。
个性化搜索
当应用趋于稳定、用户增长到一定层度时,就开始注重用户的体验了。比如一个男性用户搜索鞋子和女性搜索鞋子,我们期望看到的效果是不一样的,这其实就是个性化搜索。
具体大厂们的做法我们时不得而知的,知道也不敢乱说,因此只能通过网上公开的一些信息,来揣测琢磨一下,如果我们自己想要做,该怎么实现。
那么我这里有两种思路:
基于用户模型添加关键字
在用户积累到一定程度时,可以通过用户的交互行为以及购物历史,构建用户画像——刻画出这个人喜欢的品牌、分类、购买力、喜欢的风格、性别等等。那么当用户搜索鞋子的时候,一方面我们可以在搜索框下面实时的进行关键字的推荐,比如淘宝的这个场景:
这样用户在看到推荐出来的热词时,就可以直接点击下方的搜索搭配词,进行精细化的搜索,
另方面,也可以默认在后台加上这个用户的一些属性,优先进行推荐搜索。这种方式实现起来也不难,比如借助elasticsearch, 如果搜索的是鞋子
,那么关键字传输到后台时,可以直接查找一下用户模型,添加性别 —— 鞋子 女
进行搜索。如果用户搜索的男鞋子
,经过分词后,一样可以转换成鞋子 男
,此时就不需要再去查询用户模型获得性别属性了。类似的,我们还可以增加喜欢的风格、购买力等属性。
不过这种方式是在商品搜索结果很多的时候推荐使用。
基于用户画像和物品画像进行商品匹配
另一种方式没有具体想好,大概的思路就是构建用户画像和物品画像。需要注意下面的问题:
- 选取构建的特征是,需要注意用户特征和物品特征的对应关系。比如用户这边选取的是性别、年龄、喜欢的风格;物品这边就需要选取适合的性别、适合的年龄段、风格。
- 注意特征的构建要统一到相同的维度
大致的流程是,获取用户特征、获取搜索匹配的200个商品以及它们的特征;然后就可以基于用户特征和物品特征做相似度计算,比如夹角余弦。这样做完相似度计算后,取前50个作为搜索的结果展现即可。
如果又一些深度学习的经验,也可以尝试基于深度学习做用户和物品的word embedding,然后直接计算它们的相似度。这种想法暂时还只是设想,具体如何实现还需要根据世纪的场景来做。
未来搜索的思考
现在知识图谱很火,如果能建立商品相关的知识图谱,那么搜索又可以更智能一些了。比如搜索angleababy穿过的阿迪鞋子
,就会搜索出来angleababy在录制奔跑吧兄弟时,穿过的阿迪达斯的运动鞋。是不是感觉很有意思! 哈哈哈哈哈哈哈