文本索引与检索


本质上,非常多实际须要解决的问题归根究竟都是搜索问题 - 在某个空间中寻找特定的目标。

而, 文本检索又是当中最典型最基础的一种。文本检索之所以重要,也是由于非常多更复杂对象或者结构的检索能够转化为文本检索,或者參考利用文本检索的思想。

谈及文本检索。 各种各样的算法不一而足。

大体能够分成两类:

        1. 模式固定。文本不定

                这类算法的一个典型场景: 事先定义一些模式(比方说黄色关键词)。 对每个给定的文本。确定是否含有这些关键词

        2. 文本固定,模式不定

                这类算法的一个典型场景:已知网络上的网页库,给定一个字符串,寻找含有这些字符串的网页


不考虑进行文本检索。 对问题,使用直接的文本查找算法当然也能够完毕任务。但,这些直接暴力的方法,绝大多数情况都无法满足实际应用的需求。试想。假设搜索引擎在接收到每个用户的查询关键词之后。開始一个网页一个网页地查找,恐怕须要长年累月才干返回结果了。 提高文本检索的效率, 重点在于构造文本索引。一个好的文本索引能极大地提升检索效率。


关于第一类场景“模式固定, 文本不定”, 文本索引主要是针对模式。 事先对模式实现构建文本索引之后, 新来的查询文本能够进行高速扫描。 本质上,模式索引帮助我们规避无关模式的干扰,避免不必要的计算。 经常使用的算法有:

        1. 单模式 (仅仅有单一模式文本)

                KMP算法: http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

        2. 多模式

                AC(Aho-Corasick)算法 (事实上是KMP的升级版本号): http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm


关于第二类场景“文本固定,模式不定”,文本索引主要针对文本。

小到查找一个文档中包括的关键词。大到搜索引擎中的文本索引。

经常使用的算法有:

        1. 文本索引数据结构

                1.a TRIE树

                        http://en.wikipedia.org/wiki/Trie

                1.b Suffix Tree/Suffix Array

                        http://en.wikipedia.org/wiki/Suffix_tree

                        http://en.wikipedia.org/wiki/Suffix_array

        2. 倒排表索引。 眼下已经被广泛应用于绝大多数搜索引擎

                http://en.wikipedia.org/wiki/Inverted_index


大体上,似乎这些不同的文本索引都找到它们的“定位”。

Three Body 我也认为倒排表这种结构简直就是为大规模文本索引而生, 原本优美的Suffix Array仅仅能望“文本海洋”兴叹。 倒排表,对检索性能的提升让人赞叹, 只是也有一些不及Suffix Array的地方。

比方:

        1. 像中文类似的文本。假设要构建文本索引。首当其冲的问题是须要对中文文本进行分词,然后才干基于词语进行倒排索引

        2. 像生物基因系列的检索。文本的字符集非常小,普通的倒排表会出现倒排表的每一条倒排索引链非常长,检索效果退化。另外。基因系列也无法进行“分词”


怎么办?Compressed Suffix Array给我们带来了希望。Compressed Suffix Array在解决Suffix Array存储和搜索方面都有了长足的进展,已经在一些领域的全文检索系统中使用。

相比Suffix Array。 CSA使用了下面一些富有启示性的改进:

        1. 相比传统后缀数组中的SA[], 压缩后缀数组引入Successor数组 Psi[]。 Psi[i] = rSA[T[SA[i] + 1]] (当中 rSA[SA[i]] = i) Psi[] 数组的引入, 带来了数据压缩和索引检索上潜能;

        2. 有序系列的压缩算法 a. Delta-encoding; b. Quotienting with Elias-Fano

        3. 基于Psi数组和少量额外存储, 文本的检索能够脱离原始文本

        4. 压缩后缀数组能够进一步压缩,假设原始文本能够压缩


很多其它内容。推荐大家阅读:

        1. Compressed Suffix Array wiki: http://en.wikipedia.org/wiki/Compressed_suffix_array

        2. 浅显易懂的文章 A simple introduction to Compressed Suffix Array: http://www.cs.cmu.edu/~dga/csa.pdf


从后缀数组怎样进一步得到扩展和改进以适应更大规模数据的需求。除了得到很多其它索引算法设计方面的启示,还有两点深刻的感受:

        1. New wine in old bottles

            这已经一遍又一遍地在计算机发展中被验证。

一个“古老”的想法。在新的环境下,焕发了新的生命。

短时间内受挫的方法,在新的背景下,因为一些突破。又一次得到发展。 近来火爆的深度神经网络,不也是度过一段寒冬之后的再次重生嘛。

        2. 数组索引 (index of array)的潜力

            数组索引。在这里指指向数组元素的索引。如array[i]中的i。 一般数组的索引i仅仅是为了编号计数。或者是定义一种关系array[i] v.s array[j],  i vs j。CSA中的Psi[i]数组定义通过i跟SA数组建立起一种巧妙关系。 数组索引本身不构成内存消耗,假设能巧妙设计充分利用。 会在算法设计上有意外收获。

关于这点,是否存在理论上的指导呢?



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Public DNS (公共域名解析服务)

114DNS 服务IP:114.114.114.114, 114.114.115.115 拦截 钓鱼病毒木马网站:114.114.114.119, 114.114.115.119 拦截 色情网站:114.114.114.110, 114.114.115.110 DNSPod 服务IP:119.29.29.29 阿里DNS 服务IP:223.5.5.5,…

Android之BaseQuickAdapter(3.0.4版本)给子view添加点击事件(helper.addOnClickListener(view))的函数没了

1、问题 用BaseQuickAdapter给子view添加点击事件,以前都是在适配器里面这么写的helper.addOnClickListener(view),现在这个函数没了 2、解决办法 直接在适配器里面初始化调用 init {addChildClickViewIds(view)} 然后不要再给view在适配器里面setOnC…

使用开源工具 k8tz 优雅设置 Kubernetes Pod 时区

容器在主机的内核上运行,并获得时钟,但时区不是来自内核,而是来自用户空间。在大多数情况下,默认使用协调世界时 (UTC)。时区的不一致,会带来很多困扰。即使代码与时区无关,但容器日志与系统日志时间相关联…

Android WebView 在内部打开链接,捕获错误

webView.setWebViewClient(new WebViewClient() {Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;//ture为在webview中打开}});webView.setWebChromeClient(new WebChromeClient() {Overridepublic void onReceiv…

04 tp6 的查数据 find、select、findOrEmpty、findOrFail、toArray、selectOrFail、value、column《ThinkPHP6 入门到电商实战》

文章目录(更新中…) 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

学生信息管理系统小结

ASP.NETAccess 一、登入部分 主界面 Fm new 主界面(); string s1 "ProviderMicrosoft.Jet.OLEDB.4.0;Data Sourcestudent.mdb"; string s2 "select*from 登录信息表 where 用户名" this.ttbName.Text " and 密码 "…

ArcGIS实验教程——实验三十:地图注记与标注(标注转注记)用法案例详解

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 实验目录 一、实验描述二、地图标注1. 标注工具2. 标注属性默认设置3. 标注分类4. 多属性字段标注5. 标注转换6. 显示地图提示三、地图文档注记1. 注记组2. 创建地图文档注记3. 编辑地图文档注记一…

Android之实现多桌面图标app入口进入不同的页面,像2个独立运行的app一样,互不干扰。

1、需求 Android实现2个图标app入口进入不同的页面,一个图标点击进去主app页面,一个图标点击直接进入app页面的里面一个子页面,两个图标功能点击效果独立,不能乱跳,副桌面图标然后返回也是直接返回,不能先返回到本地,就是感觉像2个独立运行的app一样,互不干扰。 问题:…

启动obiee

启动obiee:1.启动数据库第一步:打开Oracle监听$ lsnrctl start第二步:使用sysdab角色登录sqlplussqlplus / as sysdba第三步:启动数据库SQL> startup 2.启动WebLogic:nohup /home/oracle/obiee11g/user_projects/domains/bifou…

ASP.NET中IsPostBack详解

1、IsPostBack介绍Page.IsPostBack是一个标志:当前请求是否第一次打开。 调用方法为:Page.IsPostBack或者IsPostBack或者this.IsPostBack或者this.Page.IsPostBack,它们都等价。  1)当通过IE的地址栏等方式打开一个URL时是第一次打开, 当通…

05 tp6 的数据添加 助手函数、 save、insert、strict、replace、insertGetId、insertAll《ThinkPHP6 入门到电商实战》

文章目录(更新中…) 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

利用bat修复office文件图标

如果电脑上安装了office,再安装wps,卸载wps后office文件图标会丢失。利用下边的代码,另存为bat文件,运行后可以快速修复图标问题。 rem 修复office文件默认图标.bat:: office图标文件路径,请根据自己电脑上的安装目录设…

VS2019如何创建C++项目?没有找到空项目(C++)完全解决方案

在使用Visual Studio 2019创建C++空项目时,没有空白项目可选,如下图所示,原因是在安装VS2019时没有选择C++对应的模块。本文讲解如何使用VS2019创建C++空项目,并使用C语言输出Hello World。 运行Visual Studio Installer,点击【修改】。 勾选【使用C++的桌面开发】,点击…

CentOS7.2 忘记root密码解决

CentOS 7 root密码的重置方式和CentOS 6完全不一样,以进入单用户模式修改root密码为例。 1.重启开机按esc,在第一行按e,进行编辑 2.编辑修改两处:ro改为rw,在LANGen_US.UFT-8后面添加init/bin/sh 3.按CtrlX重启,并修改…

Android之解决NestedScrollView嵌套RecyclerView部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部

1、问题 NestedScrollView嵌套Recyclerview部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部 部分布局大致如下 <androidx.core.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent…

词法分析程序的功能

词法分析程序的功能其实就是对所输入的字段进行词法分析任务&#xff0c;对用户的源程序从左到右进行扫描&#xff0c;按照语言的词法规则识别各类单词&#xff0c;并产生相应单词的属性字&#xff0c;并随之显现出来&#xff0c;成为词法分析程序的功能 转载于:https://www.cn…

android:制作 Nine-Patch 图片

它是一种被特殊处理过的 png 图片&#xff0c;能够指定哪些区域可以被拉伸而 哪些区域不可以。 那么 Nine-Patch 图片到底有什么实际作用呢&#xff1f;我们还是通过一个例子来看一下吧。比如 说项目中有一张气泡样式的图片 message_left.png&#xff0c;如图 3.38 所示。 图 …

08 获取器 withAttr、多连缀、whereRaw、事务、数据集《ThinkPHP6 入门到电商实战》

知识点&#xff1a;获取器 withAttr、多连缀、whereRaw、事务、数据集 文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商…

Chrome 双击关闭标签,新窗口打开新地址,一个插件搞定,安装方便,自带hosts

对&#xff0c;没错&#xff0c;就这它&#xff1a; 下载地址&#xff1a;https://shuax.com/project/greenchrome/ 一、插件安装 下载后&#xff0c;将下载的压缩包解压&#xff0c;根据自己Chreom浏览器是32位还是64位找到对应的 winmm.dll 文件&#xff0c;复制到Chome安装…

【ArcGIS遇上Python】从入门到精通系列之第二章:ArcGIS Python基本语法基础速递

Python的语法和其它编程语言的语法有所不同,编写Python程序之前需要对语法有所了解,才能编写规范的Python程序。本篇介绍Python标识符的同时,也讨论了Python变量的声明和赋值。通过本章的学习,将对python的数据类型、操作符、变量与赋值、代码块及缩进对齐、控制结构、函数…