• 文本索引与检索



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

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

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

    大体能够分成两类:

            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数组建立起一种巧妙关系。 数组索引本身不构成内存消耗,假设能巧妙设计充分利用。 会在算法设计上有意外收获。

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



  • 相关阅读:
    财务报表分析(张新民教授)-第十一章 企业前景分析
    React中的状态提升
    React中的表单处理
    es6的箭头函数
    React中,通过改变组件的状态来改变页面的内容
    移动端页面的适配
    html5项目的注意事项
    关于argument、this、argument的callee属性、apply()方法和call()方法
    lazyload 图片延迟加载
    jquery UI datepicker汉化
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5112194.html
Copyright © 2020-2023  润新知