转载

深入拆解'搜索引擎'实现原理三:搜索索引

作者 | 浩说编程
来源 | 公众号:浩说编程
[  用"内容"服务读者 | 让"代码"服务大众  ]


    通过上一篇文章我们了解了‘‘搜索引擎’’是如何创建索引

    于是通过索引便可以实现快速匹配搜索的内容。

    拿百度为例,我们试着搜索'微信公众平台'

深入拆解'搜索引擎'实现原理三:搜索索引

    可以看到匹配结果数高达1000000000个,虽然匹配数量惊人,但百度很智能的将相关度最高的微信公众平台官网排到了首位。

    那么这种按照相关度排序是如何实现的呢?

    带着这个问题我们来拆解‘搜索引擎’的最后一环:搜索索引


01 | 关系判断

    既然需要排序,那势必要分析这些匹配结果的关系,经过互相比较之后给出相关度的打分,然后得到排序结果。

    但如何分析文档之间的关系呢?

    我们先看两个简单的例子:

    分析人与人之间的关系

    首先 看一个人,往往有很多要素 ,如性格,信仰,爱好,衣着,高矮,胖瘦等等。

    其次 对于人与人之间的关系,不同的要素重要性不同 ,性格,信仰,爱好可能重要些,衣着,高矮,胖瘦可能就不那么重要了,所以具有相同或相似性格,信仰,爱好的人比较容易成为好的朋友,然而衣着,高矮,胖瘦不同的人,也可以成为好的朋友。

    因而判断人与人之间的关系,首先要找出哪些要素对人与人之间的关系最重要 ,比如性格,信仰,爱好。

    其次要判断两个人的这些要素之间的关系 ,比如一个人性格开朗,另一个人性格外向,一个人信仰佛教,另一个信仰上帝,一个人爱好打篮球,另一个爱好踢足球。

    我们发现,两个人在性格方面都很积极,信仰方面都很善良,爱好方面都爱运动,因而两个人关系应该会很好。


    我们再来看看公司之间的关系吧

        首先 看一个公司,有很多人组成,如总经理,经理,首席技术官,普通员工,保安,门卫等。

        其次对于公司与公司之间的关系,不同的人重要性不同 ,总经理,经理,首席技术官可能更重要一些,普通员工,保安,门卫可能较不重要一点。

        所以如果两个公司总经理,经理,首席技术官之间关系比较好,两个公司容易有比较好的关系。

        然而一位普通员工就算与另一家公司的一位普通员工有血海深仇,怕也难影响两个公司之间的关系。

        因而判断公司与公司之间的关系,首先要找出哪些人对公司与公司之间的关系最重要 ,比如总经理,经理,首席技术官。

        其次要判断这些人之间的关系 ,比如两家公司的总经理曾经是同学,经理是老乡,首席技术官曾是创业伙伴。

        我们发现,两家公司无论总经理,经理,首席技术官,关系都很好,因而两家公司关系应该会很好。

    通过这两个例子我们可以提取出判断'关系'的两个要点:

  1. 提取影响关系的关键属性
  2. 判断关键属性的相关度


    这两个要点就构成了我们判断文档关系的思路: 

    1. 计算权重(提取影响关系的关键属性)

  • 找出词(Term) 对文档的重要性的过程称为计算词的权重(Term weight) 的过程。
  • 词的权重(Term weight)表示此词(Term)在此文档中的重要程度,越重要的词(Term)有越大的权重(Term weight),因而在计算文档之间的相关性中将发挥更大的作用。

    2. 向量空间模型算法(判断关键属性的相关度)


02 | 计算权重

    权重需要从两个维度判断:

  • 该词汇在文档中出现的频次,频次越高,说明越重要。
  • 有多少文档包含该词汇,文档数越多,说明越不重要。

    我们打个比方,像'搜索'这个词汇,在本文中出现的频率很高,满足上面的第一个维度。

    反观另一个词汇‘‘我们’’在本文出现的频率依然很高,一样满足第一个维度,但它同样重要吗?

    这就要看第二个维度,‘我们’这个词汇有太多文档包含,所以权重并不高,不构成影响文档关系的重要词汇。

    道理明白了,我们来看一下计算公式:

深入拆解'搜索引擎'实现原理三:搜索索引

深入拆解'搜索引擎'实现原理三:搜索索引

    这仅仅只term weight计算公式的简单典型实现。实现全文检索系统的人会有自己的实现,Lucene就与此稍有不同。


03 | 向量空间模型算法

    在得到了文档中不同词汇的权重之后,我们需要将得到的数据生成向量空间模型,用来做相关度比较。

    把所有此文档中词(term)的权重(term weight) 看作一个向量:

    Document = {term1, term2, …… ,term N}

    Document Vector = {weight1, weight2, …… ,weight N}

    同样我们把搜索语句看作一个简单的文档,也用向量来表示:

    Query = {term1, term 2, …… , term N}

    Query Vector = {weight1, weight2, …… , weight N}

    我们把所有搜索出的文档向量及搜索向量放到一个N维空间中,每个词(term)是一维。

深入拆解'搜索引擎'实现原理三:搜索索引

    两个向量之间的夹角越小,相关性越大。

    所以我们计算夹角的余弦值作为相关性的打分,夹角越小,余弦值越大,打分越高,相关性越大。

    有人可能会问,搜索语句一般是很短的,包含的词(Term)是很少的,因而查询向量的维数很小,而文档很长,包含词(Term)很多,文档向量维数很大。

    你的图中两者维数怎么都是N呢?

    在这里,既然要放到相同的向量空间,自然维数是相同的,不同时,取二者的并集,如果不含某个词(Term)时,则权重(Term Weight)为0。

    以上就是搜索索引的过程,今天的内容涉及数学方面的计算公式,比较枯燥,需要一些耐心理解。

    到这里关于‘搜索引擎’的内容就大致结束了,当然这也只是其中的一部分,感兴趣的朋友可以自行深入挖掘更多内容。

正文到此结束
本文目录