前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入拆解'搜索引擎'实现原理三:搜索索引

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

作者头像
浩说编程
发布2021-09-10 15:56:25
3920
发布2021-09-10 15:56:25
举报
文章被收录于专栏:Java经验之谈Java经验之谈

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

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

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

可以看到匹配结果数高达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。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在得到了文档中不同词汇的权重之后,我们需要将得到的数据生成向量空间模型,用来做相关度比较。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档