CN101533398A - 模式匹配索引查找方法 - Google Patents

模式匹配索引查找方法 Download PDF

Info

Publication number
CN101533398A
CN101533398A CN200810086821A CN200810086821A CN101533398A CN 101533398 A CN101533398 A CN 101533398A CN 200810086821 A CN200810086821 A CN 200810086821A CN 200810086821 A CN200810086821 A CN 200810086821A CN 101533398 A CN101533398 A CN 101533398A
Authority
CN
China
Prior art keywords
value
record
mark
prime number
screening
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN200810086821A
Other languages
English (en)
Inventor
徐文新
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Individual
Original Assignee
Individual
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Individual filed Critical Individual
Priority to CN200810086821A priority Critical patent/CN101533398A/zh
Publication of CN101533398A publication Critical patent/CN101533398A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明是在“位标记字符串检索技术”基础上,减少位值比较次数,以提高“相似比较”“模式匹配”速度,方法有:按位值对数据库记录或记录的其它筛选值进行规划存贮,减少标记所用的bit数n,选择部分字符元标记或进行不均衡分组标记。同样的,也可以按质数乘积对数据库组织存贮,减少代换所用的质数量n,选择部分字符元或进行不均衡分组代换,来提高“质数代换字符串检索”的速度。应用中,可根据数据库和检索关键词的特点,综合运用各种方法。在赛扬800Hz的CPU上,逆检索4,000,000条、每条5个汉字的数据库,响应时间一般为0.01至0.5秒,显著提高了检索速度,可用于语言处理、人工智能、图象识别等各个领域。

Description

模式匹配索引查找方法
技术领域
语言处理、人工智能、图象识别、信息查询、信息过滤、基因比对等众多领域使用“模式匹配”技术,与“模式匹配”接近的技术是“相似比较”:不考虑两个“模式”的“基元”的结构,只判断一个“模式”包含、可能包含、不包含另一个“模式”的“基元”。“相似比较”符合人类认知规律,其有效算法有“质数代换字符串检索技术”和“位标记字符串检索技术”。本发明在“位标记字符串检索技术”基础上,提出减少标记所用的bit数n、选择部分“基元”进行标记或进行不均衡分组标记、对数据库记录或记录的其它筛选值组织存贮,进一步提高“相似比较”的查找速度;按同样的原理,也可以用“质数代换字符串检索技术”实现,或把“位标记”同“质数代换”方法结合起来实现。“模式匹配”是通用的术语,“索引”指“相似比较”能快速为“模式匹配”确定一个范围,但不是绝对准确的定位,称为“模式匹配索引查找方法”,以便业界了解。
声明:本发明对“基因比对”开放使用,保留其它方面的所有权利。
背景技术
“模式匹配”应用广泛,字符串模式匹配主要有两类方法:1、BF算法的改进方法“KMP”和“BM”;2、“位向量方法”。
本人在中国申请号200410067258.X、国际申请号PCT/CN200/001493的专利申请文件中,提出以质数代换字符元,可以得到字符串S所有字符元相应的质数的乘积,称为F值,如果Fa不能被Fb整除,则Fa所代表的若干个字符串Sa不包含Fb所代表的若干个字符串Sb。如果Fa能被Fb整除,则Fa所代表的若干个字符串Sa包含或可能包含Fb所代表的若干个字符串Sb的所有字符元,称为“质数代换字符串检索技术”;测试表明,“质数代换”方法比“模式匹配”快1-2倍。
本人在中国申请号200510023383.5、国际申请号PCT/CN2005/001642的专利申请文件中,提出分全部字符元为n组,并用一个数据的n个均为0的bit,记为W,来标记组成字符串的字符元信息;如果字符串S的一个字符元P1属于第n组,则将W相应的第n个bit标记为1,类似地,根据S其它字符元P2、P3、P4…所属的组对W进行标记,完成全部字符元标记后的W,记录有S的信息,称为S的“位值”;通过对Sa的Wa与Sb的Wb进行比较,可以判断Sb不包含、包含或可能包含检索关键词Sb的所有字符元,称为“位标记字符串检索技术”;一般来说,“位标记”方法比“模式匹配”快1个数量级。
相对“KMP”“BM”、“位向量方法”等“模式匹配”方法来说,质数代换和位标记检索方法的特点是:1、检索是通过对主串和子串的“总”的质数乘积值、位值进行“一次性比较”,判断主串不包含或可能包含子串的全部字符元,能提高速度。2、只考虑主串是否包含子串的“字符元”,不考虑主串与子串相应字符的“距离”和“秩序”是否相同,是“相似比较”。在“位标记”基础上,可以再用“BM”和“位向量方法”等方法得到“模式匹配”的结果。不过,如果在“相似比较”的基础上进行“语法分析”,比“模式匹配”更符合语言规律,其原理适合信息处理的各个领域。
就汉语语音输入来说,目前主要使用的是N元统计模型和分词方法,两者准确率不能满足应用需要。本人提出预先建立汉语的“参考句型数据库”,运用“位标记”“质数代换”技术为“拼音串”从数据库查找“参考句型”的语言处理方法,能够快速处理语言的“跨音节协同现象”和“无序协同现象”,使基于参考句型的语言处理方法具有可行性。
本发明在“位标记”“质数代换”基础上,提出对数据库进行“规划存贮”“选择标记”,进一步提高查找速度,VC编程,在赛扬800的cpu中,一般0.01-0.5秒能从400万条记录找到目标记录,使基于参考句型的语言处理方法在中低档cpu上也有可行性。
发明内容
计算机应用已经从最初单纯的数值计算发展为主要是数据处理,进一步的趋势是智能信息处理,信息处理智能化需要理解人类的认知规律,并提出有效的算法。下面首先说明人类认知领域中的“协同现象”,以及运用“质数代换字符串检索技术”“位标记字符串检索技术”处理“协同现象”的可行性,再说明在“位标记检索技术”“质数代换检索技术”基础上,提高查找速度的各种方法以及如何综合运用这些方法。
1、信息协同现象与“相似比较”算法
汉语有400多个无调音节,常用汉字有5000-7000个,平均每个音节对应10多个常用汉字,有的音节对应上百个汉字。单独给出一个音节“xue”、或“sheng”,我们不能确定其意义及所指的汉字,但“xuesheng”两个音节连用,则意为“学生”,这里“xue”与“sheng”起了“互证”作用,称为语言的“协同现象”。汉语2个音节排列数约为400*400=160,000,《现代汉语词典》所收60,000条“语词”不完全是双音节词语,但汉语双音节中一方面存在“有音无义”现象,如:“rexiang”;一方面存在“同音多词”现象,如:音为“shixian”的词语有“实现、事先、失陷、视线、时限、时鲜、时贤”,音为“lixiang”的词语有“理想、里巷”。不过,如果有人说“shixianlixiang”,我们会理解为“实现理想”,而不会理解为“视线里巷”,这里“shixian”与“lixiang”起了“互证”作用。总之,音节越多,语义越确定。对于汉语来说,三音节、四音节中,“同音多词”或“同音多义”的概率越来越少,并且出现大量“有音无义”现象。正是由于三音节中“有音无义”的概率大,如果他人谈话中提及一个三音节的陌生人名,如“lifuhao”,我们多数时候能判断出这是一个人的名字,而不是词语。
既然三音节、四音节中,“同音多义”的概率越来越少,如将单音节词语、双音节词语,按语义搭配组成三、四字乃至五字以上的短语、句型,给出相应的拼音,建立数据库,由于音、义一一对应性好,根据这种数据库进行音字转换,就能提高准确率。设语音转换或拼音输入的T为“shixianlixiangxuyaonuli”,用正向最大匹配法进行分词,可以在数据库找到拼音串:“shixianlixiang”,其相应的汉字串为“实现理想”,将T处理为“实现理想xuyaonuli”,可以避免用“shixian”“lixiang”分别处理时的选词错误。
当然,语言不是这么简单。如果有人说“shixianweidalixiang”,我们会理解为“实现伟大理想”,而不是“时贤伟大里巷”,说明语言的“协同现象”是可以“跨音节”的;如果有人说“lixiangyijingshixian”,我们会理解为“理想已经实现”,而不是“理想意境视线”,说明语言的“协同现象”是可以一定程度上“无序”的。但是,通常的分词索引查找方法不能发现“shixianweidalixiang”、“lixiangyijingshixian”同数据库“shixianlixiang”有内在联系,也就是对“跨音节协同现象”“无序协同现象”无效。当然,对字符串进行逐字符比较,也能发现两者之间存在包含关系,但数据库大记录多时,响应速度不能满足需要。
所以,本人提出用“质数代换字符串检索技术”进行语言分析,语言文字处理中的基本单位有音素、音节、字母、汉字、词汇等,我们称质数代换的基本单位为“字符元”,记为P,字符串S的P的相应质数乘积记为F,如果Fa能被Fb整除,则Sa包含Sb的全部字符元。该方法把主串与子串之间字符的“串行比较”变成相应质数的“并行相除”,减少了读取数据的时间,在一定范围内,速度比模式匹配快1-2倍。整除判断“不考虑字符元秩序”,但可以在“整除判断”的基础上再分析字符元的结构,适合处理语言的“跨音节协同现象”“无序协同现象”。当然,“质数代换检索技术”的速度也不够快,但可以用“位标记字符串检索技术”进行句型初选。
语言分析数据库中可以有提炼出来的句子、词语搭配、短语、词组、词语等,概略地称为“基本句型”,其数据库称为“基本句型数据库”,记为jxk。从jxk中筛选出来的,字符元被关键词T包含的句型称为“参考句型”。对“参考句型”进行分析比较后,确定用来处理T的句型称为“基础句型”。选择“参考句型”做“基础句型”,优先选择字符元多的句型,简称为“长词优先”。语言处理中,除了“长词优先”的原则外,应综合考虑语法、频率、联想、语调、重音、停顿、声调等多方面因素。语言是复杂的,在参考句型的基础上,可给出文体信息、引文信息、关联信息等,提高转换音标串为文字串的准确率。
“协同现象”不仅存在于语言理解中,也存在于视觉认知领域。但图象比语言更丰富,可以首先对图象进行各种预处理,再按某种规则识别图象的“图元”,按“图元”进行质数代换、位标记,实现对图象的快速查找和初步比较,与语言处理相似,在此基础上,可再对“图象”的结构,也就是“图元的语法”进行分析比较。生物的基因也是协同发挥作用,可以用相同方法处理,当然,发现基因之间具体的协同作用是生物学家的工作。基因是遗传信息的单位,类似地,其它信息处理中,也可以根据需要划分出各种“信息元”,进行“质数代换”“位标记”,实现快速查找和初步比较。本文件统称“字符元”、“图元”、“基因”“信息元”为“相似比较”“模式匹配”的“基元”,下面围绕语言处理来说明“索引查找”的原理,其它应用可以参考实现。
2.小字符集的“链式标记”、长字符串的“链式切分”“切分组合”处理
“模式匹配索引查找方法”是“质数代换”“位标记字符串检索技术”的从属技术,“位标记字符串检索技术”的要点有:
(1)标记可以用“1”标记,也可以用“0”标记,本文件均指“1”标记。
(2)设以数据的n个bit进行标记,如果用“1”标记,由于“重叠”,m个字符元的S标记后,位值可能有1、2、3…m个bit为“1”,其平均概率mb可用下式计算:
mb = n ( 1 - ( n - 1 n ) m )
Figure A200810086821D00072
(3)设标记所用位数为n,字符串S有m个字符元,标记后有mb个bit为“1”,检索关键词T有k个字符元,标记后有kb个bit为“1”。准确计算字符串位标记的筛选概率,应该用mb和kb计算,但mb与m、kb与k是正相关的,粗略地,可以直接用m和k进行计算,其值越小,筛选效果越好:
P li = C m k C n k = m ! k ! ( m - k ) ! n ! k ! ( n - k ) ! = m ! ( n - k ) ! n ! ( m - k ) !
影响筛选概率的三个因素中,用户检索时所用关键词T的长度k,数据库S的长度m是“不可控制”的,可控制的因素是标记所用的位数n。我们可以设想,如果max(m,k)=n,意味着Wn或Wt值全部bit为“1”,那么用Wt与Wn进行比较没有筛选作用;因此,必须让n值大于m和k,但是n值越大,存贮位值的空间需求越多。一般来说,使n≈2max(m,k)是适当的,设数据库字符串平均长度有70个字符元,如果是32位cpu,可用4个无符号长整数n=128标记。对于汉字这样的“大字符集”来说,容易处理,相应地将汉字分为128组,如果字符串S的某个字符元属于第i组,则将第i个bit置为1。正检索时,将T的位值Wt1同S的位值Ws1进行比较;若Wt1 & Ws1=Wt1,继续比较Wt2和Ws2,否则放弃;若Wt2 & Ws2=Wt2,继续比较Wt3和Ws3;若Wt3 & Ws3=Wt3,继续比较Wt4和Ws4,满足条件的记录进入R1,再用字符元逐位比较得到R2。其中某项Wt=0时,恒有0 & Ws=0,该项比较不起筛选作用,不必进行;起筛选作用的是Wt>0的项,就汉语来说,T通常2-6个字符元,如果随意分组,可能平均分布在4个Wt中,为减少比较的项数,可以将含“高频字符元”的组,适当集中在Ws1和Ws2中,则T标记后,“1”的bit比较集中在Wt1、Wt2,以减少比较次数,称为“高频配组”。在“字符元”数量为数百个、频率不均衡的数据库可以提高性能,如果“字符元”很多、频率低或比较均衡,该方法未必有效。
但拼音文字属于“小字符集”,英语仅有26或52个字符,直接以1个字母对应1个bit,当字符串m>60时,标记大量重叠,难以达到筛选目的,可以采用“链式标记”:26个字母有676种排列:aa、ab、_ac、…zy、zz,统计分析得到各种排列的频率,设数据库字符串平均为70个字母,用4个无符号长整数标记,则n有128个bit,将676种排列按频率均衡分为128组。设字符串为“changjiang”,按ch、ha、an、ng、gj、ji、ia、an、ng所属的组i,将相应第i个bit置为“1”,得到“changjiang”的位值。检索时,将S的位值Ws1、Ws2、Ws3、Ws4,同T的位值相应的项Wt1、Wt2、Wt3、Wt4进行比较,全部满足条件的记录进入R1,再用字符串逐位比较得到R2。如果考虑字符串中的符号和空格,则有更多的排列。对于很长的文本,也可考虑将“链式标记”的字符元设为3个字母的排列:aab、aab、aac、…zzy、zzz,统计频率,分组标记检索。
从另一方面考虑,也可以将长的字符串,切分为短的“句子”,分别标记,但切分没有明确的标准,为保证检索时不发生遗漏,可以“链式切分”,设字符串为:
qmbezskjtcytcdefjazysfkysdklasdflkqerqoifgqxsgipqwetxfgchpzrsdfcv
如果以n=64标记,则m以32为宜,设“链接长度”r=12,则字符串切分为:
qmbezskjtcytcdefjazysfkysdklasdf
sfkysdklasdflkqerqoifgqxsgipqwet
fgqxsgipqwetxfgchpzrsdfcv
应用中可根据情况设定n、m、r的大小。基因比对,可以把先把长DNA序列“链式切分”为“句子”,再进行“链式标记”。“链式切分”不仅可用于处理数据库的长字符串,也可用于处理语音输入逆检索中长的T。汉语句式比较短,通常小于15个字符元,所以用n=32进行标记处理是适当的,但书面语中也有下面的长句:
zhongguojingjidechixukuaisuzengzhangyizhishixifangjingjixuejiesuojinjinledaodemituan.
该句有28个音节,即28个P,对于32位的cpu,直接进行质数代换需要很大的整数数据类型,位标记则筛选效果很差,所以要进行切分处理。自然语言的停顿大体按意群进行,但计算机未必能很好地按停顿进行切分,采用“链式切分”可以避免这样的问题,如第一次切分1-15共15个音节,第二次切分10-24共15个音节,第三次切分19以后的音节。
zhongguojingjidechixukuaisuzengzhangyizhishixi
zengzhangyizhishixifangjingjixuejiesuojinjinle
xuejiesuojinjinledaodemituan.
对这样切分出来的3个片段,分别进行处理,从jxk中查找参考句型。一般来说,“津津乐道”、“西方经济学界”“经济增长”“持续快速增长”是计算机能判断转换的部分,句子处理为:
zhongguo经济de持续快速增长yizhishi西方经济学界suo津津乐道demituan.
下一步,将已转换的部分去除,得到下面拼音串:
zhongguodeyizhishisuodemituan
如果jxk中有:“中国是”“是迷团”“一直是”等搭配,则可处理为:
中国de一直是suode谜团
再合并被去除的已判断的部分:
中国经济de持续快速增长一直是西方经济学界suo津津乐道de迷团。
借助语法、词频、字频、前后汉字之间的“联想”,可将句子转换为:
中国经济的持续快速增长一直是西方经济学界所津津乐道的迷团。
语言处理中,对长语句也可以采用“切分组合”方式处理,如将上面语句切分为A、B、C三段,再组合为AB、AC、BC:
zhongguojingjidechixukuaisu+zengzhangyizhishixifangjingjixue
zhongguojingjidechixukuaisu+jiesuojinjinledaodemituan.
zengzhangyizhishixifangjingjixue+jiesuojinjinledaodemituan
对AB、AC、BC进行标记、代换,在jxk中查找参考句型。这种方式可以解决“远距离相关”,但如果最优参考句型的字符元恰好在分别在A、B、C中,则不能找到。
3.选择标记与不均衡分组标记
在“位标记字符串检索技术”中,对P采用“频率均衡分组”,以达到最好的筛选效果,但在某些特殊情况下,“不均衡分组标记”筛选效果可能更好。
我们知道,如果用不多的时间选拔数学好的学生攻读研究生,让线性代数、概率论题量较少,微积分、随机过程等难度大的数学题量较多,考试效果会更好。设想1个数据库,字符串平均长度m=24,如果用1个长整数“频率均衡分组”标记,因为m的中“1”的bit多,筛选效果不好;如果用2个长整数标记,W的空间是2倍,检索时位值比较的时间也是2倍。语言中字符元的使用频率是不一致的,部分字符元是高频的,筛选意义较低,部分字符元是低频,筛选意义较高,可以将频率30%的高频字符元分为1组,称为“堆叠组”,用1个bit标记;将其余频率p=70%的字符元分为31组,称为“控制组”,用31个bit标记,这些字符元,记为K;这样实际起筛选作用的是n=31、m*p=24*70%=16.8,可以改善性能。
如果把“堆叠组”去掉,不标记频率30%的高频字符元,仅用频率低的p=70%的字符元进行标记,就成为“选择标记”。下表是字符串为3个P时,选择不同比例的字符元为K时,字符串含K的概率:
 
比例 K P 累计 比例 K P 累计 比例 K P 累计
0.5 3 0.125 0.125 0.6 3 0.216 0.216 0.7 3 0.343 0.343
0.5 2 0.375 0.5 0.6 2 0.432 0.648 0.7 2 0.441 0.784
0.5 1 0.375 0.875 0.6 1 0.288 0.936 0.7 1 0.189 0.973
0.5 0 0.125 1 0.6 0 0.064 1 0.7 0 0.027 1
字符串为5个P时,选择不同比例的字符元为K时,字符串含K的概率:。
 
K P 累计 K P 累计 K P 累计
0.5 5 0.03125 0.03125 0.6 5 0.07776 0.07776 0.7 5 0.16807 0.16807
0.5 4 0.15625 0.1875 0.6 4 0.2592 0.33696 0.7 4 0.36015 0.52822
0.5 3 0.3125 0.5 0.6 3 0.3456 0.68256 0.7 3 0.3087 0.83692
0.5 2 0.3125 0.8125 0.6 2 0.2304 0.91296 0.7 2 0.1323 0.96922
0.5 1 0.15625 0.96875 0.6 1 0.0768 0.98976 0.7 1 0.02835 0.99757
0.5 0 0.03125 1 0.6 0 0.01024 1 0.7 0 0.00243 1
容易看出,进行选择标记,数据库字符串S及T都有一定概率不包含K,即W无值,如果标记时预设所有Wn=0,则标记后这些记录仍然Wn=0,所以检索方法需要调整。
A.正检索方法:
正检索中,检索关键词T中的P较少,就汉语来说,一般为2-6个汉字。设T=“方是学”,其中“方”“学”为非控制字符元,“是”为控制字符元K,用“是”标记,得到T的选择标记位值Wt。毫无疑问,包含“方是学”的S必定包含“是”,Wn值必定满足Wt & Wn=Wt或其等价变换式,通过比较筛选可以得到记录集R1。Wt & 0≠Wt,Wn=0的记录不会进入R1。下一步,将T或T的其它筛选值与R1中的记录进行字符元比较或其它筛选值运算得到R2。其它筛选值指另一组位值W或V、或质数乘积值F、或F的对数L。从上表可以看出,在选择70%的字符元作为K标记W值时,3个字符元的T,有97.3%的概率,含1-3个K,就是说Wt有值。
如果T=“方学”,均是非控制字符元,Wt无值,或Wt=0。设数据库中W=0的记录有“方学样”,均为非控制字符元;W>0的记录有“方学一”,其中“一”是K;这2条记录都包含T,但无法通过W值比较,将它们从数据库中筛选出来。就是说,当Wt无值,或Wt=0时,本轮筛选无意义,可以跳过,但下一步需要将T或T的其它筛选值同所有记录进行字符元比较或其它筛选值运算得到得到R2。在选择70%的字符元作为K标记W值时,3个字符元的T,有2.7%的概率不含K,其选择标记位值为Wt=0。应用中,筛选概率允许的情况下,p应取最大值,以降低T不含K的概率。
B.逆检索方法:
如果T=“方一样也是学”,选择标记位值为Wt,其中“一”“是”为K,“方”“样”“也”“学”是非控制字符元。包含控制字符元中“一”“是”中任何1个的记录的Wn同Wt做“和”运算,必然满足Wt & Wn=Wn或其等价变换式,通过比较筛选可以得到记录集R1。所有仅含非控制字符元组成的记录Wn无值或Wn=0,Wt & 0=0,也进入R1,位值比较不起筛选作用,所以Wn=0的记录多,当Wt>0时,是不利的。下一步,将T或T的其它筛选值与R1中的记录进行字符元比较或其它筛选值运算得到R2
如果T=“方样也学”,“方”“样”“也”“学”均为非控制字符元,选择标记位值为Wt=0,检索关键词T不含任何K,而Wn范围的记录至少有1个K,所以Wn范围的记录不可能被T包含,不可能是T的基本句型或参考模式,R1只能是Wn无值或Wn=0的记录。下一步,只需将T或T的其它筛选值与这些记录进行字符元比较或其它筛选值运算得到R2
就是说,逆检索中,如果适当降低p的大小,让Wt=0,则仅需检索Wn=0的记录的概率大;另一方面,p过少,Wn=0值的记录太多,当Wt有值时,是不利的。
正检索中当T的字符元k比较小时,“选择标记”后T中K的数量“kk”更小;逆检索中当S的字符元m比较小时,“选择标记”后S中K的数量“mk”更小,甚至为0;筛选效果不好。所以,“一般位值”W不提倡“选择标记”,“选择标记”的主要意义是减少位值的种类,进行“规划存贮”,选择字符元进行质数代换也是如此,见“综合利用”一节。
另外,上文提到,处理长字符串,为了减少W比较的项,进行“高频配组”,如果分组时,使Wn1中的各组频率略高于其它W项,则Wt1有值的概率也会稍大,是“不均衡分组标记”反向利用。处理长字符串,如果完全标记位值Wn有4个以上长整数,选择部分高频字符元进行标记,得到一组位值Wnk,检索时先用Wtk同Wnk比较,再用Wt同Wn进行比较也是可以的。
4.规划存贮
一个典型的语音输入数据库的参考句型库jxk包括以下信息:参考句型、拼音串、位标记值、频率以及语法信息,而语法信息又可包括参考句型各成分的词性、搭配之间是否可插入其它成分等。由于语言研究的不足,缺乏现代汉语句型资料,根据经验估计,参考句型及词语搭配,短则2个汉字,长则可能7、8个汉字。所以,测试时用10万多条两字词与4万多条三字词重复交叉,搭配成4,019,576条、每条5个汉字的“无意义”的参考句型,有20,000,000多个汉字,建成测试数据库,记为jxk。参考句型数据库应该有拼音串的字段,但拼音串的字段要占用许多空间,所以构造的jxk,对汉语的400多个音节,每个音节用一个汉字代替,如:“兴”代表xing。这样还避免了汉语拼音音节切分的问题,如fangan可切分为fang+an或fan+gan。下面是jxk的简单模式:
 
参考句型S 音节代字D 位标记值W
不比整行字 不比正兴字 5008
固化正对面 古花正对棉 5008
共识好杀戮 工是好沙卢 5123
歹心好比是 代心好比是 5123
入睡风化壳 如水丰花科 300032
奉公白尾鹿 丰工百微卢 300032
转告水驱比 专高水区比 300032
高唐公开化 高唐工开花 300032
可比唯心论 科比微心伦 300032
从这个局部看,“位标记”后,jxk中许多记录的位值W是相同的,“如水丰花科”“丰工百微卢”“专高水区比”“高唐工开花”“科比微心伦”5条音节代字D均有位值W=300032。检索中,重复进行5次Wt & 300032=Wt或Wt & 300032=300032判断,是不必要的。要提高检索速度,减少不必要的比较,方法是按位值Wn对jxk进行组织存贮,使每种位值Wn与关键词位值Wt只比较一次,或少数几次:
(1)双表处理
首先,对jxk进行按W进行组织存贮,用一般数据库的“聚集存贮”可以实现,但目的是将位值相同的记录存贮在相邻的空间,并不要求按W值的大小顺序存贮;当然,如果按W值中“1”的bit个数的多少进行排序,检索时,以T中“1”的bit个数的多少决定位值比较的起点也是有益的。第2步,对jxk,按位值分类汇总查询,生成位值索引表,记为syb。syb表中有字段“mark”,存贮“索引位值”,是用“分类汇总查询”从jxk去除“一般位值”W的重复项提取出来的,记为V,仅为说明方便,与W无本质区别;在syb表中给出字段“jishu”,是各“索引位值”V在jxk中出现的数量;再在syb中增加地址字段“pJuzi”,给出各“索引位值”V,在jxk中第1条记录的地址。流程参见附图1。
syb比较大,我们用类似下面语句查询分析syb中V值的分布状况:
SELECT CEILING(jishu/10)AS zu,COUNT(jishu)AS zucountFROM syb GROUP BYCEILING(jishu/10)ORDER BY CEILING(jishu/10)
适当修改上面语句,继续查询得到下表:
 
zu zucount zusum sum/count
0 12047 92724 7.696854
1 115195 1718311 14.91654
2 54509 1265775 23.22139
3 15717 533223 33.92651
4 6804 296596 43.59142
5 1699 90367 53.18835
6 294 18472 62.82993
7 48 3529 73.52083
8 7 579 82.71429
206320 4019576 19.48224
检索方法:设关键词T音节代字Dt为“卢仙儿花”,标记后索引位值Vt=5648,以Vt与syb表中全部的“索引位值”Vn进行位比较,得到满足Vt & Vn=Vt或其等价变换条件的记录集Rv,syb中共有28个“索引位值V”满足这个条件,见下表:
 
mark jishu pJuzi mark jishu pJuzi
5648 27 0x00732AC8 136720 13 0x009D56F8
5649 8 0x00732C78 267792 18 0x00AD3B98
5650 16 0x00732CF8 529936 21 0x00C179D8
5652 19 0x00732DF8 1054224 10 0x00D9D588
5656 22 0x00732F28 2102800 23 0x00F9B298
5680 8 0x00733418 4199952 16 0x011F0D28
5712 6 0x00733858 8394256 10 0x014AD588
5776 22 0x00733F08 16782864 15 0x017CFDF8
5904 11 0x00734758 33560080 16 0x01BB1F08
7696 13 0x00744428 67114512 30 0x0204F728
13840 15 0x00799338 134223376 17 0x02597DB8
22032 15 0x007ED168 268441104 17 0x02BBFF98
38416 19 0x00868958 536876560 19 0x032CF648
71184 17 0x0090BBE8 1073747472 15 0x03B011C8
对每一个满足条件的Vn,根据地址pJuzi,在jxk中定位到该位值Vn的第1个句型。从syb可知,jxk中,Vn=5648的记录有27条,第1个句型的地址是0x00732AC8,在定位到该记录后,用关键词音节代字Dt“卢仙儿花”与该记录的音节代字Dn进行逐字符匹配,确定该记录是否符合条件。读取下一条记录,用Dt同Dn进行逐字符匹配,确定是否符合条件。继续这一过程,直到第27条记录。
处理完Vn=5648记录后,根据syb,Vn=5649的记录有8条,第一条记录的地址为0x00732C78,定位后,用Dt同Dn进行逐字符匹配,确定该记录是否符合条件。继续这一过程,直到第8条记录。
类似地,处理其它V值,直到最后的V=1073747472的第15条记录。
测试结果:cpu为赛扬800,用VC独立编程,进行“逆检索”,当T为7-15个字符元时,用时多在0.1-0.5秒,有时超过1秒。为了获得稳定的检索效果,对jxk用“另一种字符元分组方案”进行位标记,得到各记录的位值W。检索时,先在syb用Vt & Vn=Vn进行筛选,得到Rv,Rv所有jishu的汇总为R1;按地址定位后,再用Wt & Wn=Wn进行筛选,满足条件的记录为R2;再对R2范围的记录的Dn与Dt进行字符比较,得到结果集R3,用时多在0.1-0.5秒,最快0.01秒,也有超过0.7秒,主要决定于T的长度k的大小,结果集本身大小也是一个因素。正检索可以用Vt & Vn=Vt、Wt & Wn=Wt或等价式进行筛选。
(2)单表处理
双表处理是一个参考句型表jxk,一个位索引表syb,实际还有一个音节信息表yjb,包含汉语拼音的400多个音节的音节代字、统计频率、标记分组、基本位值、代换质数等信息。单表处理处理,同样有音节信息表yjb,但将参考句型表jxk与位索引表syb合并为一个表syjxb:
先将索引表syb扩充,增加D1至D10十个字段,S1至S10十个字段等,即成为syjxb的架构。然后,写一段代码将参考句型库_jxk中的信息读出并写入该表。如,对于位值V=526406的记录,在jxk中找到位值W=526406,读入该位值的10条记录的句型信息,相应地写入各字段中。如果参考句型库jxk中位值W=526406的记录只有7条,则只填入D1至D7,S1至S7等字段,其余空白。如果参考句型库jxk中位值W=526406的记录超过10条,则在syjxb中插入另一个V=526406的记录,写入参考句型库jxk中位值W=526406的记录中其他记录的信息,以此类推。当然,V=526406后也可以是8个或11个字符串。下面是syjxb的局部:
 
索引V D1 D2 ... D8 D9 D10 S1 ...
526406 男收林把丘 切几一京在 ... ...
526408 分门辟究观 牛爱枪间帆 ... 收只内在没 写闰枪收火 林亲只幺在 ...
526409 辟是内在没 里收是究分 ... ...
526410 松写收幺钻 在几写京闻 ... 京光昏宁几 爱代分光京 辟幺宁几里 ...
526412 瓜火钧须观 内亲端里没 ... 把枪盘只闻 只闻端里没 更须盘只闻 ...
526416 间切间里仙 辟林准间正 ... 周究收火厅 娃里周闻间 京在仙另辟 ...
526417 亲间民正厅 闻另林产是 ... ...
526418 幺头闻代林 亲代周里京 ... 几收次头京 ...
关键词音节代字Dt,标记后位值为Vt,正检索,以之与syjxb表中的“索引位值”Vn进行位比较,得到满足Vt & Vn=Vt或者其等价变换条件的记录集Rv;对于Rv中的每一个V值,以关键词音节代字Dt与其后的D1至D10进行模糊匹配,找出满足条件的Dr。如果是逆检索,则应检查满足Vt & Vn=Vn的V值后的D1至D10,找出满足条件的Dr,以之确定Sr为参考句型。要注意的是可能同时有数个Dr或Sr符合条件。
单表处理,数据结构及编程没有双表处理清晰。如果对jxk组织存贮后,在每个位值的第1个记录,给出信息,指明该位值记录的数量及下一个位值的地址,也是可以的。
从减少V值比较时间出发,我们提出规划存贮。另外一点,从上面的V值分布表可以看出,有12074种V值只有92724条记录,平均每个位值仅有7.696854条记录,进行聚集索引,这些记录将分布在其它V值之间,当数据库很大,不能全部装入内存,检索需要从硬盘读取数据时会增加寻道定位时间,如果n=31,可以考虑令这些记录的位值Vn=231=2147483648,称为“位值归并”,笼统归并不是最好的选择,可以根据记录的大小、硬盘的性能进行细致的“位值归并”,原则是只增加某个Vn值中“1”的bit的个数,而不减少“1”的个数。当然,采取措施将这些记录保存在硬盘相邻的域,或者强制这些记录常居内存,就不必进行“位值归并”。
5.缩位标记
构造的全部为五个音节的jxk,记录条数4,019,576条。以长整数的31个bit进行标记,因为有重叠,标记后位值可能为1、2、3、4、5个bit,所以位值理论上有206367种,实际统计为206320种,每种V值平均对应的参考句型为19.48条,206320次Vt & V11=Vt位值比较所用的时间是微不足道的,而V的分布也比较理想,筛选效果也良好。如果参考句型中主要是6个字符元的基本句型,标记后,理论上索引位值V有942648种,942648次Vt & Vn=Vt位值比较所用的时间,在赛扬800的cpu中用时约0.1秒,设数据库仍然是4,019,576条记录,规划存贮索引查找仍能提高响应速度。但是,如果jxk中有相当多的7个字符元以上的句型,理论上索引位值V有3572223种,规划存贮索引查找就没有什么意义。语言多种多样,有些语言由于本身的特点,构成语句的字符元可能比较多,提炼出来的基本句型的字符元必然也多,标记后索引位值V种类相应增多,直接使用规划存贮索引查找不能发挥作用。
从组合公式可知,m一定时,降低n值,可以降低组合的种类,下表是n=31和n=24时,m取值1-10的组合数:
 
m C(31,m) 组合累计 4000000 m C(24,m) 组合累计 4000000
1 31 31 129032 1 24 24 166667
2 465 496 8064.52 2 276 300 13333.3
3 4495 4991 801.443 3 2024 2324 1721.17
4 31465 36456 109.721 4 10626 12950 308.88
5 169911 206367 19.3829 5 42504 55454 72.1319
6 736281 942648 4.24337 6 134596 190050 21.0471
7 2629575 3572223 1.11975 7 346104 536154 7.46054
8 7888725 11460948 0.34901 8 735471 1271625 3.14558
9 20160075 31621023 0.1265 9 1307504 2579129 1.55091
10 44352165 75973188 0.05265 10 1961256 4540385 0.88098
从表中可以看出:当字符串长为7个字符元时,标记后,位值可能有1-7个bit为“1”,当n为31时,V值为3572223种;当n为24时,V值为536154种。n=24的方案的V值数量大为减少。因此,如果组织存贮需要,可以适当减少标记V值所用的bit数n。
正检索时,数据库的字符串一般较长,而T一般较短;逆检索时数据库的字符串一般较短,而T一般较长。调整n的大小,应分辨正检索、逆检索,考虑数据库字符串的平均长度、T的平均长度、记录的数量、内存的多少来决定。n小,V值的种类少,首先,进行比较筛选用时少;其次,根据V对jxk聚集存贮索引,每一连续区域中的记录就多,若数据库很大,不能全部装入内存,检索需要从外存读取数据时,可以减少磁头寻道和定位的时间。但m、k一定时,n小,筛选效果不好。设数据库及关键词均用“1”标记,标记所用位数为n,S有m个字符元,检索关键词T有k个字符元,逆检索的概率精确计算应该考虑重叠概率,但可以用下式粗略地计算:
P = C m k C n k = k ! m ! ( k - m ) ! n ! m ! ( n - m ) ! = k ! ( n - m ) ! n ! ( k - m ) !
按该公式,当句型长m为7时,检索关键词长为k,位标记所用bit数n=31和n=24时逆检索的概率如下:
 
n k m p n k m p
31 10 7 4.5635E-05 24 10 7 0.000347
31 12 7 0.00030119 24 12 7 0.002288
31 14 7 0.00130515 24 14 7 0.009916
用31个bit标记,如果T有k=14音节,位值比较后筛选概率为0.00130515·用24个bit标记,如果T有k=14音节,位值比较后筛选概率为0.009916,就是说,进入R1的记录接近31个bit标记的7.6倍。如果jxk有400万条记录,31个bit标记,V值为3572223种,不缩位,需要进行3572223种次位值比较,R1有4000000*0.00130515=5521条记录,采用另一组31个bit标记值W进行二次筛选,则R2有5521*0.00130515=7.2条记录需要进行字符元比较。用24个bit标记,V值为536154种,V值比较筛选后R1有4000000*0.009916=39664条记录;采用另一组31个bit标记值W进行二次筛选,则位值比较的总次数为536154+39664=575818,节省的位比较次数3572223-575818=2996405;R2有39664*0.00130515=51.8条记录需要进行逐字符比较,增加51.8-7.2=45记录,可以忽略不记。可以看出,适度“缩位标记”得到V值进行组织存贮是有益的。
6.质数代换索引查找
一般来说,用“位标记”进行“索引查找”,因为位运算速度快,但“质数代换”也有可取之处,当k和m都比较少时,“质数代换”筛选效果更好:如用30个质数进行代换,当记录m=5,k=1时,整除筛选概率P=15.59%;T含2个K时,整除筛选概率P=2.01%。用质数进行“选择代换”,为避免溢出或使用大的数据类型处理,要求p小,但p小,正检索时,Ft无值的概率会高,无效;逆检索时,Fn无值的概率会高,进入R1的记录多,增加下一步筛选的负担。
应用中,可以把“选择代换”Fn无值的记录,处理为Fn=1,相当于Wn=0;另外,正检索中,可以把Fn值溢出的记录处理为Fn=0,相当于W=2n。检索方法与位标记类似:正检索,当T中含K,Ft有值,Fn%Ft=0的记录有效,进入R1;Fn溢出或处理为Fn=0的记录,进入R1,进行下一步处理;Fn无值处理为Fn=1的记录不进入R1。当T中不含K,Ft无值或处理为Ft=1,恒有Fn%1=0,质数代换筛选无效,跳过本过程,下一步处理全部记录。当T中K太多,Ft溢出,下一步只对Fn溢出或处理为Fn=0记录进行处理,其它记录Fn<Ft,不必处理。逆检索,当T中含K,Ft有值,Ft%Fn=0的记录有效,进入R1;Fn无值或处理为Fn=1的记录Ft%1=0,进入R1;对R1进行下一步处理。Fn溢出的记录Fn>Ft,不必处理,如果强行处理为Fn=0,不能进行除法判断,也不必处理。当T中不含K,Ft无值或处理为Ft=1,则Fn无值或处理为Fn=1的记录,进入R1,进行下一步的处理:Fn溢出的记录Fn>Ft,不必处理,如果Fn被处理为Fn=0,不能进行除法判断,也不必处理。当T中K太多,Ft溢出或处理为Ft=0,0%Fn=0,下一步处理全部记录。
如果用“质数代换”进行“规划存贮”,还要考虑F的种类的多少,n个质数m次乘积值F的种类有:
Figure A200810086821D00171
个。30个质数5次乘积有278256种,6次乘积有1623160种。一定的选择比例p,长为m的S中,mk主要分布在数学期望m*p附近,如果S中的K超过6个的概率很小,则F值种类可以小于2,000,000,主频800m的cpu进行整除判断用时约100-200ms,而筛选概率良好,对于记录多的数据库可以用于组织存贮。
除法指令用时多,被除数超出指令允许长度,用时更多,这就对质数的大小和数量m有限制。32位cpu,有被除数是64位的指令,最大被除数是power(2,64)=1.84467E+19,如果质数代换使用n=20个质数,最大质数是71,power(71,10)=3.26E+18,power(71,11)=2.31122E+20,就是说字符串最多只能m=10个P,按中间质数29计算,字符串最多只能m=13个P。
64位cpu,最大被除数是power(2,128)=3.40282E+38,字符串允许的P可以较多。正检索中,如果数据库P平均m≤12个,可以用257个质数代换,当T的k≤3时,整除判断筛选效果远超过“位标记”,k>3时,“位标记”的筛选效果也足够好,“质数代换”就没有多大意义,257质数的F值种类非常多,不能进行“规划存贮”,但可以用于“一般代换”或“选择代换”。
 
质数量 最大质数 允许m 中间质数 允许m
32bit 20 71 10 3.26E+18 29 13 1.03E+19
32bit 24 89 9 3.50E+17 37 12 6.58E+18
32bit 32 131 9 1.14E+19 53 11 9.27E+18
32bit 50 229 8 7.56282E+18 97 9 7.60231E+17
64bit 20 71 20 1.06E+37 29 26 1.05E+38
64bit 24 89 19 1.09E+37 37 24 4.33E+37
64bit 32 131 18 1.29E+38 53 22 8.59E+37
64bit 257 1621 12 3.29152E+38 719 13 1.37238E+37
乘除运算可以用对数和幂运算实现,设Sa的质数乘积Fa的r为底的对数为La,Sb的质数乘积Fb的对数为Lb,如果power(r,(La-Lb))是整数,则Fa能被Fb整除,Sa包含或可能包含Sb的全部字符元。对数可以处理较长的字符串,但由于浮点运算会造成误差,即使Fa能被Fb整除,power(r,(La-Lb))也可能不是整数,设
Δ=abs(power(r,(La-Lb))-round(power(r,(La-Lb))))
如果Δ比较小或Δ/power(r,(La-Lb))比较小,可以认为Fa能被Fb整除。但这个方法有不足:首先,一般来说,幂运算不比整除或模运算省时,而且判断幂值是否为整数又需用时,所以不推荐使用;其次,必须确定误差Δ多大为允许程度,即使取值适当,也可能有一些误判;第三,double只有15位有效数字,long double只有19位有效数字,当power(r,(La-Lb))大时,低位可能舍去,误判更多乃至无法判断。如果采取软件或硬件方法,增加有效数字长度,或者幂运算中舍去高位保留低位,用L处理长字符串是有益的。
用L值处理质数选择代换,如果Sn、T不含K,则Ln、Lt无值,可以处理为Ln=0、Lt=0。检索方法与位标记类似,正检索,当T中含K,Lt有值,Ln-Lt≥0且power(r,Ln-Lt)为整数的记录有效,进入R1;Ln无值或处理为Ln=0的记录不进入R1。当T中不含K,Lt无值或处理为Lt=0,恒有power(r,Ln-Lt)=power(r,Ln)为整数,幂运算筛选无意义,跳过本过程,进行下一步处理。
逆检索,当T中含K,Lt有值,Lt-Ln≥0且power(r,Lt-Ln)为整数的记录有效,进入R1;Ln无值或处理为Ln=0的记录power(r,Lt-0)=power(r,Lt),进入R1;对R1进行下一步处理。当T中不含K,Lt无值或处理为Lt=0,Ln无值或处理为Ln=0的记录Lt-Ln=0,进入R1,进行下一步处理。
7.综合运用
我们分别说明了选择标记、缩位标记、规划存贮的方法及用质数代换实现的要点,为了达到良好的效果,可以把各种方法综合运用。一个数据库的特点决定于3方面:字符串平均长m、检索关键词T的长度期望值k、记录数量r。选择标记存贮索引方案决定于4方面:标记的bit数n、选择标记K的比例p,选择标记多少组K及组织方式。
长m的字符串可能有0-m个K,但K的数量mk主要分布在数学期望m*p附近,以n≈m*p*2或n<m*p*2标记,Rv最大为2n,当p不大时,mk分布偏于较m*p小的一侧,且标记有重叠,下面粗略计算取 R v &ap; ( &Sigma; i = 0 m * p C n i ) * 1.5 .
Vt有值的概率 P = &Sigma; i = 1 k C k i p i ( 1 - p ) k - i
由于m*p和k*p有小数,根据n!=Γ(n+1),将筛选概率公式修改为 P &ap; C m * p k * p C n k * p = ( m * p ) ! ( n - k * p ) ! n ! ( m * p - k * p ) ! = &Gamma; ( m * p + 1 ) &Gamma; ( n - k * p + 1 ) &Gamma; ( n + 1 ) &Gamma; ( m * p - k * p + 1 )
如果位值种类Rv<r/10,Vt有值的概率P>90%,筛选概率P<10%,那么这个方案是理想的,但当m比较大时,不易实现。
下面大体分位标记正检索、逆检索、质数代换来说明综合运用的主要方法,应用中可以根据数据库、T、硬件条件做修改调整。
(1)如上所述,测试数据库jxk采用全部P标记得到的V值206320种,直接进行“规划存贮”,效果比较理想,不需要进行“选择标记”,但为了说明“选择标记”“规划存贮”结合的方法,选择p=50.976%的142个中等频率的P进行n=31标记后,查询生成syb:
insertinto syb selectkmark,count(kmark)as jishufrom jxkgroup by kmark
进一步查询分析syb中各V值的jishu分布状况:
SELECT CEILING(LOG10(jishu))AS zu,COUNT(jishu)AS zucount FROM sybGROUP BY CEILING(LOG10(jishu))ORDER BY CEILING(LOG10(jishu))
适当修改上面语句,继续查询得到下表:
 
zu zucount zusum sum/count
0 51258 51258 1
1 24958 79601 3.189398
2 27720 543390 19.60281
3 4495 1258386 279.9524
4 465 1310796 2818.916
5 31 651555 21017.9
6 1 124590 124590
108928 4019576 36.90122
V种类为108928种,平均每个位值对应的基本句型为36.9条。其中第6组有124590条记录,仅有1种位值V=0,也就是无控制字符元K的记录;第5组有31种位值,是仅有1个bit为“1”的V值,此类记录有651555条,平均每种V值21017.9条记录。总的来说,“选择标记”V值分布不如“完全标记”V值分布均衡,筛选效果较差,但测试表明,该方案也是有效的。
选择标记,p越大,Vt>0概率越大,但数据库Vn的种类越多;p越小,数据库Vn的种类越小,但Vt=0的概率越大,直接进行下一步处理的概率也越大。
(2)使用“完全标记位值”“选择标记位值”均可进行规划存贮,因为标记有一定概率的重叠。当正检索,T标记后的V值中“1”的bit比较少时,逆检索,数据库S标记后的V值中“1”的bit比较少时,筛选效果不好,所以数据库中应给出另一组“完全标记位值”W做第2次筛选,使用“选择标记位值”进行“规划存贮”尤其必要,检索代码参见具体实施方式部分。用F或L等其它筛选值做2次或3次筛选也是可以的。
(3)如果内存足够的多,追求更稳定的性能,可以用两组“完全标记位值”或“选择标记位值”组织存贮:第1组标记位值为V1,并按V1对jxk组织存贮得到v1jxk,并产生v1syb;第2组标记位值为V2,并按V2对jxk组织存贮得到v2jxk,并产生v2syb。检索中,如果标记后,V1t中“1”的bit较多,则按v1syb定位到v1jxk;V2t中“1”的bit较多,则按v2syb定位到v2jxk。再检查Wt&Wn=Wt,这是用空间换取时间。
(4)也可以不组织存贮jxk,而按V1对W或F、L等其它筛选值进行组织得到v1w表,将jxk相应记录的地址链接到v1w表W或F、L后;再按V2对W或F、L等其它筛选值进行组织得到v2w表,将jxk相应记录的地址链接到v2w表的W或F、L后。检索时,如果V1t中“1”的bit较多,则按v1syb定位到v1w,检查W或F、L等其它筛选值,对于满足条件的值,定位到jxk进行字符匹配;如果V2t中“1”的bit较多,则按v2syb定位到v2w,检查W或F、L等其它筛选值,对于满足条件的值,定位到jxk进行字符匹配。
(5)也可以用V1、V2互相组织,尤其是对长字符串需要用选择标记位值互相组织。选择一定比例的字符元K1、K2,如各占30%;按V1值组织存贮V2值,不去除重复V2,也可以说是W2,将jxk相应记录的地址链接到V2后,得到v1v2表,查询v1v2产生v1syb;按V2值组织存贮V1值,不去除重复V1,也可以说是W1,将jxk相应记录的地址链接到V1后,得到v2v1表,查询v2v1产生v2syb。组织存贮流程参见附图1。
检索时,如果V1t中“1”的bit较多,则检索v1syb得到R1,对满足V1t & V1n=V1t条件的V1n值,按地址定位到v1v2得到R2,再按满足V2t & V2n=V2t的V2n值的地址,定位到jxk中,进行字符元比较或检查W或F或L等其它筛选值得到R3。如果V2t中“1”的bit较多,则检查v2syb、v2v1表,定位到jxk中,进行字符元比较或检查其它筛选值得到R3。V1t、V2t之一为0,第2步不起筛选作用,可以跳过。V1t与V2t同时为0,直接定位到jxk中检查,进行字符元比较或检查其它筛选值得到R3。检索流程参见附图2。互相组织存贮的是V1、V2,jxk可按其它需要排序,所以语音输入逆检索中,jxk可以按P的多少进行降序排列。
设有英语字符串数据库有30,000,000条记录,字符串平均长80个字符,用2个字母“链式标记”,则有79个“字符元”,以4个长整数标记W值为宜;检索关键词T越长,筛选效果越好,这里设T为2个单词,12个字母,则有11个字符元。下表是设以p=14%和p=20%,n=20和n=22进行选择标记的各项指标:
 
m k p m*p k*p P(Vt>0) n Rv P(Vt&Vn=Vt)
79 11 0.2 15.8 2.2 0.914 20 1569382.5 0.5843
79 11 0.2 15.8 2.2 0.914 22 6215905.5 0.4708
79 11 0.14 11.06 1.54 0.810 20 1188274.5 0.3946
79 11 0.14 11.06 1.54 0.810 22 3732999 0.3400
4个方案都不理想,设以p=14%,n=22的方案选择两组K1、K2,分别对jxk进行标记,得到V1、V2,用V1、V2互相组织。V1t和V2t同时无值的概率为(1-0.8097)*(1-0.8097)=3.62%;V1t和V2t同时有值的概率为0.8097*0.8097=65.56%,筛选概率为0.34*0.34=0.1156。检索平均V值比较次数0*3.62%+3732999*30.82%+(3732999+0.34*30,000,000)*65.56%=10,284,984;平均V值筛选概率1*3.62%+0.3400*30.82%+0.1156*65.56%=21.68%。对进入该范围的记录用地址定位后,以W或F或L进行下一步筛选。
(6)“分级组织”,设以V1为第1级,V2为第2级,对jxk组织存贮,让V1相同而且V2相同的记录存贮在邻近的区域,就是用V1划分大区,再在其中按V2划分小区;生成v2syb,表中V2是按V1组织的,并给出jxk中该V1和V2的记录数量jishu2、第1条记录的地址。生成v1syb,给出v2syb中该V1所属的V2的数量jishu1及第1个V2的地址;还可以给出jxk中V1相同的全部记录的数量jishu,及V1相同第1条记录的地址,这样,当V2t=0时,可直接定位到jxk进行检索。“分级组织”,应该让第1级的筛选效果比第2级好。但只有k*p比较大,筛选概率才好,所以要求p大,但p大则m*p大,要保证筛选概率,则n也必须大,V的种类就多,V1与V2交叉后非常大,只有记录特别多的数据库便于采用。
对于字符串长、记录多的数据库可以给出更多的V3、V4进行互相组织、分级组织。总的来说,长字符串不便于规划存贮索引,如果前后文相关性低,可以切分为“短句”后,进行规划存贮索引。
上面所说的各种方法,运用到逆检索时,应根据数据库、T的特点进行调整。1.就汉语来说,参考句型一般为3-7个汉字,用全部字符元、n=31标记后,V值种类不超过3572192条,可以直接组织存贮。2.选择标记,jxk中S的字符元一般比较少,p过少,则进行选择标记后,mk更小,如果用位标记进行筛选,效果不好,可以用质数代换进行筛选,注意的是,如果T的kk大,Ft可能溢出。3.逆检索中,T的字符元比较多,选择标记后“1的bit”即kkb≥4的概率大,但数据库中标记重叠后“1的bit”即mkb≤3的概率比较大,影响筛选效果。如果同时用2种方案标记,可以这样安排,用1种方案标记后,得到mkb≥4的索引表syb1,对jxk中mkb≥4的记录组织存贮,生成syb1;对mkb≤3的记录用另1种方案进行标记,并组织存贮,生成syb2;检索时,用两种方案对T进行标记,分别按syb1、syb2定位到jxk。用这种方式标记两组“一般位值”W,在程序中指明两种W值的交接点也可以改善性能。3.逆检索中,汉语约有几万个“字”和“词”,m≤3,用第4点也不能获得良好的筛选效果,增加字符比较的时间,可以分表处理:在jxk中,保留所有“跨音节协同”词句、少数高频词、每个音节的1-2个高频字,将其余“字”和“词”另建一表jxk2,由于无“跨音节协同”,可以用通常的索引方法查找。按“长词优先”的原则,尽可能运用jxk对T处理,如果处理不彻底或用户认为处理不正确,再查找jxk2,供用户选择。6.对mk’≤3的记录也可以采用“多bit标记”,或质数代换处理,这两种方法要求“短字符串”,可以运用“链式切分”将T处理成“短句”,由于无“跨音节协同”句型,对T切分一般不会造成影响。
“位标记”的各种综合运用方法,也适用于“质数代换”。“质数代换”重点关心的是溢出,不是筛选概率,用两种方案进行可以这样:正检索,数据库平均m不太大时,首先用1种方案代换得到F1,然后将F1值溢出的记录用另1种方案代换得到F2,这样用2种方案代换,能让更多的记录F有效;m大,2种方案代换均溢出的记录,令F=0,进入下一过程处理;同样可以用一个表处理,要注意F1、F2值记录的交接点。当数据库平均m比较大时,选择2组K1、K2方案进行“质数代换”,K2方案应尽可能覆盖F1无值和F1值溢出的记录。如果数据库m长短不一,可以分为2个表处理,m短的记录用32或64bit整数存贮F值;m长的记录用128bit或更多bit的整数存贮F值,或转换为L值,或用W、V处理。
如果用50个质数代换,按中间质数97计算,允许9个字符元。汉语语音输入逆检索中,如果T的k=16,选择p=50%的K进行“质数代换”,93.2%的概率T的kk<10,不溢出。如果T的k=20,选择p=40%的K进行“质数代换”,75.5%的概率kk<10;用2组K进行代换,Ft不溢出的概率就比较大。汉语基本句型在2-7个字符元,p=50%,mk≤4的概率很大,乘积种类为 &Sigma; i = 1 4 C 50 + i - 1 50 - 1 = 316250 , 是可以组织存贮的。
当然,也可以用两种质数代换方案进行“分级组织”,“质数代换”也可以与“位标记”结合使用,进行互相组织、分级组织,如第1级用F值筛选,第2级用V值筛选,是否采用,应根据数据库和T的特点分析决定,不必做无益的复杂化处理。
附图说明
图1是位标记存贮索引、互相组织存贮索引流程图
图2是互相组织存贮索引正检索流程图
具体实施方式
本文件说明了多种存贮索引方案,应用中可根据数据库的特点以及硬件环境选择实施,下面是VC中通过的“选择标记存贮索引”正检索和逆检索代码,其它方案可以参照实现。
说明:jxk有4,019,576条记录、每条记录5个P,选择频率p=50.976%的142个中等频率的音节为K,进行n=31标记。weizhi是选择标记索引位值V,weizhi2是完全标记位值W,做第2次筛选。在赛扬800Hz的CPU上测试,逆检索T长度k=7-15的参考句型,响应时间一般为0.1至0.5秒,可以快至0.01秒。
#include<fstream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
FILE*fpjx;
FILE*fpyj;
FILE*fpsy;
bool mushi;//正检索为0,逆检索为1;
struct Yjfz{//汉语音节标记记录
       char pinyin[7];
      char daizi[3];
      int mark;
      int mark2;
};
struct Juzi{//参考句型记录
       char daizi[11];
       int mark;
};
struct Sybrd{//索引记录
       int mark;
       int jishu;
       Juzi*pJuzi;
};
   Juzi jxb[4019576];
   Juzi*pjxb;
   Yjfz yjb[400];
   Yjfz*pyjb;
   Sybrd syb[108928];
   Sybrd*psyb;
void main()
{
   mushi=1;
   pjxb=jxb,pyjb=yjb,psyb=syb;
   clock_t start,end;
   if((fpjx=fopen("f:\\ceshi\\pyzpmxin","rb"))==NULL){
    printf("不能打开句型文件\n");
    return;};
     fread(jxb,sizeof(Juzi),4019576,fpjx);
   if((fpsy=fopen("f:\\ceshi\\pyzpmidxin","rb"))==NULL){
     printf("不能打开索引文件\n");
     return;};
      fread(syb,sizeof(Juzi),108928,fpsy);
   if((fpyj=fopen("f:\\ceshi\\pyzpmyjxin","rb"))==NULL){
     printf("不能打开音节文件\n");
     return;};
      fread(pyjb,sizeof(Yjfz),400,fpyj);
   char text[31];
   char texttemp[3];
   texttemp[2]=′\0′;
   cout<<"输入查询语句:"<<end1;
   cin>>text;
   int r1jishu=0,r2jishu=0,r3jishu=0;//统计记录集的大小
   do{
    start=clock();
     int weizhi=0,weizhi2=0;
    for(intr=0;r<400;r++){
       if(strstr(text,yjb[r].daizi)>0)
       {weizhi=(weizhi|yjb[r].mark);
           weizhi2=(weizhi2|yjb[r].mark2);
       }
 };
if(mushi==0)//正检索
 {if(weizhi==0)//T中无控制字符元
  {for(register int i1=0;i1<4019576;i1++)
    {if((jxb[i1].mark & weizhi2)==weizhi2){
           for(unsigned int j1=0;j1<strlen(text);j1=j1+2){
             strncpy(texttemp,&text[j1],2);
             if(strstr(jxb[i1].daizi,texttemp)==NULL){//strstr处理汉字偶尔有误
                 goto Loop1;
             };};
             cout<<jxb[i1].narj<<jxb[i1].daizi<<endl;
           r3jishu++;
         };
          Loop1:;};
  }
  else{//T中有控制字符元
    for(intk2=0;k2<108928;k2++){
      if((syb[k2].mark & weizhi)==weizhi)//检查索引位值
     {r1jishu=r1jishu+syb[k2].jishu;
       for(inti2=0;i2<syb[k2].jishu;i2++){
        if(((syb[k2].pJuzi+i2)->mark & weizhi2)==weizhi2){
             r2jishu++;
             for(unsigned int j2=0;j2<strlen(text);j2=j2+2){
              strncpy(texttemp,&text[j2],2);
              if(strstr((syb[k2].pJuzi+i2)->dajzi,texttemp)==NULL){
                 goto Loop2;
             };
           };
             r3jishu++;
           cout<<(syb[k2].pJuzi+i2)->mark<<(syb[k2].pJuzi+i2)->daizi<<end1;
         };
        Loop2:;
       };};};};
 }
else{//逆检索
     if(weizhi==0){//T中无控制字符元
        for(int i3=0;i3<syb[0].jishu;i3++){
        if((jxb[i3].mark & weizhi2)==jxb[i3].mark){
            for(unsigned int j3=0;j3<strlen(jxb[i3].daizi);j3=j3+2){
               strncpy(texttemp,&(jxb[i3].daizi[j3]),2);
               if(strstr(text,texttemp)==NULL){
                  goto Loop3;};
             };
              cout<<jxb[i3].mark<<jxb[i3].daizi<<end1;
               r3jishu++;};
        Loop3:;};
      }
      else//T中有控制字符元
      { for(register int k4=0;k4<108928;k4++){
         if((syb[k4].mark & weizhi)==syb[k4].mark){
           r1jishu=r1jishu+syb[k4].jishu;
           for(int i4=0;i4<syb[k4].jishu;i4++){
            if((((syb[k4].pJuzi+i4)->mark)& weizhi2)==((syb[k4].pJuzi+i4)->mark)){
                 r2jishu++;
                 for(unsignedintj4=0;j4<strlen((syb[k4].pJuzi+i4)->daizi);j4=j4+2){
                     strncpy(texttemp,&((syb[k4].pJuzi+i4)->daizi[j4]),2);
                     if(strstr(text,texttemp)==NULL){
                           goto Loop4;};
                  };
                  cout<<(syb[k4].pJuzi+i4)->mark<<(syb[k4].pJuzi+i4)->daizi<<end1;
                    r3jishu++;
                    Loop4:;
           };};};};};
 };
  end=clock();
  cout<<(end-start)<<end1;//用时
  cout<<"R1"<<":"<<r1jishu<<end1;
  cout<<"R2"<<":"<<r2jishu<<end1;
  cout<<"R3"<<":"<<r3jishu<<end1;
  r1jishu=0,r2jishu=0,r3jishu=0;
  cout<<"输入查询语句:"<<end1;
  cin>>text;
 }while(strcmp(text,"*")!=0);
}

Claims (6)

1.一种模式匹配索引查找方法,其特征在于对数据库模式按基元进行位标记或质数代换,得到模式的位值Vn或质数乘积值Fn或Fn的对数Ln;将数据库记录或记录的其它筛选值,按Vn或Fn或Ln组织存贮,并得到各Vn或Fn或Ln值所属记录或其它筛选值的数量、地址;检索时,用相应方案对检索模式T进行位标记或质数代换,得到T的Vt或Ft或Lt,并相应地同Vn或Fn或Ln进行运算和判断;对于满足筛选条件的Vn或Fn或Ln,将所属的记录或记录的其它筛选值,同T进行下一步处理。
2.一种模式匹配索引查找方法,其特征在于选择部分基元进行位标记或质数代换,或对基元进行不均衡分组后进行位标记或质数代换,得到每个模式的位值Wn或质数乘积值Fn或Fn的对数Ln;检索时,用相应方案对检索模式T进行位标记或质数代换,得到T的Wt或Ft或Lt,如果Wt或Ft或Lt有值,以Wt或Ft或Lt相应地同Wn或Fn或Ln做运算和判断,对于Wn或Fn或Ln满足筛选条件的记录,同T进行下一步处理;如果Wt或Ft或Lt无值,正检索时,下一步处理该范围内的所有记录,逆检索时,下一步处理该范围内Wn或Fn或Ln无值的记录。
3.一种质数代换检索判断方法,其特征在于以一个质数代表n个基元,以m个质数代表一定范围的基元,可以得到若干个模式S的该范围的所有基元相应的质数的乘积,称为F值,F值以r为底的对数为L。如果r的(La-Lb)次幂不是整数,则La所代表的若干个模式Sa不包含Lb所代表的若干个模式Sb的该范围内的所有基元。如果r的(La-Lb)次幂是整数,则La所代表的若干个模式Sa包含或可能包含Lb所代表的若干个模式Sb的该范围内的所有基元。
4.按照权利要求1或2所述的方法,其特征在于选择部分基元进行位标记或质数代换,或对基元进行不均衡分组后进行位标记或质数代换,得到每个模式的Vn或Fn或Ln;将数据库记录或记录的其它筛选值按Vn或Fn或Ln组织存贮,并得到各Vn或Fn或Ln值所属记录或记录的其它筛选值的数量、地址;检索时,先对检索模式T进行位标记或质数代换,得到T的Vt或Ft或Lt,如果Vt或Ft或Lt有值,以Vt或Ft或Lt相应地同Vn或Fn或Ln做运算和判断,对于满足筛选条件的Vn或Fn或Ln,将所属的记录或记录的其它筛选值,同T进行下一步处理;如果Vt或Ft或Lt无值,正检索时,下一步处理该范围内的所有记录或记录的其它筛选值,逆检索时,下一步处理该范围内Vn、Fn、Ln无值的记录或记录的其它筛选值。
5.按照权利要求1所述的方法,其特征在于用多种方案对基元进行位标记或质数代换,得到模式的多种Vn或Fn或Ln;用不同方案的Vn或Fn或Ln分别对数据库记录或记录的其它筛选值组织存贮,或者用不同方案的Vn或Fn或Ln进行互相组织,或者用不同方案的Vn或Fn或Ln进行分级组织;检索时以相应的方案得到T的多种Vt或Ft或Lt,并根据存贮组织方案逐步进行筛选处理。
6.按照权利要求1或2所述的方法,其特征在于用多种方案选择部分基元进行位标记或质数代换,或用多种方案对基元不均衡分组后进行位标记或质数代换,得到模式的多种Vn或Fn或Ln;用不同方案的Vn或Fn或Ln分别对数据库记录或者记录的其它筛选值组织存贮,或者用不同方案的Vn或Fn或Ln进行互相组织,或者用不同方案的Vn或Fn或Ln进行分级组织;检索时以相应的方案得到T的多种Vt或Ft或Lt,并根据存贮组织方案逐步进行筛选处理。
CN200810086821A 2008-03-16 2008-03-16 模式匹配索引查找方法 Pending CN101533398A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN200810086821A CN101533398A (zh) 2008-03-16 2008-03-16 模式匹配索引查找方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN200810086821A CN101533398A (zh) 2008-03-16 2008-03-16 模式匹配索引查找方法

Publications (1)

Publication Number Publication Date
CN101533398A true CN101533398A (zh) 2009-09-16

Family

ID=41104007

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200810086821A Pending CN101533398A (zh) 2008-03-16 2008-03-16 模式匹配索引查找方法

Country Status (1)

Country Link
CN (1) CN101533398A (zh)

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101763424B (zh) * 2009-12-14 2013-03-06 刘二中 根据文件内容确定特征词并用于检索的方法
CN107016397A (zh) * 2017-04-25 2017-08-04 深圳市大德激光技术有限公司 局部模板智能启发全局图像匹配方法
CN108573012A (zh) * 2017-11-24 2018-09-25 北京金山云网络技术有限公司 一种数据处理方法、装置、设备及存储介质
CN109858969A (zh) * 2019-01-31 2019-06-07 上海玄霆娱乐信息科技有限公司 一种基于业务配置的优惠价格确定方法及系统
CN111328416A (zh) * 2017-11-15 2020-06-23 国际商业机器公司 用于自然语言处理中的模糊匹配的语音模式
CN112307277A (zh) * 2020-09-29 2021-02-02 西安赢瑞电子有限公司 一种汉字串匹配预判方法
CN113065325A (zh) * 2021-02-26 2021-07-02 成都环宇知了科技有限公司 一种基于OpenXml的Excel文档分析方法及系统

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101763424B (zh) * 2009-12-14 2013-03-06 刘二中 根据文件内容确定特征词并用于检索的方法
CN107016397A (zh) * 2017-04-25 2017-08-04 深圳市大德激光技术有限公司 局部模板智能启发全局图像匹配方法
CN111328416A (zh) * 2017-11-15 2020-06-23 国际商业机器公司 用于自然语言处理中的模糊匹配的语音模式
CN111328416B (zh) * 2017-11-15 2023-11-17 国际商业机器公司 用于自然语言处理中的模糊匹配的语音模式
CN108573012A (zh) * 2017-11-24 2018-09-25 北京金山云网络技术有限公司 一种数据处理方法、装置、设备及存储介质
CN109858969A (zh) * 2019-01-31 2019-06-07 上海玄霆娱乐信息科技有限公司 一种基于业务配置的优惠价格确定方法及系统
CN112307277A (zh) * 2020-09-29 2021-02-02 西安赢瑞电子有限公司 一种汉字串匹配预判方法
CN113065325A (zh) * 2021-02-26 2021-07-02 成都环宇知了科技有限公司 一种基于OpenXml的Excel文档分析方法及系统
CN113065325B (zh) * 2021-02-26 2023-06-23 成都环宇知了科技有限公司 一种基于OpenXml的Excel文档分析方法及系统

Similar Documents

Publication Publication Date Title
CN110059311B (zh) 一种面向司法文本数据的关键词提取方法及系统
CN112214610B (zh) 一种基于跨度和知识增强的实体关系联合抽取方法
US20090265160A1 (en) Comparing text based documents
CN101533398A (zh) 模式匹配索引查找方法
CN106980609A (zh) 一种基于词向量表示的条件随机场的命名实体识别方法
CN109213925B (zh) 法律文本搜索方法
JPH0675992A (ja) テキストをインデックス及び検索するための関連ワード形態の限定状態トランスジューサ
CN104899188A (zh) 一种基于问题主题和焦点的问题相似度计算方法
Noaman et al. Naive Bayes classifier based Arabic document categorization
CN103544309A (zh) 一种中文垂直搜索的检索串拆分方法
CN104484380A (zh) 个性化搜索方法及装置
CN101645083A (zh) 一种基于概念符号的文本领域的获取系统及方法
CN112051986B (zh) 基于开源知识的代码搜索推荐装置及方法
Gomaa et al. Arabic short answer scoring with effective feedback for students
CN112364623A (zh) 基于Bi-LSTM-CRF的三位一体字标注汉语词法分析方法
EP3726401A1 (en) Encoding textual information for text analysis
CN107391495A (zh) 一种双语平行语料的句对齐方法
CN106980620A (zh) 一种对中文字串进行匹配的方法及装置
CN106776695A (zh) 实现文书档案价值自动鉴定的方法
CN102929864B (zh) 一种音字转换方法及装置
CN111882462B (zh) 一种面向多要素审查标准的中文商标近似检测方法
CN113934814B (zh) 古诗文主观题自动评分方法
JP2009301140A (ja) テキストセグメンテーション装置及び方法及びプログラム及びコンピュータ読取可能な記録媒体
Taji et al. The columbia university-new york university abu dhabi sigmorphon 2016 morphological reinflection shared task submission
CN103699675B (zh) 一种译员分级索引的方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C12 Rejection of a patent application after its publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20090916