面对海量的信息,我们很容易被淹没在信息的海洋中;当我们需要查找某个信息的时候,我们就会输入能够体现我们意图的关键字,搜索引擎会通过解析我们的关键字从而构造相应的查询表示方法;然后搜索引擎通过构造的查询在内存存储的文档集合中查找跟用户需求相关的文档,并根据相关度进行排序;以上搜索引擎进行计算的过程就是相关度计算,而其相关的理论基础就是检索模型;

用户输入的是关键字,搜索引擎输出的是相关文档,从关键字和相关性两个角度可以将文档集合分为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, 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}}
\]

公式中的分子是两个向量的点积,而分布是两个向量在欧式空间中的长度的乘积;通过公式我们也可以看到余弦相似性计算的是两个向量之间夹角的余弦值,所以两个向量夹角越小则越相似;

公式中的分母也是对计算结果的规范化;这是为了避免长文档得分过高的一种惩罚机制;通过同时可以看到对于同一个查询,包含同样关键字的长文档会使得分子更小,同时使得分母更大,从而导致相似性下降的更快,即存在过分抑制长文档的问题;例如两个长短差别比较大的文档都包含跟特定主体有关的词,虽然单词在两个文档出现的次数不同,但是在两个文档中出现的词频是相当的,此时公式中的分子不变,但是由于长文档包含的单词比较多,其长度会比较长,随意会导致计算值更小;如果从空间向量的角度考虑,共线的不同长度的向量,通过除以其长度编程单位向量,不管两个向量的长度差距多大,最终的单位向量必然相等,所以向量的长度越长,则抑制效果越明显;

三、TF-IDF模型

查询和文档转化为向量,这是就需要计算每个分词的权重,而特征权重的计算框架就是TF-IDF框架,其包含词频TF、逆文档频率IDF;

TF代表单词在文档中出现的次数,一般来说某个单词出现的次数越多则越能代表文档,其权重值应该越高;虽然可以直接使用单词在文档中出现的次数来计算,考虑到长短文档的影响,实际场景中使用的比较少;

一种词频计算公式如下,我们对单词出现的频数取log运算,这样可以抑制出现次数过多对计算结果的影响;同时为了避免单词出现一次导致结果为0,从而采用加1的平滑处理方案;

\[W_{TF} = 1 + \log(TF)
\]

另外一种单词词频的的计算公式如下,其中的a是调节因子,TF是单词实际出现的频数,而Max(TF)是文档中出现频数最多的单词的频数,通过两者相除进行规范化,计算得到每个单词的在文档内相对出现频数最高的单词的相对频数,从而避免长文档对词频的影响;

\[W_{TF} = a + (1-a) \times \frac {TF} {Max(TF)}
\]

词频衡量的是单词对包含自身文档的重要性,即对文档内容的表征能力,而逆文档词频反映的是单词对文档集合中文档的甄别能力;其计算公式如下,其中N代表文档集合中文档的总数,nk代表包含单词k的文档的数量;从公式可以看到nk越大,则IDF值越小,则对文档的甄别能力越差;

\[IDF_{k} = \log (\frac{N} {n_{k}})
\]

TF-IDF框架结合两种权重因子,一般将两者相乘计算分词权重值;

\[Weight_{word} = TF \times IDF
\]

从公式可以看到,如果对于某个文档来说,

如果某个分词在此文档中出现的词频很高,同时在集合中其他文档中很少出现,那么分词的权重就会很高;

如果某个单词在此文档中出现的词频很低,同时在集合中其他文档中出现的很多,那么分词的权重就会很低;

elasticsearch算法之搜索模型(一)的更多相关文章

  1. 文本相似度算法——空间向量模型的余弦算法和TF-IDF

    1.信息检索中的重要发明TF-IDF TF-IDF是一种统计方法,TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分 ...

  2. elasticsearch的rest搜索--- 查询

    目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 四. 查询 1. 查询的官网的文档   ...

  3. elasticsearch实现网站搜索

    使用elasticsearch 实现网站搜索,可以支持商品搜索,筛选项过滤搜索 ,价格排序, 打分 筛选项聚合,还有其他综合排序 后续推出搜索人工干预排序,根据销量,好评率,售卖率 进行全方位的搜索实 ...

  4. Python 和 Elasticsearch 构建简易搜索

    Python 和 Elasticsearch 构建简易搜索 作者:白宁超 2019年5月24日17:22:41 导读:件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正 ...

  5. CentOS 7.4 下搭建 Elasticsearch 6.3 搜索群集

    上个月 13 号,Elasticsearch 6.3 如约而至,该版本和以往版本相比,新增了很多新功能,其中最令人瞩目的莫过于集成了 X-Pack 模块.而在最新的 X-Pack 中 Elastics ...

  6. 笔记13:Python 和 Elasticsearch 构建简易搜索

    Python 和 Elasticsearch 构建简易搜索 1 ES基本介绍 概念介绍 Elasticsearch是一个基于Lucene库的搜索引擎.它提供了一个分布式.支持多租户的全文搜索引擎,它可 ...

  7. elasticsearch联想加搜索实例

    //搜索框具体的ajax如下: <form class="form-wrapper cf"> <img src="__PUBLIC__/Home/img ...

  8. 畅购商城(五):Elasticsearch实现商品搜索

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...

  9. Elasticsearch(2) 数据搜索

    本文介绍如何在Elasticsearch中对数据进行搜索. 1.简述 在Elasticsearch中的搜索中,有两类搜索: queries aggregations 区别在于:query可以进行全文搜 ...

随机推荐

  1. RBAC: K8s基于角色的权限控制

    文章目录 RBAC: K8s基于角色的权限控制 ServiceAccount.Role.RoleBinding Step 1:创建一个ServiceAccount,指定namespace Step 2 ...

  2. 使用idea时jsp中使用out.print();时报错的解决办法

    在用Maven创建web项目时 在jsp页面中out.print();老是报错 这边print显示红色出错因为这边使用的是JSP的API并不是Servlet的,但是可以运行,所以我们只要导包就完事其实 ...

  3. 【记录一个问题】cv::cuda::dft()比cv::dft()慢很多

    具体的profile调用图如下: 可以看见compute很快,但是构造函数很慢. nvidia官网看到几篇类似的帖子,但是没有讲明白怎么解决的: opencv上的参考文档:https://docs.o ...

  4. Windows系统安装和office版本兼容

    MSDN, I tell you 下载windows10系统各种纯净镜像.但是还是推荐使用官网修改参数显示出下载链接,下载windows10最新版. 在最近几次重做系统中,PE工具似乎无法识别从MSD ...

  5. centos7 service iptables save 报错

    解决办法: 1.systemctl stop firewalld 2.yum install iptables-services 3.systemctl  restart iptables 4.ser ...

  6. 002 Linux 文件与目录命令的必会姿势!

    01这些命令真的很重要吗? 文件及目录的路径切换.显示.创建.复制.移动和删除操作的常用姿势,必会!因为这些命令是使用 Linux 系统进行工作的基础,是摆脱小白的第一步,是构建大厦的基石! 发现锅锅 ...

  7. 「数据结构」Link-Cut Tree(LCT)

    #1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 ...

  8. python22day

    内容回顾 递归练习 sys os logging shutil 函数结束啦 今日内容 面向对象 楔子:做一个人狗大战的游戏 技能要有归属感,人是人,狗是狗,技能的函数要写在对应函数内部,闭包. 复杂的 ...

  9. python15day

    昨日回顾 装饰器:完美的呈现了开放封闭原则.本质:闭包. def wrapper(f): def inner(*args,**kwargs): '''在执行被装饰函数之前,想写什么代码写什么代码''' ...

  10. 合宙AIR105使用Keil MDK + DAP-Link 烧录和调试

    关于AIR105 AIR105是合宙LuatOS生态下的一款芯片, 1月初上市, 开发板与摄像头一起搭售(赠送). 从配置信息看, 芯片性能相当不错: Cortex-M4F内核, 最高频率204Mhz ...