《信息检索导论》第三章总结
一、Hash Table和Search Tree
实现dictionary的方法主要有哈希表和搜索树(二叉树、B树、AVL树);
实现哈希表的dictionary的优点:
(1)查询效率O(1);
缺点:
(1)哈希冲突。
(2)不支持模糊查询。
(3)哈希函数需要不断变化以适应需求。
实现搜索树的dictionary的优点:
(1)支持模糊查询。
缺点:
(1)查询效率相对较慢。
(2)树要保持平衡。
二、单个通配符查询
1.尾通配符查询
比如abc*,即通配符出现在尾部的查询就是尾通配符查询,这种查询使用搜索树可以完成,方法就是以a,b,c的顺序遍历树。如下图所示:
如果要查询ab*,则
(1)比较根节点:因为a在a-m中,所以往左走。
(2)因为ab在a-hu之间,因此往左走。
(3)剩下的子节点就是满足要求的结果,遍历并取得他们的posting即可。
2.头通配符查询
如果要进行头通配符查询,则需要引入反向B tree的概念。反向B tree是把B tree查询的顺序反过来。比如要查询*cba,则查询顺序为a,b,c,举例:
查询*ba的步骤:
(1)比较根节点,因为a在a-m之间,则往左走。
(2)因为ba在aa-uh之间,因此往左走。
因此下面的子节点就是满足条件的结果。
3.一般通配符查询
比如abc*cba,只需要分解成abc*和*cba,并分别运用1,2的知识即可。但要注意查询出的结果必须在abc*cba中过滤一遍。因为比如abcba满足abc*和*cba,但是却不满足abc*cba;
三、专用于通配符查询的索引结构
1.permuterm index
方法:$表示一个词的末尾(正则),即如果ab,则表示成ab$,并进行轮排,形成ab$,$ab,b$a,并指向ab;
在处理单个通配符查询时,如果要查*b,则先添上$,然后旋转,使得*在词的尾端,即b$*,并在搜索树中查找。发现b$a满足要求,则ab满足要求。
在处理多个通配符查询时,如果要查询a*b*,则先添加$即a*b*$,然后旋转为$a*b*,先查询$a*,取得的结果再通过a*b*过滤即可。
缺点:词典会变得很大。
2.K-GRAM index
K-GRAM的定义:k个连续的字母的组合,在第二十章中会讲到k-shingle,意思是k个连续单词的组合。
比如:hello的3-gram是:hel,ell,llo;
索引结构:
k-gram index的dictionary是所有词的k-gram的集合。
k-gram index的posting是匹配k-gram的单词序列。
索引规则:
在建索引之前必须在单词首尾添加$;再进行k-gram indexing;
查询方法:
举例:查找com*;利用3-gram 索引
(0)添加$,即$com*$; 如果是2-gram,则是$c , co , om
(1)先通过3-gram index进行查找匹配的单词;
(2)因为3-gram index查找出的结果并不精确(比如coordcom,匹配$co,com,却不能匹配$com*),因此需要在$com*进行过滤,才能得出结果。
总结:k-gram索引的速度非常慢;因为需要先对k-gram索引取得单词(原本的单层索引变成了两层索引),再进行一次过滤,才能进入普通的倒排索引中查找docID;
而轮排索引不需要后过滤,但是空间消耗很大;
四、拼音校验方法
主要原则:先找邻近度大的词,如果邻近度相同,则找常用词;
1.编辑距离
通过动态规划的方法,把两个单词看成二维矩阵,进行计算。
比如PARIS 和 ALICE
注意:编辑距离有个缺点,就是如果要让查询和每个term计算编辑距离,则效率太差,因为在倒排索引的dictionary中有几千万个term;
2.利用k-gram计算Jaccard系数
Jaccard系数:给定集合A和B,J=(AB)/(A+B-AB);
假设A和B是两个单词,长度为m和n,因此A和B分别有m-1个和n-1个k-gram;
给定一个查询Q,计算出Q所对应的k-gram后,即可对k-gram索引遍历,对每个单词和Q计算Jaccard系数,AB可以理解为有多少个k-gram重叠,而A+B-AB可以理解为合并后一共有多少k-gram(通过A和B的k-gram长度和 减去AB的k-gram overlap的数量),并取得Jaccard系数高出阈值的单词。
总结:可以先进行k-gram索引,然后再进行编辑距离的计算。
当然以上只是适用于单独单词的拼写错误,如果类似于I are happy.这种查询,就检测不出错误,因为单独的单词都是对的。
检测方法:当进行查询后返回的结果很少,则对查询词组有所怀疑,则会对每个单词进行替换,使得找出返回结果多的词组。
3.语音校验
通过把发音类似的单词放在同一个组(通过语音哈希函数),称为soundex算法。
转载于:https://www.cnblogs.com/xiazdong/archive/2012/01/06/3058357.html
《信息检索导论》第三章总结相关推荐
- 软件工程导论第三章复习总结附思维导图
软件工程导论第三章复习总结附思维导图 概述 准确回答"系统必须做什么" 必须理解并描述问题的信息域,根据这条准则应该建立数据模型 必须定义软件应该完成的功能,这条准则要求建立功能模 ...
- 信息技术导论 第三章 移动互联网技术 笔记
第三章 移动互联网技术 3.1 移动互联网概述 3.1.1 移动互联网的基本概念 移动互联网是PC互联网发展的必然产物,将移动通信和互联网二者结合起来,成为一体.它是互联网的技术.平台.商业模 ...
- 【算法基础】数据结构导论第三章-栈、队列和数组.pptx
上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 本文参考百度文库的多篇文章. 如需下载ppt文件,请回复"sjjg3" ...
- 中国大学MOOC 人工智能导论第三章测试
1 单选(2.5分) 以下关于正向推理的说法正确的是 得分/总分 A. 正向推理以某个假设目标作为出发点 B. "如果P->Q为真,但Q不成立,则P也不成立"是假言推理 C. ...
- 工程电磁场导论第三章总结
写在前面:先向大家提一下旋度和散度的概念: 再提一下高斯散度定理和斯托克斯散度定理: 高斯散度定理: 斯托克斯公式: 目录
- 【算法基础】数据结构导论第七章-排序.pptx
上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 数据结构导论第三章-栈.队列和数组 数据结构导论第四章-树 数据结构导论第五章-图 数据结构 ...
- 【算法基础】数据结构导论第六章-查找.pptx
上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 数据结构导论第三章-栈.队列和数组 数据结构导论第四章-树 数据结构导论第五章-图 本文参考 ...
- 【算法基础】数据结构导论第五章-图.pptx
上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 数据结构导论第三章-栈.队列和数组 数据结构导论第四章-树 本文参考百度文库的多篇文章. 如 ...
- 【算法基础】数据结构导论第四章-树.pptx
上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 数据结构导论第三章-栈.队列和数组 本文参考百度文库的多篇文章. 如需下载ppt文件,请在本 ...
- 《算法导论》学习总结 — 2.第一章 第二章 第三章
上一篇:http://www.cnblogs.com/tanky_woo/archive/2011/04/09/2010263.html 前三章基本没什么内容,所以合在一起总结. 第一章: 讲了算法( ...
最新文章
- 搭建B2B2C多用户商城系统需要注意的事项
- 交叉科学部如何建?基金委:要做好这4点
- php 昨天开始时间_php日期处理显示:昨天、今天、本周、上一月等时间结点数据...
- Kafka无消息丢失配置
- WHEN OVERSEAS
- 牛逼站是怎样炼成的?-推荐系统篇
- B12-UIAlertController(NS_CLASS_AVAILABLE_IOS(8_0))。
- mysql 权重 取值_mysql如何按权重查询数据啊?
- android纹理存储,Android:OpenGL存储纹理多长时间?
- 两款网站页面翻译插件
- 若依框架前端问题总结
- stm32f4c语言编程,如何使用STM32F4的DSP库
- k8s系列03-kubeadm部署calico网络的k8s集群
- 我的梦想是成为一名计算机程序员英语怎么说,I dream of becoming a programmer in the future 我梦想将来当一名程序员...
- Simotion应用与组网之一安装篇
- 湖南大学计算机专业推免生,湖南大学2018年招收推荐免试攻读研究生简章
- 支付宝服务商模式支付
- BUG之母——美国海军首位女少将传奇
- python如何提取数据中的年月_Python数据处理笔记——Pandas时间数据提取处理
- one-hot编码例子介绍
热门文章
- 浅析企业网站软文效果是如何展现的?
- 计算机课程成绩表排名怎么算,微机原课程设计学生成绩名次表设计.doc
- vue 判断是否位 float_VUE中条件注释法css,判断ie浏览器
- jfinal怎么连接oracle,如何用Jfinal连接多个数据库
- 空指针 java调用_java-变量引用与重复性get调用以避免空指针
- python实验室怎么样_Python 有什么不为人知的坑?
- Golang开发环境搭建-Vim篇
- php json_decode \ 反斜杠 转义 问题
- JS中有两种自加法操作
- 配置ANDROID_HOME