基于word2vec和Elasticsearch实现个性化搜索

2020-05-29 00:00:00 用户 商品 计算 向量 个性化

在word2vec学习小记一文中我们曾经学习了word2vec这个工具,它基于神经网络语言模型并在其基础上进行优化,终能获取词向量和语言模型。在我们的商品搜索系统里,采用了word2vec的方式来计算用户向量和商品向量,并通过Elasticsearch的function_score评分机制和自定义的脚本插件来实现个性化搜索。

背景介绍

先来看下维基百科上对于个性化搜索的定义和介绍:

Personalized search refers to web search experiences that are tailored specifically to an individual's interests by incorporating information about the individual beyond specific query provided. Pitkow et al. describe two general approaches to personalizing search results, one involving modifying the user's query and the other re-ranking search results.

由此我们可以得到两个重要的信息:

  1. 个性化搜索需要充分考虑到用户的偏好,将用户感兴趣的内容优先展示给用户;
  2. 另外是对于实现个性化的方式上主要有查询修改和对搜索结果的重排序两种。

而对我们电商网站来说,个性化搜索的重点是当用户搜索某个关键字,如【卫衣】时,能将用户感兴趣可能购买的商品(如用户偏好的品牌或款式)优先展示给用户,以提升用户体验和点击转化。

设计思路

  1. 在此之前我们曾经有一般的个性化搜索实现,其主要是通过计算用户和商品的一些重要属性(比如品牌、品类、性别等)的权重,然后得到一个用户和商品之间的关联系数,然后根据该系数进行重排序。
  2. 但是这一版从效果来看并不是很好,我个人觉得主要的原因有以下几点:用户对商品的各个属性的重视程度并不是一样的,另外考虑的商品的属性并不全,且没有去考虑商品和商品直接的关系;
  3. 在新的版本的设计中,我们考虑通过用户的浏览记录这种时序数据来获取用户和商品以及商品和商品直接的关联关系,其核心就是通过类似于语言模型的词出现的顺序来训练向量表示结果;
  4. 在获取用户向量和商品向量表示后,我们就可以根据向量直接的距离来计算相关性,从而将用户感兴趣的商品优先展示;

实现细节

商品向量的计算

  • 根据用户近某段时间(如30天内)的浏览记录,获取得到浏览SKN的列表并使用空格分隔;核心的逻辑如下面的SQL所示:
select concat_ws(' ', collect_set(product_skn)) as skns 
from 
 (select uid, cast(product_skn as string) as product_skn, click_time_stamp 
  from product_click_record 
  where date_id <= $date_id and date_id >= $date_id_30_day_ago
  order by uid, click_time_stamp) as a 
group by uid;

相关文章