P:bccabcetbc
图4-6比较过程3
可见,当P向左找不到“tbc”时,就找到“tbc”的最长与P的前缀匹配的后缀,并将P向右移。用L(£)表示这个最长后缀的长度,这个例子中/二8。
下面是用C语言实现BM算法的程序。
甘includedstring,h〉
祐include
#include
/*辅助数组,取决于字符集,默认的采用ASCII字符集,256个元素*/#defineLEN256
intBMMatcher(char*s,char*p,intindex,intposition口)/*参数说明:char*s:匹配串
char*p:模式串
intindex;模式串匹配的起始位置,是匹配串的索引intposition[]:辅助数组*/intlen=strlen;inti,j,nextindex;i=strlen-1;j=index+strlen-1;for(;i>=0;i----,j------)
{
if(s[j]!=p)break;
>
if(i<0)return0;/*匹配成功*/
elseif(position[s[j]]>0)nextindex=index+i-position[s匸jZO;elsenextindex=index十1;if(nextindex>LEN-strlen)retum-1;/*匹配失败,无法进行下一次匹配*/elsereturnnextindex;/*匹配失败,需要下一次匹配*/}
/*测试,匹配串和模式串都使用小写字符*/
intmain()
{
intposition[LEN]={0};/*辅助数组*/
char*src=“itisjustatest,whatwouldyoudo?”;/*匹酉己串*/char*patten=“whatwoulcf;/*模式串*/inti,nextindex,index=-2,pos=0;for(i=0;i index=BMMatcher(src,patten,0,position);while(!(index==-l||index==0))/*循环匹配,直到匹配成功,或者匹配失败结束*/{
nextindex=index;
index=BMMatcher(src,patten,nextindex,position);if(index==-1)
printfCCannotfindit
”);
if(index==0)
printf(“Findit,theindexis:%d.
extindex);system(”MUSE“);return0;4.2侧雜裣者
倒排文档是一种面向单词的索引机制,相对顺排文档而言,是将顺排文档中可检索字段的作者名、关键词、分类号等取出,按一定规则排序,归并相同词汇,并把在顺排文挡中相关记录的记录号集合赋予其后,以保证通过某一特征词能够快速、方便地获取相关记录。
由于倒排文档的组成特点,使得许多数学检索模型(如布尔模型、集合运算等)能够方便地用于信息检索中,它把两个检索词的逻辑运算转换成了两个检索词之间的记录号集合的运算。目前最常见的倒排文档检索为逆波兰展开法。
倒排检索
倒排文档的检索算法一般分成如下3步进行。
①词汇查找。将查询串中的单词和模式分割成独立的部分,短语和近似査询串被分割成单个词汇。
②查找词汇出现的情况。获取与查询串中所有词汇相关的出现情况列表。
③词汇出现情况的操作。主要是通过对上一步中获取的词汇出现情况的操作实现短语查询、近似查询和布尔查询。如果词汇出现情况采用的是块寻址方式,那么在执行这些操作的时候就必须对这些块中的文本进行检索,以获取所查询的词汇在文本中的具体位置。
这样,在对倒排文档进行检索的时候总是从词汇表开始査询。因为一般说来,词汇表可以与倒排文档分开存放,而且它的空间需求比较少,适合于放置在内存中。
对于单个词汇的查询来说,只要从词汇表中找到对应的单词就可以找到指向该单词的出现情况列表。因此在倒排文档中对于单个的词汇査询来说,其查询的时间复杂度为0(lg/2),其中《为词汇表的长度。对于单个词汇的査询,该词汇的出现情况列表可以直接作为捡索结果返回给用户,而对于多个词汇的査询,还需要対这些列表进行一系列相关的操作。
在倒检索中进行上下文查询(查询串由多个单词构成,这种情况在査询过程中比较常见)相对于单词汇查询要复杂得多。首先获取查询串中每个词汇的出现情况列表,然后遍历所有这些获取的列表,看看查询串中的词汇是否在文本中顺序出现或者比较靠近。这些列表的合并和交叉运算需要花费的时间比单词查询长得多。
如果词汇出现情况是以块的方式来呈现的,在上下文搜索中就必须对这些块寻址方式的出现情况列表进行合并和交义运算,对于符合条件的块所对应的文本再进行文本检索,并确定词汇出现的具体位置。
倒排文档
倒排文档的组成元素主要包括:关键字(作者、主题词、分类号等)、目长(含有该关键字记录的条数)、记录号集合(所有与该关键字有关的记录号)。倒排文档的建立是建筑在顺排文档(主文档)的基础之上的,它是从主文档中提取可检索字段内容,也有采取自动从标题、文摘或全文中提取关键词,利用所得到的这些属性词来建立倒排文档。
倒排文档的结构
倒排文挡可视为主文档的辅助索引,它从不同的角度提供了对主文档的快速查询,一般来说,不同属性的数据构成不同的倒排索引文档,下面给出了10篇文献(见表4.14)的作者倒排文档(见表4.15)和索引词倒排文档(见表4.16)。
文献部分厲性
记录号篇名作者索引词
网络安全技术的採讨A网络安全,防火墙,黑客2网络教育课程开发研究B网络,课程开发,教学设计3构建视频会议系统技术浅析C网络,视频会议,多媒体通信4网络安全在IP城域网的应用A网络安全,城域网,黑客5智能光网络在城域网中的应用B网络,城域网,IP技术6浅谈电信网络的安全A网络安全,通信,IP技术7网络存储技术的研究C网络,存储技术,网络安全8无线接人在网络融合中的应用C网络,无线网,IP技术9网格研究及其面临的问题B网格技术,网络安全10宽带光纤接入网的发展趋势A网络,宽带网,光纤?
S作者索引
作者目长记录号集合
A41:4:6:10
B32:5:9
C33:7:8
关键词索引
索引词目长记录号集合
网络安全31:4:6
防火墙11
黑客21:4
网络62:3:5:7:8:10
课程开发12
教学设计12
视频会议13
多媒体通信13
城域网24:5
IP技术25:6
通信16
存储技术17
无线网18
网格技术19
宽带网110
光纤110
由表4.15、表4.16可以看出,倒排文档主要有3个字段,作者或索引词字段主要为快速检索提供索引,记录号集合的主要作用是为了在检索中进行集合运算和对命中结果的直接调用,目长在检索中起辅助作用。
倒排文档的建立
由顺排文档构造倒排文档需要经过抽词、排序、归并和组织等过程,具体实现步骤如下:
选择需要做索引的字段属性(如作者、关键词等),抽出其中的内容,并在其后附上其记录号;?对抽出的内容进行排序,使之便于归并相同内容;?对相同内容进行归并,把合并后的内容放人倒排文档的主健字段(如标引词、作者等),统计每一数据的频次作为目长,把每一内容后的记录号顺序放在记录号集合字段。
在建立倒排文档的过程中还有两个问题需要注意。
上述的过程是批处理的过程,在实际的数据库建设中是不断地追加数据的过程。因此,倒排文档的建立应具有及时更新的功能,所以对批处理创建倒排文档的过程需要更改。首先,从增加的记录中取出倒排索引的字段内容,然后,查询倒排索引。若命中,则将该记录的目长加1,并将增加记录的记录号追加进倒排文档的记录号集合字段。若没有命中,则将该字段内容以及记录号增加到倒排文档之中,并将目长置1。
由于每一个关键字所对应的记录数相差很大,因此对于只能处理定长字段的数据库或文件系统,需建立溢出文档来解决不定长问题。
逆波兰表达式
逻辑提问式类似于算术表达式,对于检索而言,这种表达式并不是最优和最简洁的形式,需要进行必要的转换。1929年波兰的逻辑学家卢卡西维兹提出了梅运算符放在运算项后面的逻辑表达式,又称”逆波兰表达式“。这种表达式能非常方便地进行检索运算。日本的福岛先生最早将逆波兰表达式应用于情报检索,故又称为”福岛方法“。
逆波兰表达式又叫做后缀表达式,是一种没有括号,并严格遵循”从左到右“运算的后缀式表达方法,如表4.17所示。
正常的表达式与逆波兰表达式对照表
正常的表达式逆波兰表达式
a+fta*6*+
a+(6—f)a,b,c,一,+
a+(6—c)*da,</,6,c,一,*,+
a=l+31,3
a*(6+c)+cZa,6,c,+,*,£?,+?
逆波兰表达式的优势在于只用两种简单操作,人栈和出栈就可以完成任何普通表达式的运算,其运算方式如下。
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再人栈,最后当表达式扫描完后,栈里的就是结果。
将一个普通的顺序表达式转换为逆波兰表达式的一般算法如下。
①首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越髙的原则。
②读人一个简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号”并“。
③从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
④如果不是数字,该字符则是运算符,此时须比较优先关系。
具体做法如下:将该字符与运算符桟顶的运算符的优先关系相比较。如果该字符优先关系高于此运算符栈顶的运算符,则将该运算符人桟。若不是的话,则将栈顶的运算符从栈中弹出,宁波seo优化直到栈顶运算符的优先级低于当前运算符,将该字符人栈。
⑤重复上述操作①?②直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,便可以将简单算术表达式转化为逆波兰表示的简单算术表达式。
不论是算术表达式还是逻辑提问式中,运算符均有其运算优先级,这就决定了表达式转换具有一定的复杂度。在逻辑提问式中,其运算符的优先次序分别为:”一“、”*“、”+“,另外括号内的运算优先级最髙。因此,在转换处理过程中,対运算符的优先级做如下定义(见表4.18)o表4.18运算符的优先级
运算符优先处現的级别
+2
*3
一4
那么计算机怎样通过后缀式来进行运算呢?这里首先假设读取分析表达式的准备工作都已经做好了,那么首先需要做的是把表达式转换成后缀式,也就是逆波兰表达式的构建过程。
构建器由两个主要组件组成,一个是目标表达式的存储器,另一个是符号栈。与源表达式的扫描顺序一样,存储器是从左向右储存数据的,而符号栈则遵守后进先出的原则。
首先读人一个数据。
①如果是单目运算符,直接人符号栈;
②如果是运输量,则直接写人存储器?,检査符号栈顶是否有单目运算符,有的话则全部出栈,并写人存储器;③如果是左括号”(“,则直接人符号桟;
④如果是右括号”)“,则弹出符号桟数据,写入存储器,直到左括号弹出;⑤如果是普通运算符,则与栈顶符号比较优先级,若大于栈顶优先级,则人桟;杏则弹出桟顶符号并写人存储器,直到栈顶符号的运算优先级较小为止;⑥如果是结束符(表示表达式已全部读完),则符号栈全部弹出并写人存储器,否则读取数据进人下个过程。
此外还有一些处理的技巧,比如定义一个优先级最低的运算符诈为表达式结束的标志,在符号桟里首先加人一个结束标志,那么表达式读完时则自动弹出栈中所有符号,并写人存储器结尾表不成功。
表示表达式:u*6+c*W+e)构建的过程。
逆波兰表达式构建过程
序号表达式目标数据堆桟说明
a*6+c*(d+e)井井井表示结束符
a*6+c*(c/+e)并a井a写人内存
*6+c*(t/+e)并a井**>#
b+c*(d+e)并ah并*6写人内存
+f*(t/+e)并ab*并+<*
c*井ab*并++>井
c*(d+e)并ab*c井+写人内存
*(J+e)#ab*c井+**>+
(朴e)#ab*c井+*左括号送人堆栈
d+e)井ab*cd#+*(c/写人内存
+e)#ab*cd井+*(++>(
e)井ab*cde井+*(+e写人内存
并ab*cde-——并+*右括号”)“遇左括号”(“弹出堆栈14并ab*cde+*+井并弹出堆栈
检索指令表的生成
逻辑提问式的逆波兰表达式不能直接用于检索,还需要将其转换成一组检索指令才能进行检索操作。转换工作是直接针对逆波兰表达式进行的,通过逐行扫描逆波兰输出表,根据其具体内容实现从逆波兰表到检索指令表的转换。
操作指令表由4列元素组成:第1列为操作码,指定本行操作类型,如输人操作、运算操作、转储操作等;以后3列为操作数属性,根据操作码来决定3个操作数之间的关系,具体处理如下。
若为检索词,操作码置1,第1操作数存放从逆波兰输出表中取出的检索同地址,第3操作数放置在放该检索词记录号集合的工作区代号。如表4.20表明检索词表的03号关键词的记录号集合存放在第2工作区。
检索词操作指令表示
操作码第1操作数第2操作数第3操作数
若为运算符,操作码为”3“、”4“、”5“,分别代表运算符”+“、”*“、”一“,第1、2操作数指定的两个工作区的记录号集合根据操作码进行相关运算,其结果送第3操作数指定的工作区。如表4.21表示第3、4两个工作区的记录号集合进行”与“运算,其结果存放第1工作区。
运算操作指令表示
操作码第1操作数第2操作数第3操作数
41
若为结束行,将操作码置2,表示转储操作,把检索运算结果送第7工作区。因此,第1操作数放检索结果占用的工作区,将第3操作数置7,表示把检索的最终结果转移到第7工作区,参见表4.22。
转储操作指令表示
操作码第1操作数第2操作数第3操作数
转储操作结束,将最后一行的操作码置为0,表示终止操作,其他操作数为空,参见表4.23O
转储操作指令表示
操作码第1操作数第2操作数第3操作数
由于计算机内存资源的有限,福岛方法设定工作区为7个,工作区的使用从前向后遇空闲即分配,从而保证了7个工作能够满足检索过程的需要。
检索实施
当检索指令表生成后,就进人实际检索处理阶段,整个检索过程主要依赖检索词表和检索操作指令表,执行步骤按照检索指令表的顺序进行,具体操作如下。
若操作码为”1“,应进行查找和输人操作。将该行第1操作数中数据取出,根据获得的数据来得到检索词,以该检索词去査倒排索引文档,得到的记录号集合存储到第3操作数指定的工作区中。
若操作码为”2“,说明应进行转储操作。需将第1操作数指定的工作区中的记录号集合存储到第3操作数指定的工作区中。
若操作码大于”2“,表示需进行逻辑运算操作,应将第1、2操作数指定的工作区中的记录号集合,按操作码代号进行响应的逻辑运算,运算结果存放到第3操作数指定的工作区中。
若操作碍为”0“,则表示该逻辑提问式检索结束,须根据第7工作区的内容(命中结果)到主文档中调出命中记录,显示或打印给用户。
其体裣索方铉
布尔检索
布尔检索是指利用布尔运算符连接各个检索词,然后由计算机进行相应逻辑运算,以找出所需信息的方法。它使用面最广、使用频率最高。在具体检索时,是通过以下3个布尔运算符来实现其功能的。
①AND(或*)
逻辑与,可用来表示其所连接的两个检索项的交叉部分,也即交集部分。如果用AND连接检索词A和检索词B,则检索式为:
AANDB(或A*B)
表示让系统检索同时包含检索词A和检索词B的信息集合C。
②OR(或+)
逻辑或,用OR连接检索词A和检索词B,则检索式为:
AORB(或A+B)
表示让系统査找含有检索词A、B之一,或同时包括检索词A和检索词B的信息。
③NOT(或一)
本文转载自
宁波seo优化www.leseo.net
补充词条:宁波谷歌seo
宁波网站优化推广
宁波网站排名优化
宁波网站seo优化
宁波seo网站优化