在淘宝搜索系统中,从买家输入关键词搜索Query直到最终的搜索结果列表页组织返回响应,其中涉及到如下两个重要的相关性计算环节:
      1、系统预测该关键词所对应的优先展示类目
      2、系统在已召回的宝贝中进行该关键词与宝贝标题的相关性进行计算

1、系统预测关键词所对应的优先展示类目的计算方法及分档
       淘宝系统中有3万多个类目,对于不同的关键词Query并未全部严格规定,部分常用的关键词已确定优先展示类目,且部分关键词所预测的类目并不止一个,此时就需要进行查询词相关类目的分档,具体计算方法如下。

概率检索模型
      概率检索模型的基本思想是:给定用户一个查询,如果搜索系统能够在搜索召回结果中分析出众多文档与用户需求的相关性的高低,那么这个搜索系统的准确性是最优的。而在文档集合(淘宝类目就是文档集合标签)的基础上尽可能准确地对这种相关性进行估计则是其核心。
      从概率检索模型的表述来看,这是一种直接对用户需求相关性进行建模的方法,概率检索模型只是一种指导思想,在这个框架下,怎样对用户的相关性建立模型呢?用户发出一个查询请求,如果我们把文档集合划分为两个类别:相关文档子集(即淘宝优先展示类目)不相关文档子集(即淘宝无关类目),于是就可以将这种相关性衡量转换为一个分类问题。
      下图示意了概率检索模型作为一个分类问题,对于某个文档D来说,如果其属于相关文档子集的概率大于属于不相关文档子集的概率,我们就可以认为这个文档与用户查询是相关的。图中的P(R|D)代表给定一个文档D对应的相关性概率,而P(NR|D)则代表该文档的不相关概率。即如果P(R|D) >P(NR|D),我们可以认为文档与用户查询时相关的。

       

      所以现在问题的关键是如何估算P(R|D)和P(NR|D)的数值。为了简化问题,首先我们根据贝叶斯规则对两个概率值进行改写,即:
    
      相关性计算的目的是要判断P(R|D)>P(NR|D),将改写公式带入成为如下形式:
    

       因为是同一篇文档,所以右端公式的分母P(D)是相同的,在做相关性判断时可以消掉,并对因子移项,转换成如下形式:

    

      尽管概率模型将相关性判断转换为一个二分类问题,但是搜索应用并不需要进行真正的分类,而是将搜索结果按照相关性得分由高到低排序,所以对于搜索系统来说,只需要将文档按照大小降序排列即可,于是问题进一步转换成如何估算因子P(R|D)和P(NR|D),而二元独立模型提供了计算这些因子的框架。

二元独立模型(Binary independent Model)
      为了能够使估算上述两个计算因子可行,二元独立模型(BIM模型)做出了两个假设:
      假设1:二元假设
      所谓二元假设,类似于布尔模型中的文档表示方法,一篇文档在由特征进行表示的时候,以特征“出现”和“不出现”两种情况来表示,不考虑其他因素。假设特征集合包含5个单词或词组,某文档D根据二元假设,表示为{1,0,1,0},其含义是这个文档出现了第1个,第3个和第5个单词或词语,但不包含第2个和第4个单词或词语,做出二元假设是将复杂问题简单化的一种措施。
      假设2:词汇独立性假设
      所谓词汇独立性假设,是指文档里出现的单词或词语之间没有任何关联,任意一个单词在文档的分布概率不依赖于其他单词或文档是否出现。有了词汇独立性假设,我们就可以将对一个标题文档的概率转换为对标题文档包含单词或词汇的概率估计,因为词汇之间没有关联,所以可以将标题文档概率转换成单词或词语概率的乘积。
      在以上俩个个前提假设下,二元独立模型即可对两个因子P(R|D)和P(NR|D)进行估算,在进行形式化描述前,我们举个简单的例子。
      上文提到的文档D表示为{1,0,1,0},我们用Pi来代表第i个单词在相关文档集合内出现的概率,于是在已知相关文档集合的情况下,观察到文档D的概率为:
                                       P(R|D)=P1*(1-P2)*P3*(1-P4)*P5
       因为在文档中出现了第1个,第3个和第5个词语,所以这些单词在相关文档集合中的出现概率为Pi,而第2个和第4个词语没有出现,那么1-Pi就代表了词语不在文档出现的概率,根据词汇独立性假设,将对文档D的概率估计转换为每个词语概率的乘积,这样就可以估算因子P(D|R)。
        对于因子P(D|NR),我们假设用Si代表第i个词语或单词在不相关文档集合内出现的概率,于是在已知不相关文档集合的情况下,观察到文档D的概率为:
                                      P(D|NR)=S1*(1-S2)*S3*(1-S4)*S5
       两个因子已估算完毕,于是我们可以估算:
         
       如果可以从文档集合估计pi和si,那么我们就可以对文档的相关性进行直接计算,这是一个具体实例,下面我们用形式化方式表示如何计算:
       

       这个公式与上面实例所列公式含义相同,只不过将各个计算因子归为两个部分,其中i:di=1代表了在文档D中出现过的各个单词的概率乘积,i:di=0则代表了没有在文档D中出现的各个特征词的概率乘积。进一步对这个公式进行一些数学等价变换,可得:
        
       即将计算公式分解成为两个组成部分,第一个组成部分i:d=1代表在文档中出现过的单词所计算得到的单词概率乘积,第2个部分i代表对所有特征词计算所得到的单词概率乘积。因为pi和si是从相关文档和不相关文档集合中统计出来的全局概率,所以与具体文档无关,这说明对于所有文档来说第2个部分得分都一样,所以在排序中不起作用,于是可将这个部分消掉,得到最终的相关性估算公式:

       

        出于计算方便,可以对上述公式取Log值,得到如下相关性估算公式:

       

       到目前为止,我们已经获得了计算相关性的具体方法,剩下的问题就是如何计算单词或词语概率pi和si。给定用户查询,如果我们可以确定哪些文档构成了相关文档集合,哪些文档构成了不相关文档集合,可以利用下表所列出的数据来估算单词概率: 

 相关文档不相关文档文档数量di=1riRi-rinidi=0R-ri(N-R)-(ni-ri)N-ni文档数量RN-RN

      表中第3行的N为文档集合总共包含的文档个数,R为相关文档的个数,于是N-R就是不相关文档集合的大小。对于某个词语或单词di来说,假设包含这个词语的文档数量共有ni个,而其中相关文档有ri个,那么不相关文档中包含这个单词的文档数量则为ni-ri。再考虑表中第2列,因为相关文档个数是R,而其中出现过单词di的有ri个,那么相关文档中没有出现过这个单词的文档个数为R-ri个,同理,不相关文档中没有出现过这个单词的文档个数为(N-R)-(ni-ri)个。从表中可以看出,如果我们假设已经知道N、R、ni、ri的话,其他参数是可以靠这4个值推导出来的。
     根据表格数据,即可估算si和pi,si因为pi代表第i个词语在相关文档集合内出现的概率,在BIM模型的二元假设下,可以用包含这个词语的相关文档个数ri除以相关文档总数R来估算,即pi=ri/R。而si代表第i个单词在不相关文档集合内出现的概率,所以可以用包含这个单词的不相关文档个数ni-ri除以不相关文档总数(N-R)来估算,即si=ni-ri/(N-R)。把这两个估算公式带入相关性估值公式即可得出如何计算相关性,但是这里有个问题,相关性估值公式采用了Log形式,如果ri=0,那么会出现log(0)的情形,为了避免这种情况,我们对pi和si的估值公式进行平滑,分子部分加上0.5,分母部分加上1.0,即
                                                      pi=(r+0.5)/(R+1.0)
                                                  si=(ni-ri+0.5)/(N-R+1.0)

      将这两个估值因子带入相关性估算公式,得到如下公式:
        
      其代表的含义是:对于同时出现在用户查询Q和文档D中的词语或单词,估值进行累加,其和就是文档D和查询的相关性度量,之后,再使用BM25模型进行精确求解。

BM25模型
      BM25模型是基于二元假设推导而出,考察词语在查询中的权值,拟合出综合上述考虑因素的公式,并通过引入一些经验参数。因此,BM25模型是淘宝中最常用也最重要的判断类目相关性的模型。以下是BM25模型计算公式
               公式中,对于查询Q中出现的每个查询词,依次计算单词在文档D中的分值,累加后就是文档D与查询Q的相关性得分。可以看出,计算第i个查询词的权值时,计算公司可以拆解为3个组成部分,第1个组成部分就是BIM模型计算得分,第2个组成部分是查询词在文档D中的权值,K1和K是经验参数,第3个组成部分是查询词自身的权值,如果查询较短小的话,这个值往往是1,k2是经验参数值。BM25模型就是融合了这3个计算因子的相关性计算公式。
       下面我们以用户查询“男士 牛仔裤”来看看如何实际利用BM25公式计算相关性,首先我们假定BM25的第一个计算因子中,我们不知道哪些是相关文档,所以讲相关文档个数R和包含查询词的相关文档个数r设定为0,此时第一个计算因子退化成:
    
      因为查询中,分词后的查询词都只出现了一次,所以其对应的值都为1,其他数值假定如下:
      文档集合总数:N=100000
      文档集合中包含词语“男士”的文档个数n男士=1000
      文档集合中包含词语“牛仔裤”的文档个数n牛仔裤=100
      调节因子=1.2  200   b=0.75
      假定文档长度是平均文档长度的1.5倍,即1.2*(0.25+0.75*1.5)=1.65,将这些数值带入BM25计算公式,可以得出文档D和查询的如下相关性得分:

   

       这样,可对集合中所有的文档都按照上述方法进行计算,将最终的计算分值进行归纳总结,即可准确的预测出与“男士 牛仔裤”这个查询词最相关的宝贝,这些宝贝进行集合分类,最终即可得出该查询词的最优先展示类目!对于在不同区间的分值,淘宝一般会进行分档处理,比如[10,8]区间为第一优先类目,(8,7]区间为第二优先类目,依次进行分档,因此就有可能会出现在同一查询词的结果列表中会出现多个类目的情况。

2、系统在已召回的宝贝中进行该关键词与宝贝标题的相关性进行计算
向量空间模型(Vector Space Models)
      向量空间模型提出了将查询词和宝贝标题按照关键词的维度分别向量化,然后通过计算这两个向量间夹角的余弦值的方法得到标题与查询词的相关性得分。从而优先检索那些和
查询词相关性大的标题,并能够对检索出的标题按照与查询词的相关性进行初步评估和排序,向量空间模型的计算方法如下图所示:
    
       在向量空间模型中,通过下面3个步骤进行检索:
       1、把原始查询和标题都看做文本,使用同样的向量化过程分别得到查询向量和文档向量。
       2、通过计算向量相似度的方法计算原始查询和文档相似度。
       3、按照与查询词的相似度从大到小给予评估。并返回给淘宝搜索系统。
      向量包含了两层含义,即长度和方向。长度用向量的模表示,向量的模(长度)的计算公式为向量的每个分量的平方和开根号。由于向量具有方向,所以方向上的差异(角度)
被用来量化向量的相似程度。
      将各种不同的关键词看做是不同的维度,那么每个文档按照关键词进行向量化,得到向量中每一个分量可以理解为向量在各个关键词维度上的投影,这一点并不难理解,三维
坐标上描述一个点采用的方式为(a,b,c)表示向量在X轴上的投影为a,在Y轴上的投影为b,在Z轴上的投影为c。这里只是把代表三位空间中3个轴转换为n个关键词的n维空间,这样每一个查询词和每一个文档都可以用这个n维空间来表示。
      通过一个例子来理解向量化过程,假定淘宝的汉语词库中只有“安卓”、“双系统”、“手机”这3个词(实际上,淘宝的词库中的汉语词汇数以万计),那么这3个词组成的向量空间模型就是我们熟悉的三维空间,如下图所示:

        

       对于“HTC G21 双系统 双卡双待移动电话安卓智能手机 包邮送豪礼”这个标题,将3个词的维度理解为三维空间的XYZ轴,通过计算每个词语的自信息和熵值,这样,“HTC G21 双系统 双卡双待移动电话安卓智能手机 包邮送豪礼”这个标题在词典中构成的向量空间内表示为向量(2,1,1)。这个向量的3个分量的意义可以理解为对3个轴的投影分别是2,1,1,同时注意这里的向量的方向性用箭头表示。
       我们还可以扩展到思维空间上理解,假定淘宝字典中还包括了“诺基亚”一词,这样,对于“HTC G21 双系统 双卡双待移动电话安卓智能手机 包邮送豪礼”这个标题进行向量化的结果就可能是(2,1,1,0),因为“诺基亚”在关键词维度上的投影为0。
      据统计,淘宝词库中常用的汉语词汇大约5000条,如果用这5000维的词向量空间表示这个标题,就是这样的形式(0,0…0,2,0…1,0,0…0,1,0)。其中标“0”的分量表示标题在这个词语上的投影为零(即自信息和熵值为0),该标题在向量中只有3个分量为有效非零值,课件再实际的计算中,向量通常都是十分稀疏的。
      事实上,向量中的每个分量同除以相同的数不会改变向量的方向,但是会改变向量的距离。因此在只考虑向量方向,而不考虑向量长度的情况下,没有必要使用词频作为向量的分量,这样反而引入了浮点运算的麻烦。
      向量间夹角余弦值的计算公式如下:
     
     其中a,b表示向量, 圆点表示向量的点乘,|a|表示向量的模,或者说是向量的长度。

     通过一个例子来理解这个计算过程。
     假定在一个7个关键词的向量空间下,一个查询词的向量化为a(0,0,2,0,1,0,1),一个标题的向量化为b(0,1,3,5,2,4,0),夹角余弦计算方法如下:

     

      这样查询词a和文档b的相似性就转化为0.44这个具体的数值上,使相关性成为可以量化的概念。
      淘宝搜索系统即可通过相关性的判断,对标题进行分档排序,对于相关性分值高的标题予以加分。
      在实际计算中,如果向量a表示查询向量,向量b表示文档向量,在计算查询向量和一组文档向量的相似度时,查询向量总是不变的,或者说对于每个文档向量来说,查询向量都是相同的。因此相似度计算中是否除以|a|,对将来进行的相似度排序没有影响,可以作为公共因子消去。方法如下:
     
       其中每个文档向量的模都可以预先计算并保存,而不需要每次查询都执行一次文档向量的模运算。这样,每次求相似度只需要一次向量点乘和除法计算即可。
        对于丙个高维稀疏向量(由于汉词汇众多,实际向量化后的向量维数高,非0值少),向量的表示和向量点乘的计算也是需要一定技巧。可以采用哈希表的方法快速找到两个向量相同分量的非0值进行计算,这里不再详细展开。