面对海量的信息,我们很容易被淹没在信息的海洋中;当我们需要查找某个信息的时候,我们就会输入能够体现我们意图的关键字,搜索引擎会通过解析我们的关键字从而构造相应的查询表示方法;然后搜索引擎通过构造的查询在内存存储的文档集合中查找跟用户需求相关的文档,并根据相关度进行排序;以上搜索引擎进行计算的过程就是相关度计算,而其相关的理论基础就是检索模型;
用户输入的是关键字,搜索引擎输出的是相关文档,从关键字和相关性两个角度可以将文档集合分为4个子集;检索模型要解决的就是尽量包含并提升set1、set3的排序;目前主流的的搜索模型主要处理的是包含关键字的set1、set2,而基本上不会涉及set3;
相关文档 | 不相关文档 | |
---|---|---|
包含关键字 | set1 | set2 |
不包含关键字 | set3 | set4 |
需要注意的一点,我们这里有一个隐含的假设条件,就是用户数据的关键字可以充分体现用户的需求,考虑到自然语言的复杂多变,如果关键字不能精确的代表用户的需求,即使再优秀的检索模型也无济于事;
一、布尔模型
基于集合论的布尔模型使用单词集合来表示文档和用户的查询,并通过布尔表达式来计算两者的相似性;
用户通过与、或、非来构建逻辑表达式作为自己的查询需求;例如我们要查询包含elasticsearch和包含lucene或者kibana的文档;
elasticsearch and (lucene or kibana)
如果搜索引擎中有5个文档,同时每个文档包含三个关键字的情况如下
通过文档矩阵可以看到包含elasticsearch的有d1、d3、d5;
通过文档矩阵可以看到包含lucene或者kibana的文档有d1、d2、d4、d5;
对以上两个条件命中的记录计算交集得到d1、d5;
d1 | d2 | d3 | d4 | d5 | |
---|---|---|---|---|---|
elasticsearch | Y | Y | Y | ||
lucene | Y | Y | Y | ||
kibana | Y | Y | Y |
布尔模型虽然比较简单直观,但是由于其输出结果的二元性,无法细致的计算文档的相关性,自然无法对粗糙的搜索结果进行排序;
二、向量空间模型
向量空间模型是一种历史悠久的文档表示和相关性计算模型;其将文档看做有众多分词组成的多维向量,同时会根据一定的规则计算每个维度的权重;
例如有三个由elasticsearch、lucene、kibana组成的文档,elasticsearch在d1中的权重为我w11,lucene在d1中的权重为w12,kibana在d1中的权重为d13,所以d1可以使用向量(w11,w12,w13)来表示;
elasticsearch | lucene | kibana | |
---|---|---|---|
d1 | w11 | w12 | w13 |
d2 | w21 | w22 | w23 |
d3 | w31 | w32 | w33 |
实际的搜索场景中,除了要搜索的文档可以向量化,用户输入的查询关键字也可以向量化,从而将用户的搜索查询转化为计算查询和文档的内容相似性计算;Cosine相似性是最常用的也是非常有效的计算相似性的方式,我们可以通过如下公式计算用户查询Q和文档Di相似性
Cosine(Q,Di)=∑j=1twij×qj∑j=1twij2×∑j=1tqj2 Cosine(Q, D_i) = \frac {\sum_{j=1}^{t} w_{ij} \times q_{j} } {\sqrt{\sum_{j=1}^{t} w_{ij}^2 \times \sum_{j=1}^t} q_{j}^{2}} Cosine(Q,Di)=∑