全文检索系统论文

全文检索系统论文
全文检索系统论文

摘要

中文全文检索系统是信息产业中发展较快的一个领域,而一个中文检索系统的核心就是索引器,本文介绍了索引器构造的不同算法模型,对相关的技术进行了比较,分析了各自的优缺点和实现难点,提出了一种中文全文检索中索引实现的数据结构和新型的算法模型。

本文首先综述了中文全文检索中索引构造的相关技术,主要包括索引文件数据结构、索引单位选取和索引压缩算法。

在上述综述的基础上,本文采用了基于单字的倒排表文件格式和可变字节编码压缩技术实现了整个索引系统。该系统包括三方面的功能分别是:文本预处理、索引创建和索引更新。在文本预处理部分实现了中文、外文和特殊字符的分离,同时实现了停止词(stopword)的删除。

在索引创建部分本文首先给出了一种基于传统倒排表的索引创建算法——合并排序式索引创建算法,该算法需要源文本10倍大小的临时空间。为了解决合并排序式索引创建算法临时空间过大的问题,本文提出了一种新的索引创建方案,该方案采用分级的倒排表索引组织结构和链式顺序混合存储的方式。它不仅不需要额外的临时空间,而且还提高了索引创建的效率。在索引创建的过程中本系统采用了可变字节编码压缩技术对索引进行压缩,实验表明该压缩算法将索引文件大小减少了20-30%。

在索引更新部分本文提出了三种顺序存储方式下准动态的索引更新策略,一种链式存储格式下索引动态更新的算法。该系统采用的链式存储结构下的索引更新算法复杂度达到了O(n)。

关键词:中文全文检索;索引器;倒排表;索引压缩

ABSTRACT

Chinese Full-Text Retrieval System is one of the fast developing fields in information industry , and the core of the Chinese retrieval system is the Index device. The paper analyzes several different algorithms of constructing the index device, and compares the related techniques, and then gives the advantages and disadvantages of each and the difficulty of achieving. Fnially this paper gives the data structure and a new algorithm model of The index in full-text retrieval system..

This paper first summarizes the related techniques of index constructing in Chinese Full-Text Retrieval, mainly includes data structure of document indexing, index compression algorithms.

The further way, this paper implements the entire index system using the setechniques, such as character based-on Inverted lists and the variable byte coding compression algorithm. This system includes three functions respectively is:Text pretreatment, index foundation and index up dating.

In the part of text pretreatment, has realized separation of Chinese, foreign and the Special character, and has realized deletion of "stopword".

In the part of index foundation, produces one kind index foundation algorithm based on traditional Inverted Lists——Sort-Merge method. This algorithm needs the 10 time of sizes for temporary spaces than the source text. Inorder to solve the problem of oversized temporary space in above algorithms, this paper proposed a new index foundation plan. The index organizational structure of this plan is improved Inverted lists, and its memory way is mix of chain ando rder. It not only does not need the extra temporary space, but also enhances the efficiency of index founding. In the process of index founding, using the invariable byte code compression technology to carry on the Compression of index, the experiment tindicates this compression algorithm reduced the size of index document 20-30%.

In the part of index renewal,this paper proposed three dynamic index updating strategies based on order memory, and a kind of index dynamic updating algorithm based on chain memory. The experiment indicates that index renewal algorithm complex has achieves O(n) based on chain memory.

KEYWORDS:Chinese Full-Text Retrieval;Index device;Inverted Lists;index

引言

1.1研究背景

在信息时代产生了大量数字信息,其中文本信息是最基本和常用的形式,为了能在海量的文本信息中找到自己的所需,人们迫切需要一个高效的检索工具。怎样高效的存储和查询文本这种非结构数据,就是一个颇值得研究的问题。这其中以全文检索技术成为国内外学者研究的热点。

全文检索(Full-text Retrieval)是以文本数据为主要处理对象,基于全文标引,使用自然语言进行检索的技术。在信息检索领域,全文检索一直是一个比较复杂的问题.与普通数据库检索所设计的结构化数据查询不同,全文检索不仅要查询结构化数据,而且还要查询非结构化数据,比起标引检索来,全文检索提供了全新的,强大的检索功能,方便多角度、多侧面的综合利用信息资源。当今以全文检索为核心技术的搜索引擎已成为网络时代的主流技术之一。

在文本检索中,为了满足一定的查询性能要求一响应时间(Response Time)和系统吞吐量(Throughput),词表和文档元数据的存储要有良好的设计,文献就检索效率问题作了详细的论述.文本检索有几种主要建索引的模型:倒排表、正排表、后继数组模型、互关联后继数组模型等,其中倒排表是最常用的,它的存储设计也是文本检索中的基本问题之一。目前很多主流的全文检索系统用自设计的文件来存储倒排文件,比如易宝北信TRS。当倒排文件比较大时,就要考虑压缩。压缩在大规模文本索引时尤其重要,目前比较流行的压缩算法有以下几种:按位紧凑压缩法、可变字节编码、Elias gamma coding、Golomb coding等。压缩算法的好坏不能只用其压缩率来衡量,在考虑到压缩率的同时也要考虑到解压所用的时间。

国外的全文检索软件虽然较早地得到应用,但对中国用户有很多不适用的地方。中文全文检索技术在原理上同西文全文检索是一致的,但汉语本身的特点使中文系统的实现比西文系统更为复杂。全文检索的核心技术是将源文档中的所有的基本元素的出现信息记录到索引库中fill.在中文系统中,基本元素可以是单个汉字字符,也可以是词。因此存在两种基本的索引库结构,即基于字表的索引库和基于词表的索引库。字表法和词表法各有优缺点.国内学者对此都各有侧重研究,前者实用性很强,构建直观方便,纵观近几年单汉字标引和检索技术的发展,其发展趋势可归结到两点:一是在单汉字标引和检索技术中引入受控标引和检索的技术和思想;二是引入人工智能技术。检索方面,比较实用的是“首字直接匹配法”,词表法多集中在中文自动分词研究,自然语料统计分析等方面。

1.2 索引在中文检索中的位置及研究现状

全文检索是指计算机索引程序通过扫描文章中的每一个词,给每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

在上段全文检索的叙述中提到了索引,为什么要建立索引?索引对于全文检索到底意味这什么?在Otis Gospodnetic和Erik Hatcher的lucene in action一文中提到“在搜索引擎的所有概念中最为核心的概念就是索引,索引就是把原始的数据处理成一个有利于高效检索的数据形式。”他们就为什么要进行索引给出了具体和形象的说明:“假如你需要在很大量的文中进行某个特定信息的检索,并且你想在非常短的时间内找到含有需要信息的文件,你会怎样写程序实现这些?最简单的方法是顺序扫描所有的文件寻找给定词和短语,但这种方式有一些缺点,其中最致命的是当文件很大时根本没有足够的空间来存储该文件,这就是为什么需要索引了,为了在大量文本中检索到所需要的信息,首先必须把源文本集转换成一另一格式的文件,这种格式的文件能够让你进行快速的检索,而不是只进行很慢的顺序扫描。”这个转化的过程就是索引化,该过程输出的结果就是“索引气在上文中可以知道索引是全文

检索的“心脏气下面的全文检索的模型结构图能够清晰的说明索引在全文检索中的地位。

下图即为全文检索的模型结构图:

图1-1全文检索结构模型图

全文检索系统是按照全文检索理论建立起来的用来提供全文检索服务的软件系统,一般来说,全文检索要具有建立索引和提供查询的功能。从上图中可以看出,全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个检索引擎之上。在检索引擎中可以看出索引引擎占据了核心的位置,他是整个检索效率的重要决定因素,一个全文检索应用的优异程度,根本上由全文检索引擎来决定。而全文检索的效率主要是由一个索引引擎所决定的。

1.3本文论文安排

鉴于上文的分析,知道一个优秀的索引引擎对于全文检索非常重要。本文的主旨就是建立一个全文检索的索引系统。本文主要的工作安排如下:

第二章主要阐述了基于中文全文检索索引器的功能。同时给出了通用索引器的组织结构图:一个索引器应该包文本预处理模块,创建索引模块以及索引维护模块。

第三章论述了中文全文检索索引所设计的主要技术问题。主要有索引文件结构的选择,索引元的选取以及索引压缩算法的比较分析等。同时给出了基于字和基于词的索引器优缺点的比较。

第四章中给出了基于单字的中文全文检索的索引器的设计方案和实现过程,其中包括索引文档的创建,索引文档的动态更新和删除以及索引压缩算法的实现。

第五章索引压缩算法测试结果以及索引创建效率分析。

第六章是小节篇,总结了本文所做的工作,找到了不足之处,给出了下一步工作的方向。

2中文全文检索中的索引器的结构和功能

2.1全文检索索引器的结构

在下图中可以看出一个索引器有三部分组成,第一部分是文本预处理模块,在该模块中针对给出的待索引的文本进行预处理,然后对经过处理的文本进行索引的建立,在索引建立后由于待查文档的改变要对索引尽心维护。索引维护主要涉及的问题是:源文档增加时将新的索引附加到原来的索引上,当源文档改变时,将其相对应的索引文件更新,但某些文档不在需要时,也要将其相对应的索引文件删除。

具体的结构图见图2-1:

图2-1索引器结构图

2.2 全文检索索引器的基本功能

一个中文全文检索的索引器应该实现三部分的功能。第一部分是文本预处理,一般需要检索的文档成分比较复杂,需要用文本预处理将文档中的中文,数字,符号,以及西文分开并归类然后分别对其建立索引。由于中文语言的复杂性[ (见 3.3.3节分词技术说明)在预处理这部分需要包括中文索引单位的选取,目前主流的有两类:一类是单字,一类是分词。

第二部分功能是创建索引,利用选定的索引数据结构对源文档遍历建立索引。

第三部分功能是实现索引的维护,包括索引删除,索引增加,索引更新。

3中文全文检索索引器构造相关技术综述

一个完整的中文全文检索的索引器的构造涉及到索引数据结构的选取,索引单位的选定,以及整个索引器的结构,索引采用的策略,以及有关索引压缩算法的研究。在本章中介绍了索引数据结构以及其相关的工作原理,分析了一种基于单字的索引器的构造及工作原理以及基于分词技术的索引的构造方案,在最后的一小章中介绍了一些主流的压缩技术,并给出了这些技术与索引的结合应用。

3.1索引数据结构及其相关原理

索引文件有多种组织形式,其中以正排表、到排表以及后继数组比较常用。下面分别

介绍正排表、倒排表以及后继数组的结构和工作原理。

3.1.1正排表的数据结构和其工作原理

正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。正排表结构如图3-1所示,这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档假如,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对因的索引信息,将其直接删除。但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。

由于正排表的工作原理非常的简单,但是由于其检索效率太低,几乎没有什么实用价值,所以在此不作详细介绍。

图3-1正排表结构图

3.1.2倒排表的数据结构和工作原理

倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,效率相对低一些,不会影响整个搜索引擎的效率。倒排表的结构图如图3-2:

图3一倒排表结构图

倒排表的索引信息保存的是字或词条在文档内的位置,在同一篇文档内相邻的字或词条的前后关系没有被保存到索引文件内。下面给出一个传统的基于单字的中文全文检索数据结构和算法模型进行分析说明。

全文检索方案是在执行检索操作时比较字或词条在同一文档内的位置是否相邻的算法方案。在此为了说明倒排表的工作原理,采用一个全文检索方案加以说明。

倒排表实际上就是一个表结构,在对关键词进行检索时需要对关键词中每个字在倒排表中进行一次检索操作,假设我们要对key这个关键词进行全文检索,key如定义3-1所示: 定义3-1:Key={C l,C2,C3...C n}n=123......

Key是n个字符的集合,它们的前后位置关系是固定的,S(C i)为包含字符C i的索引信息二元组Duali的集合,二元组中第一个数字为文档标号,第二个数字为文字在文档内的位置。

S(Ci)可以描述为定义3-2:

定义3-2:S(C i)={(Axtldl,Posl),(Artld2,Pos2),...,(Artldm,Posm)}

其中Artldm为包含字符C i的文档的序号,Posm为字符C i在文档Artldm中出现的位置,则一个key被检索到的条件数学描述。

从上面的条件公式可以看出,检索成功的条件就是对关键字中所有的字符C i都可以找到同一篇文档,使该文档包含字符C i而且这些字符在该文档中的字符位置的差值和它们在关键词中的位置的差值相同。

例如,搜索“中国气”

假如索引库中“中”字的索引信息为二元组序列为

(2,5)(4,6)(5,9)(6,9)(7,10)

“国”字的索引信息为二元组序列为:

(1,5)(2,6)(5,10)(7,34)

则根据定义3-1和3-2:

Key={中,国}

s(中)={(2,5)(4,6)(5,9)(6,9)(7,10)}

S(国)={(1,5)(2,6)(5,10)(7,34)}

根据式3-1定义的匹配成功条件,检索结果xi为2和5

从上面检索的结果可以看出“中国”两个字在257号文档内都出现了,但是只有2和5号文档内“中国”两个字是相邻的,所以检索命中的文档为2和5号文档。

从上述的分析可以知道,倒排表检索效率的优势远远大于正排表。

3.1.3互关联后继树模型

目前全文检索除了上述的正排表、倒排表模型外有人研究利用互关联后继树模型来实现全文检索。与传统的倒排表的索引数据必须具有文档一索引项结构且只能实现简单的查询不同,互关联后继树模型不但能够处理具有文档索一引项结构的数据,同时也能够与Pat树一样处理无结构数据;具有创建速度快,查询速度快,空间效率高等特点。在本小章中将简要的介绍互关联后继数组模型的基本构造及其工作原理。

设∑是构成文本的基本符号单元的集合是a1,a2,…,a n。中的一些基本符号,它们的有序组合便可构成一个文本。我们在每个文本T的最后人为的添加一个不在∑中的符号,用来表示该文本的结束。这个符号称为文本结束符,一般用ASCII 为0的字符表示。在本文中,为了阅读方便文本结束符使用“#”。通常把加入某一个索引库的所有文本的集合叫做该索引库对应的全文。

定义3-3(前驱和后继)对任意文本T中的任意字符串a1,a2,a1,称为a2的前驱;a2称为a1的后继,文本最后一个字符的后继为文本结束符。

注记:若组成文本T的字符串a1,a2,…,a n中,出现了m个相同的字符,不妨记该字符为a。那么a有m个后继,记为a[k],k=1,2,...,m。a[k]表示a的第k个后继。

定义3-4(后继表达式与后继树)设全文I是由一字符串a1,a2,…,an,#组成的,若其中a;,=a i2=...=a in=a为相同的字符,a n+1,ai2+1,…,a n+1..,分别是其后继,a n+1, a i2+1,…a in+1,的后继又分别{(a n+1,tag1), (a i2+1,tag2),…,(a in+1,tag n)那么我们称a i+1[tag1],a i2+1[tag2],…,a in+n[tag n]

为a的后继表达式,可以用一棵后继树来描述此表达式,如图3一所示,a n+1,tag1是a的一个(后继,位置)对。

图3-3a的后继树形式

倘若文本中有一段文字为…a,a n+1,b,…,则a有(后继,位置)对(a n+1,tag1),其中a n+1是a的一个后继,而tag1是在以a n+1,为根的树中b所在分支的序号。这个序号实际上也就是b在a n+1,树中的位置。

定义3-5(互关联后继树)由一个索引库对应的全文I的所有后继树组成的森林,叫做I的互关联后继树(IRST Inter-Relevant Successive Trees)。

例1对于全文abcabaabc#,其中#为索引库的结束符,a的后继表达式为{(b,1)(b,2),(a,4),(b,3)},其对应的后继树,全文IRST如图3-4所示。

a b c

(b,1) (b,2) (a,4) (b,3) (c,1) (a,3) (c,2) (a,2) #

图3-4全文互关联后继树模型

创建该全文IRST的时候,我们为∑中的三个字符:a,b,c分别建立三棵树,然后按照读取的字符依次为树添加树枝。首先读入ab,将a的后继b填入树a的第一个分支处,由于此时还不知道该分支对应的位置信息,留空.而后,读入c, 将c填入以其前驱b为根的树的第一个分支,此分支号即为前次留空的位置信息,将1回填到a树的第一个分支。再读取a,在c树的第一个分支填写a,并且回添该分支号1到b树的第一个分支。……。当读入#后,在以其前驱c为根的后继树中增加第二个分支#,并将2回填。此时,索引文件的结构如图3所示,将此索引文件结构表示成树的形式,即为图3一的IRST.

a→b1 b2 a4 b3

b→c1 a3 c2

c→a2#

图3一索引文件结构示例

利用索引生成原文,我们需要记录加入索引库的文本的第一个字符A,和A 的后继在树A中的存储位置P,本例中A=a,P=1。取出a树的第1个分支,得到(b,1),即a的后继为b。再取b树的第一个分支得到(c,1),……依次,我们得到的分支序列为:

(a,0)→(b,0)→(c,0)→(a,1)→(b,1)→(a,2)

→(a,3)→(b,2)→(c,1)→(#,FileNo)

每一个分支中的字符的序列即为我们的原文件:abcabaabc#。

如果查询字符串“ab c”,我们在a树的分支中查找后继为b的,发现第1,2 和4分支满足条件,再根据这三个分支的内容取其后继,仅1,4分支(b,1),(b,3)的后继为c,则“abc”在索引库中有两个匹配。

在处理索引文件结构时,有两种办法。

方法一:为每个字符预留一定的空间(称为基础块),如果某一个字符的基本块用完,则在文件末尾为其分配一附加块,在每一块中添加指针,指向该字符的下一个块。如图3-6,上面三行是基本块,当a的基本块满了,就为其在文件末尾分配一个附加块,指针由基本块指向附加块,再次满后,再次为其分配附加块。如果此时c的基本块满了,则也为其分配一个附加块。

图3-6索引文件分块结构

但是该方法存在的缺点是在基本块没有写满的时候,仍需占用存储空间,而有些字符,如二级汉字,实际上很少会出现,所以如果基本块空间分配过大会浪费,而如果分配较小,一个字符后可能会出现很多个链接块,在文件中分散存储,将影响查询和原文生成的速度。

方法二:在索引库中每加入一次文件,则为相应文本字符添加一块与该字符上一块连接。

方法二的不足是块的数目和大小完全由每次加入文本库的文本内容决定。不同字符的块大小将极为不平衡。如回车、换行或汉字“的”的索引块较大,而二级汉字的块将很小。且这也将限制每次索引库中加入文件不能过小,否则将会出现繁多的小块,因而也会影响查询和原文生成的速度。

具体在处理索引文件结构时需要结合实际情况选择不同的索引创建方法,比如若是每个字符在所有文档中出现的概率相差不多,并且能够估计到文档的大小,则采用第一中预留的方案,能够快速的检索并且不会出现很多的“碎片”。若是文件的大小完全无法预料,则只能采用第二种。

3.1.4几种索引存储结构的比较

在上面的三个小节中提到了三种索引存储结构分别是正排表、倒排表和互关联后继数组模型。下面给出三种索引结构的简要分析。

由3.1.1的分析可以知道,对正排表进行信息检索的时候,等于直接对源文件进行全文扫描,索引的建立并没有加快检索的速度,但是却在建立索引时耗费了空间和时间,这种方法没有实用的价值,一般不采用。

相比来说倒排表就很是一种实用性很强的索引存储,倒排索引由于其组织结构的形式

(具体分析见3.1.2),对信息的检索能够变的非常快,所以倒排表成为了一种主流的索引文件格式,在大部分的全文检索系统中的都采用这种索引结构。

互关联后继数组模型是一种新颖的全文检索的模型,他的特点:

1)能够处理无结构的数据(这点与pat树有一样的功能)。

2)创建的空间效率比较高。

3)可以通过索引生成原文。

不足之处:

4)文件管理方面,由于所有的倒排文件都是通过树或是森林来管理,所以系统要维持整个森林要花费很大的代价。

5)互关联后继数组在实现上的复杂度要远远大于倒排表。

6)在处理不相邻的检索关键字方面比较吃力。

7)在文本预处理时,互关联后继树模型对“stop word”就无能为力。

与之相比倒排表具有以下的优点:

1)倒排表技术是一种比较普遍通用的技术,针对倒排表的研究也比较多,所以相关的技术也比较容易实现。

2)经过改进倒排表结构形式也能够达到比较好的检索效率,以弥补检索效率的问题,在空间效率上可以利用索引压缩技术进行改进。

3)在网络上面,检索的返回结果只是一个链接,并不需要全文的还原,所以互关联后继树模型这方面的优势并没有很明显。

综合比较起来,本文采用倒排表格式的索引存储格式。

3 . 2基于单字的索引器构造

全文检索的核心技术是将源文档中有的基本元素的出现信息记录到索引库中。在中文系统中,基本元素可以是单个汉字字符,也可以是词。因此,存在两种基本的索引库结构,即基于字表的索引库和基干词表的索引库。基于字表索引库的建造方法有很多种,不同的字表的构建方法会对应不同的检索策略。下面介绍其中一种字表法索引库的构造方法及检索策略。

3.2.1单字索引数据结构

单字的索引库数据结构一般采用字表法,字表法索引库的主要部分是每个字的字表信息。字表结构如表3-1所示,其中字符i对应的字表记录了该字符在源文档中所出现的位置Pix。该位置采用了字符相对于文档头的偏移字符数表示,而不按通常情况采用相对于文档头的偏移字节数,这样可以大大减小位置的数值大小,有利于进一步采用压缩技术。建立字表索引时,需要扫描整个源文档,对出现的每一个有效字符,计算其在文档中出现的位置,并将该位置的值加入到对应的字表中。

如两个字的字符串XY(其中X,Y表示任意的汉字字符),假设X的位置为)Px,如果字符串XY在源文档中出现,则Y的位置P y必定等P x+1,(1为两个汉字间的字符距离)。在索引库中X的字表中将包含Px,而Y的字表中也必然包含P x十1。进行检索时,扫描X和Y各自对应的字表,若文档中有该词出现,则必定有X对应的字表中存在位置值P x,Y对应的字表中存在位置值P y使得P y= P x+1成立,每查到一对这样的位置值,就是检索到字串XY一次。扫描完两字的字表,就可检索出该字符串的所有出现。

上面简要介绍了字表的用法,在具体实现的时候的数据结构要稍微复杂一些,因为某个字符的字表中不但要包含文档的信息还要有某字符在该文档中出现的位置信息,由于字符在每一个文档中出现的次数与位置都不一样,所以在实现的时候采用了一种比较复杂的数据结构,就是字表倒排文档。

字表倒排文档的数据结构是每个汉字字符对应的字表中,包含该字符出现在所有文档中的全部位置。为了区分每个位置公到属于哪个文档,每个字符的字表被分为多个字表段,每段对应一个文档,记录该字符在此文档中的出现位置。字表采用倒排文件结构,如表3一所示。

表3-2字表倒排文档

每个字表段起始部分记录当前文档的编号,随后是该字符在文档中的出现频率,最后是该字符在文档中的所有出现位置序列。每个字符的所有字表段按文档编号递增的顺序排列,如果该字符在文档k中没有出现,则不存在文档k对应的字表段。

3.2.2单字索引的创建方法

上面简要介绍了基于字表的索引库的结构,下面给出基于单字索引的创建方法。

该索引创建方法不需要排序,分为如下两步:

第一步分析源文档,产生临时的中间文件,这个过程称为分析过程。当前只针对GB码字符进行处理,其中包含全部字符,既有汉字,又有一般的数字,标点符号等。GB码第一个字节的范围是0XAI-0XF7,第二个字节的范围是0XA1-0XFE。汉字从“啊”开始,首字节为176-247,第二个字节为161-254。根据这种分布规律,可以方便地定位每个字符对应的字表信息。源文档经过处理,将其包含的每个字符的对应信息写到一个临时的中间文件中。对于每个字符,其在临时文件中的对应信息包括:该字所出现的当前文档编号、在该文档中的出现频率、出现的位置序列和该字符出现在下一个文档的数据的指针(数据在文件中的偏移值)。

第二步处理临时文件,依次从临时文件中读取每个字符出现在每一篇文章中的数据信息,生成最终的倒排文件,在这里称为创建过程。生成的最终倒排文件中包含每个字符出现在所有文档中的信息。包含该字符出现的当前文档的编号、出现频率和相应的位置序列。处理过程如下图所示。

图3-7生成索引文件流程图

3.2.3优化的基于单字索引创建方法

在上面所论述的基于单字的索引创建方法中,对于源文件的分析过程本身需要一定的时间,随着处理数据集规模的增大,相应的分析时间增大,第二步(创建过程)所需的时间相应的迅速增大。该过程需要大量的随机读取操作来遍历每个字符对应的所有信息。当数据的规模增大时,遍历每个字符的临时数据的操作变得很慢。这是由于字符对应的每个字表的数据在临时文件中有一定距离,遍历需要不断地移动文件指针来读取这些数据。

利用操作系统提供的虚拟内存技术可以优化索引的创建过程。Windows操作系统用虚拟内存技术来动态管理运行时的交换文件。为了提供比实际物理内存还多的内存容量以供使用,Windows操作系统占用了硬盘上的一部分空间作为虚拟内存。当CPU有要求时,首先会读取内存中的资料。当内存容量不够用时,Windows就会将需要暂时储存的数据写入硬盘。内存映射文件技术是WindowsNT 提供的一种新的文件数据存取机制。利用内存映射文件技术,系统可以在2GB的地址空间中为文件保留一部分空间,并将文件映射到这块保留空间。一旦文件被映射之后,WindowsNT将仔细管理页映射、缓冲以及高速缓冲等任务。通过把临时文件映射到虚拟内存中,可以大大加快对临时文件的访问速度。

对于较小的源数据集,分析处理后生成的临时文件也较小,使用内存映射文件可以大大加快创建过程。但当数据规模增大时,该方法的性能迅速降低,甚至比没有使用内存映射文件都差。性能的降低一方面由于机器有限的内存,其小于临时文件的大小。另外一方面,同一个字符相邻的数据在临时文件中距离过大,导致大量的缺页中断,系统性能大大降低。解决该问题的有效方法是把原有的单个的大的中间文件分成多个小的临时文件,在分析过程中生成多个小的临时文件,创建过程依次处理每个临时文件,将其映射到虚拟内存中,可以充分利用直接内存访问的速度,并且减少缺页中断。在实际应用中,可以采用了统计的方法,通过对一个较大的数据集的分析,将原有的一个大的临时文件拆分成多个小的临时文件,每个字符的索引数据存放于其中的一个临时文件中。井且每个临时文件中存放的数据的大小相差很小。这样,每个小的临时文件的大小小于当前内存的大小,从而可以有效地使用虚拟内存技术加快存取。

3.3基于词表的索引器构造

由上文可以知道以中文的词组作为索引单元也是一种常用的索引文件构造方式,基于分词的中文全文检索索引器的构造是以词为索引项的索引结构。

3.3.1词表索引数据结构

典型的基于词的倒排索引结构 (见图3-8)包含两部分:1)中文词组成向量 (称之为词汇表),它包含了词的基本信息和词索引在索引文件中的偏移量。2) 对于词汇表中的每一个词,都有一个它出现过的文档列表,它包含了出现文档编号,在此文档中该词的词频和出现位置序列。

图3一词索引倒排文档 图3一临时文件结构

词索引指针指向词的索引在索引文件中的偏移量,区域最开始保存的这个词出现过的文档数目(文献频率),这是为了在检索过程中读取索引前能够合适地分配内存空间,文献频率后面是出现文档列表。在这个结构中,除了字频用单字节之外,其他都用4个字节表示,而且出现在列表中的文档编号是升序排列的。

3.3.2一种词表索引创建流程

要建立词索引,首先需要对文档进行自动分词。首先将文本中的中文词、西文词和连续数字组合分析出来,然后对分词结果进行排序,合并相同词的信息,这样就得到一张文档中出现词的列表以及它们的出现位置序列。对于每个词,可以根据它们的计算机编码 (中文GB2312,西文和数字ASCII)映射到词表中的位置,更新词汇表及索引。下面是详细的流程描述:

(1)对文档进行自动分词,对结果排序,合并相同词的信息。

(2)定位词在词表中的位置,得到词索引区在临时文件中的偏移量,如果是以前未出现过的词,就在临时文件的末尾分配一个固定大小的基本空间,对于低频词来说太大的基本空间将造成浪费,所以需要分配合适大小的基本空间。在本系统中,基本空间大小正好能保存一个词出现一次的信息。

(3)如果这个词以前出现过,将文档的读写指针定位到这个词的索引区的末尾。

(4)写入每个词的索引信息到临时文件。如果此时分配给该词的空间用完,则在临时文件末尾给其分配新的溢出空间,出现次数越多的词分配的溢出空间也越大。索引写完后,将上一索引区的向前指针更新为新分配空间在临时文档中的偏移量。

(5)对于文档中的每个词,重复步骤 (2)到(4),对于每篇文档重复步骤 (1)到 (5)。

(6)所有文档处理完后,对于每个词,我们将分散在临时文档中的索引信息合并在一起,然后按照图3-8的格式写入最终的倒排文档。

3.3.3常用分词技术的研究

以词为索引项的技术重点是词的切分问题。在本小节中对主流的一些分词技术进行了分析总结。

目前采用的分词方法主要有:基于神经元网络和专家系统的算法、正向、逆向最大匹配法、逐词遍历法、最佳匹配法、词频统计法,此外还有穷多层次列举法、二次扫描法、基于

期望的分词方法、双向扫描法、邻接约束方法、邻接知识约束方法、最少分词词频选择方法等。但归纳起来不外乎两类,第一类是在生成关键词时将语法、句法、语义结合起来,试图模仿人类的阅读过程。但有时语法、句法、语义连开发人员都不是很清楚,故一般情况下不采用。第二类由字典匹配法和基于频度方法组成,这些方法比起上一种来较具体实用。

下面给出几种常用的分词方法:

1、逐词遍历法

该方法是将词典中的所有词按由长到短的顺序在文章中逐个搜索匹配整个待处理材料,直到把所有的词都切分出来为止。也就是说,不管文章有多短,词典有多大,都要将词典遍历一遍。

如“他睡觉打鼾”,利用该方法切分这一句话,不论分词词典多大,都得把整个分词词典匹配一遍。故这种方法的时间复杂度比较高,是一种不可使用的分词方法。

2、正向(MM)与逆向(RMM)最大匹配法

正向最大匹配法是最早提出的自动分词方法,它的基本思想是先取一句话的前六个字查字典,若不是一个词,则删除六个字的最后一个字再查,这样一直下支,直到找到一个词为止,对句子剩余部分重复此操作,一直到把所有的词都分出来为止,逆向最大匹配法和MM 法一样,不同之处在于它是从句子的最后六个字开始的,每次匹配不成功时去掉汉字串中最前面的一个字。

两种方法思路清晰,易于用计算机实现,但是由于试图用相对稳定的词表来代替灵活多变、充满活力的词汇,把词表作为判别词的唯一标准,因而,为了查询的方便,RMM方法要求配备逆序的分词词典,这样的分词词典维护起来比较困难(不符合人们习惯)。另外,MM和RMM法否认词的组合递归性,因此出错率高。据统计表明,MM方法的错误切分率为1/169。这两种方法一般都不单独使用,而是与其它方法相结合使用在同一系统中。

3、非用字后缀表示方法

它是建立在中文自动抽取关键词基础上的中文分词方法。非用字后缀表示法将中文分为A类(表外用字)、B类(表内用字)、C类(条件用字)、D类(非用字)。它从GB2312-80的6763个字中挑出B类、C类、D类组成非用字后缀表。在抽词时,首先采用字的方法将文章变成由关键词组成的词段,然后分成18种模式:

(B/A+AB+AB/+C),(+AB+C),(Cl+AB+A/B),(C"+A/B十C)。如仍有长词,则采用2-2,2-2-2措施解决.这种方法简单,而且速度快。

4、设立切分标志法

在汉语中存在着许多自然切分标志(文章的非文字符一号),如标点符号等,另外还存在一些非自然切分标志(词缀和不构成词的词),如只能充当词首字或词尾字的字、不构成词的单字词、复音节单纯词、拟声词等,词不能跨越这些标志而存在。设立切分标志法的基本思想是通过建立非自然切分标志的一张表来识别所有的非自然标志。这样,一个句子链就可以转化为若千字符串短链。然后用其它切分方法进行细加工,这样可以大大提高效率。这种分词方法后期处理时由于匹配长度较短,减少了比较次数,不过开始阶段寻找切分标志又增加了分词的时间复杂度。另外非自然切分标志随着词典中收集的词和字的个数而变动。词典中增加了一些词但是没有增加新字,可能减少非自然切分标志,增加了一些新字,但由于没有能够及时地增加相应的词,可能会增加非切分标志的数量。其实,“设立切分标志方法”并不是真正意义上的一种分词方法,只不过是自动分词的一种前处理方式而己,而且这种处理并没有提高分词精度,却要额外消耗时间扫描切分标志,增加分词的时间复杂度,另外要花费存储空间存放那些所谓的非自然切分标志。因此,设立切分标志法一般很少被单独采用5,OM方法

OM(THE OPTIMUM MATCHING METHOD)方法称为最佳匹配法。OM方法现《代汉

语》(张志公主编)中提出来的,分为正向最佳匹配法和逆向最佳匹配法。最佳匹配法的出发点是在词典中按词频的大小顺序排列词条,以求缩短分词词典的检索时间,达到最佳效果,从而降低分词的时间复杂度,加快分词速度。

实质上,这种分词方法是预先对分词词典进行处理,而不是一种纯粹意义的分词方法。OM方法的分词词典每条词前面必须有指明长度的数据项,所以OM方法的空间复杂度稍有增加。OM方法虽然降低了分词的时间复杂度,但是并没有提高分词精度。

但它的一个明显缺点是频度较低的词,永远被错误切分。如果仅考虑当前正在处理文本的词频的话,将会得到良好的效果,其代价是增加了分词的空间复杂度。

6、二次扫描法

二次扫描法的基本思想是取待处理材料中两个切分标志之间的部分作为样本串,首先从该样本串中取两个汉字作为匹配串,检查分词词典中是否有一个词,它的前两个汉字和该样本串相同,若有的话,则取样本串的前三个汉字作为匹配串,重新在分词词典中找可以匹配串的词,若有则重复下去,直到进行I个汉字为止(设I为词典中最长词所含汉字的个数),则切分出一个I字词;若没有则完成了一次扫描;把匹配中的最后一个汉字去掉,作为新的匹配串,进行第二次扫描,第二次扫描是用MM方法或RMM方法进行。由于汉语中的平均词长为1.83,故二次扫描法降低了分词的时间复杂度。二次扫描要求分词词典按国际递增的顺序存放词条,若不是这样存放,则二次扫描法的时间复杂度会增大。二次扫描法没有提高分词的精度,也没有增大分词的空间复杂度。它是一种切实可行的方法。

7、基于词频统计的分词方法

词频统计的结果揭示了社会的用词规律,因此利用词频统计的结果帮助分词,会产生一定的效果。这种分词方法不依靠词典,而是将文章中任意个数的字(小于等于规定最长词长L)同时出现的频率进行统计,次数越高的越可能是一个词。它不是纯粹意义上的机械分词方法,而是在分词过程中处理歧义字段的一种方法。

例如:AB,BC是两个词,如果BC的频度比AB的大,则ABC这一歧义字段应切分为ABC。这种方法可以很容易地将挑选出专有术语、人名、地名等,但它的一个明显缺点是频度较低的词,永远被错误切分。如果仅考虑当前正在处理文本的词频的话,将会得到良好的效果,其代价是增加了分词的空间复杂度。

8、联想一回溯法

联想一回溯法是山西大学计算机系提出来的,目的在于提高分词的精度。该方法可描述如下:

首先将待切分的汉语言文本,依据特征库分割为若千子串,每个子串为词或词群(几个词组合而成的线性序列)。然后再用实词库和规则库将词群细分为词。这种方法实际上采用设立切分标志法和有穷多层次列举法的思想,由于实行分级建库,故增加了分词的空间复杂度,把分词过程分解成分割和细分两个过程,使得分词的时间复杂度增大。它能提高分词的精度,从而是一种可行的方法。它不是一种纯粹机械分词方法。这种方法己在山西大学计算机系设计的ABWD自动分词系统上得以实现。

9、专家系统方法

专家系统方法从专家系统角度把分词的知识(包括常识性分词知识与消除歧义切分的启发性知识即歧义切分规则)从实现分词过程中的推理机中独立出来,使知识库的维护与推理机的实现互不干扰,从而使知识库易于维护和管理,它还具有发现交集型歧义字段和多义组合歧义字段的能力和一定的自学习功能。综上所述,由于中文的复杂性,很难以某种方法正确地、彻底地分词。在实际应用中,一般都是几种方法配合使用,以求达到最佳效果。

在上文中对目前主流的一些分词技术方法做了简要的介绍,由此可以看出基于分词的全文检索具有以下的优点:

1)检索速度较按字检索的快。在理想情况下,检索词语经分词后的检索单元数量一般要少于以字为检索项的检索系统,当检索词语较长时,检索效率的提高比较明显。

2)查准率较高。系统可以利用语言学知识借助词典和分词规则避免歧义词,如检索“华人”这个词,按字检索会将“中华人民共和国”也检出,而分词系统可以借助分词规则和词典避免这一情况。

3)可以借用英文全文检索系统中已有的理论及方法,英文全文检索中有许多成熟有效的方法可以直接借鉴。

4)可以完成概念层次、主题的提取和检索。

同时分词技术也有其不可避免的缺憾与不足:

1)构造一个可以跟上时代发展的词典是分词系统的一个难题。由于现代语言的发展和外来语的引进,符合新时代特色的词典的构造不是一件简单的事,成为分词检索系统开发的制约因素。添加新词语,建立众多词语的新概念模式、删除过时词语的维护工作量极大。从成本角度看,词典的更新维护加大了用户的使用成本,不利于系统的推广。

2)中文构词方法的复杂性使得人们难以构造一个完全准确、合理的分词规则,因此查全率一直是分词算法难以解决的问题,影响了基于分词的全文检索系统的可靠性。迄今为止始终没有一种有效的分词规则可以彻底解决查全、查准率的问题。

3)在分词过程中大量的人名、地名和许多专有名词、新的语言词语、外来词无法在词典中记录,而分词规则也无法识别这些词,只能借助按字索引的方式解决。在实务中有相当多的检索信息是这类名词,因此从实际看,降低了分词检索的效率,使得分词检索系统的检索效率优势大打折扣。

3.4 几种压缩技术的研究

在本节中主要针对索引在编码级上的压缩进行了分析,研究和比较。主要讨论了按位紧凑压缩法,可变字节编码法,Elias Gamma coding编码方法,Golomb coding编码方法,Binary Interpolative Coding编码方法,并针对不同编码的特点说明了其适用的范围。

3.4.1按位紧凑压缩法

在本小节中利用单字的倒排索引文档给出按位紧凑压缩法的详细说明。在建立倒排文档时,在得到每个字符在所有源文档中的全部位置信息后,直接将其写入倒排索引文件中,这些位置信息都用它在源文档中的绝对地址来表示(可能被调整过,与实际的物理位置并不完全一致).虽然每个文档一般不会太大,但考虑到通用性,绝对地址应该用4个byte来表示。同样文档号也需要4个byte来表示。

现在对上面阐述基于单字的倒排索引建立方法的空间存储效率进行一些分析。先只对一个文字在一篇文档中的索引情况进行讨论,假设“啊”字在ID编号为55843(OxDA23)的文档中出现了10次,位置信息分别为:

POSO=5(0x5)

POST=69(0x45)

P052=104(0x68)

POS9=2056(0x808)

按照本节式3-1和3-2的阐述,本例中均设m,为4,n为10,则有

Cap=4X10=40byte

Info=2X10=20byte

空间压缩比:

Com=Cap/Info=40/20

图3-10相对地址压缩格式示意图

从上面的分析可以看出,如果不对字符位置信息进行压缩,索引库的信息量会很大,尤其对中文来说,在源文档中用两个字节表示的一个汉字字符,在索引库中需要用4byte来记录其出现位置,索引库的总的信息量将是源文档信息量的两倍左右,显然必须采用适当的方法对其进行有效的压缩。由于对文档的扫描处理是顺序进行的,字符出现的位置必然是按升序排列的。根据这一特点,可以对位置序列进行压缩,采取差值编码的思想,对每一出现位置记录其相对于前一出现位置的相对地址,每一相对地址采取尽可能短的可变长度表示。字表段的压缩格式如图所示。

对字符位置序列压缩时,将第一个出现位置P1直接用绝对地址表示,从P2 开始,用相对地址表示。每个相对地址用若干位表示,在保证尽可能短的地址编码长度的条件下,将数个编码长度相同的连续地址压缩为一个“地址节”,一个地址节中包含该节的地址编码长度、地址个数以及各地址编码按位紧凑存放的地址码位流,如下图所示。这样一个字符在一篇文档中的位置信息就由若干地址节构成。

地址编码长度可以有4bits,6bits,8bits,16bits等情况。当相对地址长度超过16bits地址空间时,则直接用绝对地址表示。

一般的文档都比较小,极少用到超过64K的相对地址,因此每个字符的出现地址的编码长度一般在8bits-16bits之间。由此可见,使用这种方法压缩的索引库的数据量将保持在原文档的文本内容的数据量的50%-100%之间。

图3-11地址节示意图

另外,第一个出现位置要用绝对地址表示,而在绝大多数情况下,绝对地址用16bits 表示就足够了.因此,在索引库中可以根据具体情况,一般用2byte表示绝对地址,对于极个别情况,再使用4byte编码。

这种编码方式最大限度地压缩了位置信息,但是它只有在位置信息里出现大量连续的相同位数的地址时才能够对位置信息进行高效的压缩。例如,只有当长度为46its的地址码连续出现四个以上,用这种编码方式才能够起到节省空间的目的;而当连续的4bits编码小于两个时反而浪费了空间。因为在不压缩的情况下,4bits的地址可以用一个字节表示,四个连续4bits占用了4byte,而经过这种编码压缩后,四个地址被压缩到了两个字节中(每个字节有86its),另外在用一个字节记录地址节中地址的个数以用于解码,这样就总共占用了36yte,节省了一个字节。当4bits地址连续出现两次和三次时,编码前后所占用的字节都是两个和三个,不节省也不浪费,而当4bits只出现一次时,这样编码后需占用两个字节,反而多用了一个字节。同样,6bits的地址编码需要连续出现八个才能达到节省空间的目的。而当采用英文词表和中文字表的倒排表组织方式的时候,这种情况出现的几率是非常小的,使用这

种方式编码也是很不经济的。另外,由于这种编码方式比较复杂,在编码和解码时需要消耗一定的时间和资源,也会直接影响搜索引擎的快速响应。只有当采用英文字表组织倒排表的时候,即英文不按照单词,而是以26个字母组织倒排表,这个时候由于所有的位置信息全都集中到了26张表中,才有可能出现大量连续的4bits,obits等同长度的地址,这个时候用这种按位紧凑压缩的方式编码才是行之有效的。

3.4.2可变字节编码(V ariable Byte Coding)

在本小节中介绍另外一种索引压缩的方法,叫可变字节编码。该压缩方法是基于传统的索引结构模型。索引完全是由整数值组成,整数值越小,就能用更少的字节来表示它。为了提高索引压缩比,需要减小索引中数值大小,因此在创建索引之前,需要对索引进行预处理。

在3.2节的基于分词的索引建立的方法中已经提到,若词出现列表中的文档编号是升序排列的,因此可以采用增量编码的方法表示文档编号,文档编号只保存与上一篇文档编号的增量。词在文档中的出现位置序列必然是升序排列的,因此也可以采用同样的处理方法,同时出现位置可以用词编号来表示,而不用词相对于文件头的字节偏移量来表示,这样可以大大减少出现位置的数值。

可变字节编码分为两类,一类是均匀变长编码,另一大类是非均匀变长编码。下面分别就这两种编码形式加以详细说明。

(一)均匀变长编码

在未压缩的索引中,除了词频是单字节表示以外,其他都是用4个字节来表示,大部分的数值根本不需要4个字节表示,造成了很大的浪费。设计一种整数变长编码,将双字的低字节的最低2位作为数值字节长度标志位。00-11分别表示数值需要1-4个字节表示。除了2位作为标志位,字节其它位都用来保存数据(图3-12)。由图3-12可知字节长度和标志位是均匀映射,所以称之为均匀变长编码。编码时,首先根据数值大小来判断字节长度标志位,然后将数值做左移2位运算,将标志位通过按位或运算写入数值的低2位中。在解码时,首先在当前指针处读取一个字节,和0X3做按位与的运算获得此数值的标志位,然后按照标志位读入相应的字节,最后将读入的数据整体做右移2位操作就能得到源数据。比如数值120,用二进制表示为11110000,通过大小比较后可知需要2个字节来表示,均匀压缩编码后的二进制表示为〕)00001111000001,可以看出大部分的增量数值只需1-2个字节表示,而无需再用4字节。

图3-12均匀变长编码

(二)非均匀变长编码

通过分析可以看出,大部分情况一篇文章包含的字词数在4万以下,那么出现位置数值的增量编码则会更小。对于数据量较大的高频词,其出现文档编码的相对增量值也不大。针对全文数据的这一特点,提出一种标志位和字节长度非均匀的映射编码方法。由于小数值出现的机会大,可以将小数值字节表示范围划分密集一些,而大数值字节表示范围划分粗略一点。双字的编码方式如图所示。在前面的方法中。表示词频的单字节不压缩,由分析可知,一个词在很大部分文章中出现频率都很低,针对此加入了对词频单字节的压缩编码方法,单字节编码标志位为1位,0或I分别表示用半个或一个字节表示数值(图3-14)。均匀变

图3-13非均匀变长编码示意图

长编码读写时,都是以字节为单位的,因此其压缩和解压缩的算法较简单;非均匀变长编码由于会出现读写时字节不对齐的情况,因此算法较为复杂,解压缩的时间也会更长。就索引的空间来说,原来大部分用2字节表示的数值现在都能用1.5倍的字节表示,这部分空间减少了25%,但是1字节的表示长度没有变化,3字节现在需要4字节来表示,字频大部分用半个字节就能表示,从整体来说比均匀编码方式的空间缩减率在25%左右。由此可以看出非均匀编码相对于均匀编码来说,用一个标志位状态表示1.5个字节长度,3.4个字节长度标志位合并为一个,使得在低数值字节表示范围上划分更细了,与实际系统中小数据出现概率大的情况十分匹配,因此可以获得更大的空间压缩率。

图3-14单字节非均匀变长编码示意图

本小节主要介绍了变长编码压缩方式的两种实现形式,一种是均匀变长编码,另外一种是非均匀变长编码,由以上的分析可以看出,由于实际上文档的数量和文档的大小都会在平均的一个水平,并且不会十分的大,在这种情况下非均匀编程编码就会在压缩率上胜过均匀变长编码。但是在相同的条件下非均匀变长编码的编码格式比均匀变长编码的要复杂,所以其在解压缩的时间上也要长于均匀变长编码。

3.4.3Elias Gamma coding

倒排表可以非常长,而信息检索是以磁盘为界限的。从磁盘检索一个长的倒排表要比对它进行其他的操作花更多的时间。为了能增大从磁盘上检索的信息量,需要针对整形数进行更有效的编码方法。

在伽马编码中,一个整型数被表示成两部分,头部是『log2X』个0,尾部是x的二进制表示。这样整数9表示为:000,1001,因为log2X=3,所以头部是000,尾部是10010伽马编码对于小一些的整数其编码效率是很高的,因为头部的长度短。当数变大,存储空间也变大了。

Elias Gamma Coding是一种简单的压缩编码的方式,针对数值比较小的整数其编码效率很高,但是若是整数变得很大的时候该编码的方式就有一些不太实用了。

3.4.4Golomb Coding

在Golomb编码中,整数x用两部分来表示,商和余数.商的计算公式为9= 『(x-1)/kJ,余数的计算公式为r=x-(q*k)-1,在这里k是Golomb编码算法的基础。

如果r

对于这套编码方案来说,k的选择是至关重要的,如果选择的不好,编码后的整数会变的非常大,需要很长时间来解压。Witten et al.(1994)认为假定倒排表中整数符合Bemoulli 模型,则一列整数a的k值用k~0.69X平均值(a)来计算。

对这些实验的k值的选择用的是Witten的近似法,每一个倒排表都用自己的k来压缩。存储k的花费未被计算并且也没有包含在结果中。

Williams and Zobel描述了对Golomb编码实施优化的方法,并且认为常规的对整数的Golomb编码比Elias gamma编码和Elias delta编码解码更加节省空间。

本小节说明了Golomb编码的原理,并且指出了该编码方案的关键点主要在于k值的选择,因为k值的大小与解压的时间关系很大,若是没有选择好一个合适的k值那么解压的时间将变的很大,这样压缩算法就失去了意义。

3.4.5 Binary Interpolative Coding(二进制插入编码)

二进制插入编码(Moffat和Stuiver2000)用相邻数的信息来编码一个单调递增的整数数列。

如果在整数数列X1中,对于任意给定的一个整数X i,前一个数X i-1和后一个数X i+1是已知的,那么通过减法运算我们可以得到存储Xi所需要的最大位数。因为X i的大小是在(X i-l+l,X i+1-1)的范围内,所需的最大位数为log2(X i+1-X i-1-2)。解码时需要X i-1和X i+1的信息,所以数列X2是从原先的X1得到的,也就是说每个从表X1得到的整数都在X2中,这样也就可以递归地进行编码。

中心最小二进制编码也是二进制插入编码的一种实现形式。它是指当压缩一个序列1...n,需要log2n位,但是有2log2n-n。位的编码就被浪费掉了。这些被浪费掉的编码可以被缩短成一位并被使用(只要这些短的编码不是长编码的前缀)。这些最小化的二进制编码被置于编码范围的中心,在进一步处理过程中,当数列的长度不断缩小,数列的密度也就增大了。

压缩倒排文件表和词出现的倒排表直接在倒排表上进行操作,不需要取差值。通过计算每个文件上累加和来得到频率值,而由频率值可以产生一个单调递增的数列。

在本小节中主要探讨了二进制插入编码的编码策略,它主要用来对一个单调递增的整数数列进行压缩编码。

4中文全文检索系统的索引器设计实例分析

从上文的分析可以知道,中文全文检索的索引库的组织结构不同其涉及的索引的创建,索引的维护方案也不同,带来的索引创建,检索效率,维护整个索引库的代价都是不同的,在本章中给出基于单字的倒排表索引系统的实现。

4.1总体设计

该系统共有三部分功能模块组成,分别是索引的创建,索引更新,索引删除,具体的结构图如下:

相关主题
相关文档
最新文档