搜索中,通过点击日志得到的query-doc 对儿提供了丰富的有价值的信息。基于点击形成的图,提出了“向量传播算法”来学习 query 和doc的向量表示,且在同一语义空间。此算法同时包含了点击和内容,而且产生的向量可以直接提升点击日志中的query-doc的排序效果。对于点击日志中没有的query和document,提出了两步框架来提升向量的覆盖度,并且保证较高的水平。
1. 针对点击日志中出现过的query和doc,从任意一方初始化开始,如对query进行分词,表达成字典空间的向量。然后对doc向量进行计算,用doc向量再对query向量进行更新。重复此步骤。
优点 :1) 字典空间大小可以控制,向量维度也就可控。 2)query 和doc 可以直接算相似度。 3)可以直接用点击日志优化已出现过的query的排序。 4) 不用存query * doc pair 个数据,存的是 query + doc 条数据。
缺点:经过足够多次的迭代,同一簇内query与doc 的向量趋于相同,而这个向量表达实际是同一簇(通过点击的相同doc 构造的)内 所有query中出现的词的重要程度。而随着传播次数的增加,向量损失了query本身词的分布信息。因此:1) 对给定的query,在点击日志中,出现过多个点击的doc,且点击次数有很大差别。但是在排序时,计算的query-doc相似度并无区分度。
这个相似度有用,但是基本不是用这个值去完全决定排序的用法。在我遇到的场景下,需求是重排很小的一部分候选集。当然这个候选集的生成式其他模块负责,已经保证了相对较高的相关性和其他条件等等。
而以这个相似度为基础,maybe可以继续做一些其他的工作。如之前IDRN中提到的,以query-query 相似度为基础,对query进行聚类。再对其他一些没有label的query进行分类。
那个里面用三个方式来表达query(short),三个方式粒度不同,也从统计、语言等不同角度去表达。1)细粒度的cluster 2)稀疏的上述传播后的向量 3)粗粒度的分类
算法实现主要部分:
1 ) 构造二部图 ,query 向量初始化。
2)遍历(深度或广度),得到簇。簇内进行计算。实际向量的传播,不依赖于簇。但是1. 要得到簇的id及包括的节点,方便后续用新的日志对向量更新,不用将整个图都读一遍。 2. 为了粗略看效果方便 。
3)向量的传播,向量都用稀疏向量存储。
后续:1)传播少的次数,保留query本身的词的分布。初步看query彼此相关性和query-doc相关性,是合理的。2) query本身很短,因此向量很稀疏。如果从doc方进行初始化,不知道效果如何。
2. 对于未出现的query,当然要求query中的词要在点击日志中出现过啦。主要是通过将词也映射到这个空间内,然后把词的向量拼成query的向量,来解决query-doc的相关性。
大概步骤:
1)query 分词得到ngram 的units。 以query为桥梁,建立一个unit-doc的二部图。用同上的方法,计算unit的向量。
2) 以unit向量、query向量为输入,训练一个线性回归模型,得到unit的权值。
3) 对于新的query, 用unit的向量加权计算得到query的向量,再算query-doc的相似度。
后续:待实现和补充细节。
网友评论