topic model在商品推荐领域的应用

对相同类目的商品文本corpus进行主题模型训练,哎,就是LDA啦。文本预处理和训练过程略过,网上资料应该很多,主要使用Python的Gensim包;LDA的数学解释和物理意义可言看wiki或者其他资料,他们肯定比我讲得好,本文主要还是写主题模型LDA这项技术在我司的应用吧。好了,训练结束得得到三张表
表一:.商品文本词对应的topic表
spid: word1:topic_id, word2:topic_id, ..., wordn:topic_id
可以把它想象成一个稀疏矩阵:spid:()
表二.商品与topic概率对应表
QQ20180709-235449.png-18.2kB
表三.topic和word对应表
word的n就是文本词典中词的个数,可以看到每个topic下所有词在该主题的概率
QQ20180709-235459.png-20.1kB

1. 相似商品发现

文本的降维表示有很多方法,比如早先的LSA,最近5,6年随着深度学习起来的word2vec, Glove等,上面的表2其实也是对商品文本的降维表示,有了它,我们可以计算商品与商品之间相似度,不同文本描述向量的相似度计算步骤大体差不多,cosine距离,KL距离,编辑距离等等,我们在主题模型上的计算商品与商品直接相似度算法步骤:

  1. 读取表2
  2. 为每个商品分布计算其他商品与它的主题向量距离

    image.png-7.6kB

  3. 取相似度排名topN的其他商品作为相似商品,可以用于推荐

效果展示:
spid:530819928411 标题:"可步茶叶 2015限量版冰岛百年古树普洱茶生茶 一提(七饼)500元"
http://static.zybuluo.com/caomaocao/wh1xxxlakajvhpt012k6dwkc/image_1asjt6jrd1ioh1gbia8k1gjn151t8q.pngimage.png-44.3kB
例子仅使用商品标题,是为了展示效果快嘛,主题也设置的少,仅设置20个。短文本其实并不适合LDA用,主题个数设置也是门学问,这些以后再细讲吧。
http://static.zybuluo.com/caomaocao/m0fujexptgw1oxj8gnrlvzy1/image_1asjq8ucp1h8l7c1b41keu63876.png此处输入图片的描述
这个商品的前8个相似商品,从推荐系统角度来说,推荐效果光看着title就挺不错的。

2. 给商品打标签

  1. 输入商品类目和它的分词
  2. 读取类目表2,获取该商品的概率最大的topic。
  3. 读取类目表3,获得该topic下的每个词概率权重。
  4. 取在步骤3中获得的topic 中topN的词,作为该商品的标签

效果展示:
还是用章节1的例子吧,spid:530819928411 标题:"可步茶叶 2015限量版冰岛百年古树普洱茶生茶 一提(七饼)500元"
它主题11权重最大,该主题内,“生茶”,“古树”,“普洱茶”3个词概率权重最大,就给该商品打上这3个标签吧。

3. LDA and LR推荐

逻辑回归计算方便,可解释性强,在互联网广告CTR领域已经成熟应用,用在商品推荐中,我们把LDA产生的商品文本表示作为特征,输入LR来做商品推荐。以实际例子来说吧:
image.png-696kB

  1. 商品是淘宝连衣裙类目list页的头2行,混合了直通车,自然搜索结果。假设这8个位置对用户影响一致(当然这是不可能的....),获取商品的点击log,log显示,仅商品4被点击了:

image.png-61.2kB

  1. 读取类目表2,拿到了这8个商品的主题向量:

image.png-82.2kB

  1. 哎,步骤1的点击结果0,1就是LR训练的Y,而各个商品的主题向量表示就是X,扔到LR里训练,我们可以得到每个topic对商品是否会被点击的影响权重:title_score = w1 * topic_1 + w2 * topic_2 + w3 * topic_3 +...+ w20*topic_20
  2. 从商品池中根据上式拿score topnN给用户推荐

我们有了点击log,那很自然的想到给用户贴标签,因为有它点击了的商品的主题向量嘛!计算步骤:

  1. 获取用户点击日志,根据该用户对商品的点击率给商品排序。
  2. 根据类目表2,拿到用户点击过的商品的top3的主题,主题概率累积。这里我们要引入Hacker News的衰减函数Score = (P-1) / (T+2)^G,其中P是点击,T是日子,G就抄它的1.8。主题累积概率根据此公式衰减。
  3. 当用户再次访问网站的时候,从它的画像中拿到他最感兴趣的topic, 再去表2的倒排拿热门商品进行推荐。

4.捞类目精选词

有了类目下商品的文本corpus,我们想知道哪些词重要,最能体现主题n,应用上这些词做直通车投放效果应该比较好,那好,看类目表3,是不是可以把它转置作倒排,就能看出哪个word对topic影响更大,那这些词我们就认为是该类目的精选词,计算步骤:

  1. 读取类目表3,转置拿到word -> topic关系,每个word的向量表示成wc = [wc0, wc1, wc2,...,wcn],其中wc1意思是词w在topic_1下的概率。
  2. 计算每个词在所有topic下的平均概率,相当于概率的“白噪声”,wu = [1/n,1/n,...,1/n],n是主题个数。
  3. 遍历类目词表,计算wc和wn的差,由大到小排列topN个词就是类目的精选词。

5.商品文本质量评分

注意嗷,该算法主要参考他人资料,限于我司机器的计算能力以及代码实现复杂度,我们并没有上线,但是实现过程参考意义蛮大,还是记录下来,也许日后会上线。

  1. 文档中该主题的概率 * 词在该主题上的概率
  2. 计算类目下所有商品文本的 主题平均概率向量,

参考资料:
LDA wiki
腾讯火光摇曳博客
LDA漫游指南

Comments
Write a Comment