主题搜智能化-用户意图识别与主题生成

1、背景

最近两年,主题搜通过不断的打磨锤炼,功能不断完善,承载的需求和业务也越来越多。到目前为止,通过主题搜,我们成功孵化了“今日榜”,“设计控”,“今挑细选”等子栏目。而且实现了跟行业的无缝对接,在三位一体的推进过程中,发挥了自己的能量。
可能很多人对主题搜还不够了解,下面先简单介绍一下主题搜的产品形态和背景。
主题搜就是在主搜搜索结果页重,插入一个主题封面,点击封面之后跳到一个商品list的承接页,点击承接页的商品再到商品详情页,如下图所示:
主题搜.png
主题封面呈现的商品我们称之为封面商品,我们研究发现,用户点击主题封面的一个很重要的因素是对封面商品感兴趣,而点击主题封面之后进去的是主题承接页,在这承接页里面的商品都有一定的共性,所以我们称为主题搜,其中承接页的第一个商品是封面商品。
相对于正常的商品搜索,主题搜在整个购物链路上多了一跳,我们知道,在购物路径上每多一跳,效率都会有一定的损失,那么为什么还要做主题搜呢?总结起来,主要有以下几个方面的原因:

1) 很多行业垂直市场没有有效落地的地方
2) 商家和运营难以直接参与到搜索中来,而他们确实有迫切的需求
3) 主搜对热点事件,突发事件反映不够灵活及时  

另外,我们希望在主题承接页里面,呈现更多跟封面商品相似的商品给用户选择,来弥补一跳的点击率损失。事实也证明,在某些情况下,确实是能带来坑位的整体收益的,我们去年一年基本都在致力于主题效率的提高,同时也达到了效率的翻倍提升。关于这一点,今天这里不再做详细介绍,而今年四月份以来,主题搜一直在探讨一个新的创新方向,那就是如何让主题搜更加智能化?
主题搜自诞生以来,总体思路都是先创建主题,然后再将这些主题投放出去,这些主题有运营根据行业规则创建的,比如极有家,新品上市,商场同款等,有些是商家活动,比如iPhone首发,品牌店铺承接页等,这些主题基本都是离线打好主题的标放入引擎,然后再计算能投放的query和用户。虽然我们在效率优化的过程中,充分考虑了用户在当前query下是否对某个主题感兴趣,但是事实上,这种主题投放方式,本质上是服务于商品端,而不是用户端,在已有候选主题中挑选出来得分最高的主题也许并不是用户真正需要的。有没有一种可能,我们能猜出用户当前的搜索意图,然后根据这个搜索意图实时的,动态的构建出对应的主题?也就是根据用户的当前环境,智能推测并智能生成,让主题搜更懂用户。

2、用户意图识别

什么是用户的意图?很明显,在搜索场景下,用户输入的query是用户意图的最直接表现,另一方面,用户有行为的商品是用户意图的承载。基于这两点,我们从query和用户的行为商品来挖掘用户意图。
一种很直观的做法是,从用户的行为商品中抽取tag,看看哪些tag是用户感兴趣的,这些感兴趣的tag集合就作为用户的意图表征。
首先,将商品的短标题或者标题进行分词,然后去掉一些无用的分词结果,剩下的分词作为商品的意图tag, 然后从用户的历史行为商品和实时行为商品中根据商品的意图tag来抽取用户的意图tag。
选取的用户历史行为数据按叶子类目维度进行划分:

数据类别选取时长/天截断长度权重
点击7最近5个2
加购15最近10个3
收藏15最近10个3
购买30最近20个10

然后按照上述方法依次计算tag的累积权重,选取权重最大的20个tag作为用户的历史意图表征。
关于实时数据,我们选取了用户当天的点击tt日志,同样按叶子类目维度来划分,每个叶子类目保存最近的10个实时点击商品,采样之后,累计3个行为之后触发意图tag计算,下一次触发或者是间隔3分钟之后,或者是增量行为商品采样后大于等于2个,双十一当天中,采样率实际设置为0.5。实时数据和历史数据中,意图tag的抽取主要用了MRU(Most Recently Used,最近最多使用)和MFU(Most Frequently Used,最常使用)的做法。
具体做法如下:

  1. 实时tt中的每一个tag,根据时间衰减算出一个基础分数
    begin{equation}

score_t = frac{alpha}{e^{deltaT}}
end{equation}
其中,$deltaT = \frac{(timestamp - clktime)}{timePeriod}$,
timestamp是当期时间戳,clktime是该tag对应的商品的点击时间戳,timePeriod是一个时间系数,实际中设置为180秒

  1. 如果该tag出现在历史数据中,取出tag在历史数据中的位置pos(越靠前的tag权重越大),更新该tag的分数为
    begin{equation}

score_t = {(1 + score)} * {e^{frac{alpha - pos}{alpha}}}
end{equation}

  1. 重复1,2的过程,计算实时tag中的每一个tag的累积分数
    begin{equation}

score = sum_{t}{score_t}
end{equation}

  1. 处理历史tag中,没有出现在实时日志中的剩余tag,每个tag对应的分数为:
    begin{equation}

score = e^{frac{alpha - pos}{alpha}}
end{equation}

  1. 筛选分数最高的N个tag作为用户的有意图tag集合,实际中N=16

上述做法其实遵循的就是两个原则,第一个就是实时出现的tag如果同样出现在历史数据中,分数会比较大,也就是看用户是不是最经常点击这样的tag,第二个就是用户点的越多,分数越大。如果两个tag,一个只出现在实时数据中,一个只出现在历史数据中,则根据公式(1)(4)进行比较,这两个公式都是根据数据分析和实验测试调试出来的,从公式可以看出,3分钟之内点击的tag分数大于历史tag,7分钟之内点击的tag分数大于排在第7位之后的历史tag分数。
这里想说的,tag抽取中有很多经验性和实验性的东西,比如说为什么时间系数是180秒,公式(1)和(4)为什么要这样设计?基本都是数据分析结合实验测试之后得来的,这里不详细介绍,效果如下图所示。
DingTalk20171117190207.png
上图中,recent_tag是历史抽取出来的意图tag,nid_list是用户实时点击商品列表,result_tags是实时行为和历史行为根据上述方法计算出来的最终意图tag,这些tag同时也会作为召回条件,然后通过query来过滤相关性。拿图中的实例数据来说明一下:

  • recent_tag:宽松 牛仔裤 加绒 加厚 长裤 小脚 女裤 女装 哈伦裤 秋冬 松紧腰 冬季 哈伦 显瘦 高腰 保暖 大码
  • nid_list:559630043600:烟灰色 高腰 加绒 牛仔裤 小脚裤 冬装 大码 加厚 全棉 保暖裤 铅笔裤 收腹:1510898301;559558597645:松紧腰 加绒 牛仔裤 长裤 秋冬 百搭 宽松 裤子 高腰 哈伦裤:1510898242;559690807438:高腰 牛仔裤 加绒 长裤 秋冬 大码 胖mm 弹力 收腹 加厚 保暖 小脚 铅笔裤:1510898209
  • result_tags:牛仔裤 加绒 加厚 长裤 宽松 秋冬 高腰 小脚 哈伦裤 大码 松紧腰 收腹 铅笔裤 保暖 冬装 保暖裤

当用户搜索“女装/女士精品 >> 牛仔裤”类目下的query,比如牛仔裤,召回效果等同于用下列所有query一起去召回,然后统一排序:

牛仔裤 | 牛仔裤 加绒 | 牛仔裤 加厚 | 牛仔裤 长裤 | 牛仔裤 宽松 | 牛仔裤 秋冬 | 牛仔裤 高腰 | 牛仔裤 小脚 | 牛仔裤 哈伦裤 | 牛仔裤 大码| 牛仔裤 松紧腰 | 牛仔裤 收腹| 牛仔裤 铅笔裤| 牛仔裤 保暖 | 牛仔裤 冬装 | 牛仔裤 保暖裤

'|'号分隔的是每个query,为什么要保留这么多关键字,为什么这些意图tag是用OR的关系去召回,而不是AND关系召回?关于这一点,主要是考虑到,用户的意图往往是多方面的,并不是确切的某一个,或者说,用户会同时偏好多种意图tag,另外一方面,我们希望在主题承接页里面,能呈现跟用户相关,但是同时也是比较丰富的商品给用户选择。
图中的title字段,是生成的意图主题,这部分后面会详细介绍。
整个系统架构如下:
系统架构图副本.png

3、 意图主题生成

上一节中, 详细介绍了用户意图tag的抽取,并将这些tag作为召回条件去召回主题商品,但是意图主题要在前端展示,还需要一个主题标题,这个标题对主题起一个概括性的作用,给用户一些显式的提示。
随着深度学习在翻译领域上的突破性进展,越来越多的研究工作也将翻译模型应用在文本生成,文本摘要上面,这方面比较经典的工作有

公司内部在这方面的工作也非常的多

这里的工作,总体框架都是用了seq2seq模型,encoder-decoder结构,然后结合业务场景做了很多优化,其中《智能化文案生成在精准定向广告领域的应用》更是结合了三篇顶级论文(1. 4. 5.),效果也非常好。所以在这里也没有特别新的东西可讲,实际上,Google首次提出的seq2seq模型效果就已经能达到很好的效果了,今天在这里主要讲一下我在用seq2seq模型来做意图标题生成中,一些没有被侧重提到的一些点。

3.1 样本构造与模型训练

跟《智能写手--深度学习在文本内容生成的实践》中的一样,我们也用清单数据来构造样本,不同的是,我们不是随机挑选清单商品来代表清单,而是用出现频次最高的60个tag来表示清单,这样的样本大概有100W。另外,因为实际场景中,输入的tag长度是不定的,我们还需要模型对不同长度的输入tag都能得到鲁棒的生成结果,所以还需要构造一部分样本来适应不同长度的输入tag,我的做法是,对这100W样本,根据输入tag的长度随机按照(0.3,0.7)采样,这样又产出了100W样本,在这200W样本中,输入tag的平均个数是25.
另外有一点,跟翻译任务不同,标题生成其实并不是很关心输入tag的顺序,但是实际上,seq2seq由于是RNN网络结构,对tag的输入顺序是比较敏感的。也就是说,对于完全相同的tag集合,当你改变tag之间的顺序输入模型之后,得到的结果可能会千差万别,甚至对于样本没有完全覆盖到的顺序,模型无法生成合格的标题。《阿士比亚:搜索团队智能内容生成实》也提到了这个问题。那么怎么解决这个问题呢?我们开始想到的是,把输入样本的tag按照字典序排序,然后再训练,事实上,这种做法的效果是反作用的。后来分析,这样构造的样本,一定程度上消除了样本的差异性(很多样本排前面的几个输入tag完成一样,但是输出标题却大不同),模型很难从这种差异性削弱的样本中,学到decoder网络。所以要解决这个问题,得从模型本身上做优化,比如取消位置embedding,但是最有效的方法,经过试验表明,还是构建稠密样本最为有效,上面提到的随机采样就是一种办法。另外,我曾经想到,Facebook的convS2S模型,采用的是卷积网络,而卷积具有平移旋转不变性,自然对输入顺序没那么敏感。后来经过试验证明,convS2S模型在这方面确实有优势,但是也只能在一定程度上解决,毕竟卷积运算是有卷积窗口大小的.

3.2 seq2seq与convS2S比较

经典的seq2seq网络结构如下图所示:
DingTalk20171117211355.png
图中左边浅蓝色的是encoder模块,将输入编码为一个向量V;右边浅紫色部分是decoder模块,其中v作为decoder模块的初始隐藏输入。
begin{equation}
P(y_1,cdots,y_T'|x_1,cdots,x_T) = prod_{t=1}^{T'}{P(y_t|v,y_1,cdots,y_{t-1})}
end{equation}
seq2seq+attention+双向lstm+残差链接的GNMT网络结构如下:
DingTalk20171117214331.png
attention向量的计算:
begin{equation}
s_t = AttentionF unction(y_{i−1}, x_t)
end{equation}
begin{equation}
p_t = frac{e^{s_t}}{sum_{t=1}^{M}{e^s_t}}
end{equation}
begin{equation}
a_i = sum_{t=1}^{M}{p_tx_t}
end{equation}
Facebook的convS2S模型结构
image.png
这个模型复杂一点,所以多说两句。
1)模型的输入序列 e = {$e_{1},\cdots,e_{m}$}:$e_{i} = w_{i} + p_{i}$,$w_{i}$表示$x_{i}$的word embedding, $p_{i}$表示$x_{i}$的position embedding
2)Decoder的输入序列g = {$g_{1},\cdots,g_{m}$}同样由两部分组成,上一个输出词的word embedding以及对应的position embedding
3) GLU单元计算函数
image.png
4)第$l$层卷积中,第$i$个输出的隐层向量:
begin{equation}
h_{i}^{l} = v(W^l[h_{i - k/2}^{l−1},cdots,h_{i + k/2}] + b_{w}^{l}) + h_{i}^{l-1}
end{equation}
其中,$W^{l}$表示第$l$层的卷积核,$h_{i}^{l-1}$表示残差连接。k表示卷积窗口作用的输入元素个数。
5)Decoder网络的第$l$层中,第$i$个输出和第$j$个输入的attention值计算方法如下:
begin{equation}
d_{i}^{l} = W_{d}^{l}h_{i}^{l} + b_{d}^{l} + g_{i}
end{equation}
其中,$g_{i}$是前一个输出词的embedding向量,d是输入元素embedding的维度。
begin{equation}
a_{ij}^{l} = frac{e^{d_{i}^{l}z_{j}^{u}}}{sum_{t=1}^{m}{e^{d_{i}^{l}z_{t}^{u}}}}
end{equation}
式中$z_{j}^{u}$表示Encoder第$u$层(也就是最后一层)的第$j$个隐层状态
6)Decoder网络的第$l$层第$i$个目标输出的attention向量就为:
begin{equation}
c_{i}^{l} = sum_{j = 1}^{m}{a_{ij}^{l}(z_{j}^{u} + e_{j})}
end{equation}
7)得到$c_{i}^{l}$之后,将其加到Decoder当前层的隐层状态$h_{i}^{l}$中,然后再输入到decoder的第$l+1$层中,最后,在decoder的第$L$层可以得到最终的隐层状态$h_{i}^{L}$
8)decoder输出
begin{equation}
p(y_{i+1}|y_{1},cdots,y_{i},x_{1},cdots,x_{j}) = softmax(W_{o}h_{i}^{L} + b_{o})
end{equation}
convS2S模型要比GNMT模型难理解一些,这里可能也有理解不对的地方,欢迎大家指正。
那么,convS2S相对于attention based seq2seq模型,到底哪个效果好呢,在翻译任务里面的效果,论文都有详细的对比结果,这里不在详细介绍,我们来看一下,在我们这个标题生成场景下,到底哪个模型好呢?
随机挑选一些case

1.连衣裙
2.连衣裙 修身
3.修身 连衣裙
4.客厅 简约 无框画 现代 竖款 竖版 遮挡 电表箱 现代 客厅 卧室 背景 装饰画 现代 客厅 简约 三联 装饰画 田园 小清新 客厅 美式 装饰画 客厅
5.加绒 宝宝 毛线 针织 毛线帽 秋冬 婴儿 公主 1 - 2 岁 童帽子 儿童 宝宝 婴儿 男女 保暖帽 儿童 男女 加厚 保暖 套头帽 大眼睛 韩版 儿童 巫师帽 加绒
6.单鞋 社会 平底 豆豆鞋 毛毛 加绒 铆钉 秋冬 百搭 瓢鞋 一脚蹬 貂绒 兔毛 方头 鞋子 毛毛鞋
7.吊带 背心 性感 上衣 镂空 显瘦 针织 蕾丝 露背 民族风 挂脖 泳衣 罩衫 系带 搭配 金美人
8.帽子 秋冬 百搭 冬季 保暖 画家帽 蓓蕾帽 羊毛 贝雷帽 针织 南瓜 发夹帽 雷锋帽 儿童 防风 口罩
9.眉笔 眉粉 不脱色 自然 持久 防水防汗 一字眉 不晕染 画眉 双头 防水 防汗 初学者 化妆师 染眉膏 三合一
10.牛仔裤 加绒 加厚 长裤 宽松 秋冬 高腰 小脚 哈伦裤 大码 松紧腰 收腹 铅笔裤 保暖 冬装 保暖裤
11.粗跟 长靴 女靴 长筒靴 高筒靴 冬季 高跟 高筒 加绒 尖头 中跟 马丁靴 长筒 真皮 侧拉链 靴子
12.四件套 床上 卡通 全棉 床单 纯棉 家纺 儿童 功夫熊猫 件套 简约 磨毛 被套 三件套 寝室 单人
13.灯条 七彩 灯带 变色 贴片 雷士照明 长条 吊顶 led 灯管 高亮 彩色 客厅 欧普照明 霓虹 光带
14.拖把 平板 地拖 拖布 家用 拖地 免手洗 懒人 木地板 墩布 旋转 平拖 神器 尘推 实木 地板
15.外套 毛呢 大衣 中长款 呢子 加厚 过膝 秋冬 宽松 韩国 大码 女装 千鸟格 格子 复古 双排扣
16.羽绒裤 儿童 女童 外穿 男童 加厚 宝宝 冬季 保暖裤 保暖 童装 裤子 棉裤 羽绒 中大童 天天特价


attention based seq2seq模型与convS2S产出的结果如下:

序号seq2seqconvS2S
1 穿上这件裙子,让你的美年轻00岁穿上连衣裙,你就是女神
2 穿上小白裙,让你秒变女神穿上连衣裙,你就是女神
3 穿上小白裙,让你秒变仙女!穿上连衣裙,你就是女神
4一幅装饰画,让家焕然一新北欧风装饰画,让家更整洁
5萌翻了的帽子,宝宝的温暖女童针织帽,时尚保暖两不误
6豆豆鞋,舒适保暖,很有时尚感时尚豆豆鞋,穿出你的时尚感
7若隐若现的性感,我的性感我做主穿上比基尼,做个性感小女人
8帽子围巾,温暖从细节开始冬日里的一把火
9迷人妆容画出你的精致 眉毛画得好,女神没烦恼
10加绒牛仔裤,保暖显瘦显长腿加绒牛仔裤,保暖又显瘦
11帅气长筒靴,霸气的女王气场过膝长靴,穿出大长腿
12孩子的卧室你准备好了吗?卡通四件套,萌翻你的少女心
13一盏明灯,照亮心灵的美好多彩灯带,点亮多彩生活
14拖地卫生又省力的拖把,还你干净整洁的家平板拖把,让拖地变得简单
15秋冬必备毛呢大衣,你get了吗中长款呢大衣,穿出优雅气质
16温暖的冬天,需要棉衣来相助女童加厚棉裤,时尚又保暖


从上述可以看出,seq2seq模型可以学到更多的细节,句式比较丰富,从前3个非常相似的样例可以看出。convS2S模型产出的标题样式比较相似,比如时尚又保暖,保暖又显瘦,穿出优雅气质,穿出大长腿等。但是convS2S模型有一个很好的优势是产出的标题出错率非常低,而且训练速度比seq2seq快了5倍以上。更多的例子这里由于篇幅限制不再枚举。实际统计中,seq2seq模型的出错率也是要大于convS2S模型的。

3.3 一些思考和想法

在做标题生成任务过程中,曾经想过,能不能对现有的翻译模型做一些模型层面上通用的而不是针对业务场景的优化,当时的想法是将word2vec与翻译模型结合,这里贴出来,供有兴趣的人讨论指正。
见附件Seq2Seq With Word2Vec For NMT

4、实验效果

实时的用户意图与主题生成,双11期间,在Porsche团队的帮助下,全量上线,达到的效果是:用户在某个叶子类目的行为累积达到6个左右的时候,5分钟之内会生成一个对应的意图主题并进行投放。从数据报表上来看,实时的效果也要显著好于非实时的。由于这个功能涉及的工程模块比较多,有Porsche,iGraph,QP还有引擎,不便做bts测试,所以只能横向比较。
离线意图识别与主题生成:
image.png
27号当时上线半天,后来由于调试下线,31号全链路实时第一次调通,从报表可以看出,相对于静态的意图主题,封面点击率是有35%+的提升的。
再看意图主题在其他主题中的竞争情况:
10.15静态版
image.png
效率大概排在第12位,二跳的点击率也不高
11.10全量实时版:
image.png
效率已经跃升到Top之列,二跳点击率也提升不少
双11当天,尽管主题搜有很多的行业规则调整,比如店铺承接页主题上提,位置调整等限制下,意图主题的表现也依然抢眼:
image.png
其中前三个主题都是家装类的垂直主题,而意图主题是全类目主题。

5、总结与展望

虽然翻译模型用来做标题生成任务可以完成的比较好,但是这两个任务其实是有本质区别的,翻译中的输入和输出有严格的顺序和对应关系,而标题生成任务中并没有,它更像一种抽取概括的工作,但是本文工作并没有体现出这些差别。同时抽取出来的意图tag,也是有权重之分的,但是在召回的时候并没有利用上,这些都是今后改进的点。
最后感谢所有在项目完成过程中给予帮助的同学

  • Porsche平台:邻风,仲卓,夕肆,澄空
  • QP平台:彻空,远石
  • 产品和运营:松雨,芈月
  • 还有我们团队的苏哲,深言和宇淮,跟他们讨论的过程中,收获很多,特别是苏哲的耐心指导和帮助
  • 最后感谢各位老大的支持和帮助(仁重,青峰)
  • 特别感谢仁基老师提过的主题搜要智能化,指出了智能化这个概念。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值