具体实施方式
下面结合附图和具体实施例,对本发明目录生成方法和装置的具体实施方式作进一步详细描述。
本发明提供一种目录生成方法,如图1所示,该方法包括:
步骤11,在文本文件的全部字节中搜索目录字节流,所述目录字节流为包含预定的目录关键字节的字节流,所述目录关键字节为预定目录字符对应的字节;
步骤12,根据搜索到的全部目录字节流确定所述文本文件的目录。
本发明的目录生成方法通过对文本文件的字节匹配的方式获取目录,该方法不需要将字节转换成为字符再进行匹配,在移动设备计算能力和内存有限的情况下,减小了设备的计算能力,同时提高了目录的提取速度。
本发明方法适用于对多种语言的文本文件提取目录,以中文为例,目录字符流一般为“第X章”,或者“第X章第Y篇”等,本发明方法可预定一个或多个目录字符,如“第”、“章”、“篇”等,并确定这些预定的目录字符对应的字节,即目录关键字节,参照这些目录关键字节到所述文本文件搜索对应的目录字节流,从而获取文本文件的目录。
优选的,本发明方法中在文本文件的全部字节中搜索目录字节流,具体包括:
步骤21,从文本文件的首字节开始,读取L数目的字节到包含L个存储空间的缓存中,其中,每个存储空间存储一个字节,各存储空间对应的地址为A1~AL,L为预设正整数;
步骤22,从所述缓存当前存储的字节中搜索预定分隔符字节,并判断相邻预定分隔符字节之间的字节流是否为目录字节流,若是,则确定搜索到目录字节流;其中,搜索到所述缓存内最后一个预定分隔符字节时,确定最后一个预定分隔符字节对应的存储空间地址AN,将地址AN~AL中的字节转存到所述缓存内地址为A1~AL-N+1的存储空间中,其中N为正整数,且1≤N≤L;
步骤23,从所述文本文件未被读取的字节中,读取数目为N-1的字节到所述缓存内地址为AL-N+2~AL的存储空间中,并返回执行步骤22,直到所述文本文件内全部字节都被读入所述缓存并完成目录字节流搜索。
具体的,设备分批从文本文件的全部字节中读取字节到缓存进行处理,并且读入的字节分别存储在缓存内地址为A1~AL的存储空间中。文本文件一般使用分隔符将文本内容分隔成不同的目录级别或段落,因此在缓存内查找分隔符对应的字节(简称分隔符字节),并对相邻分隔符字节之间的字节流内容分析查找目录字节流。此处,由于不确定文本文件具体使用哪种字符作为分隔符,本发明方法可预先提供多个不同优先等级的分隔符,如回车换行符、Tab字符等,在文本文件中搜索时,首先选择优先级别较高的分隔符(如回车换行符)对应的字节进行搜索,若确定缓存空间够大,且在前几次读入缓存内的字节中都未搜索到该分隔符字节时,可更改使用优先级别较低的分隔符(如Tab字符)对应的字节重新进行搜索,直到确定用于搜索的分隔符为文本文件中真正使用的分隔符。另外,若确定由于缓存空间较小,在前几次读入缓存内的字节中都未搜索到分隔符字节时,可在设备中申请更大存储空间的缓存,并重新读取文本文件的字节到该更大存储空间的缓存内进行处理。
具体的,上述步骤22中,判断相邻预定分隔符字节之间的字节流是否为目录字节流,具体包括:在所述相邻预定分隔符字节之间的字节流中搜索所述目录关键字节,若搜索到,则确定相邻预定分隔符字节之间的字节流为目录字节流。
本发明方法对在相邻预定分隔符字节之间的字节流中搜索所述目录关键字节的方式不作限定,可根据具体设备和文本文件确定。例如,本发明方法可以根据文本文件所使用的目录字符流的表达方式,将预定的目录字符分为主目录字符和副目录字符,相应的,可得到主目录关键字节和副目录关键字节,则在相邻预定分隔符字节之间的字节流中搜索目录关键字节时,可先在其中搜索主目录关键字节,若搜索到,再在该主目录关键字节之后的字节中搜索副目录关键字节,若再次搜索到,则确定当前相邻预定分隔符字节之间的字节流为目录字节流。以中文为例,文本文件通常使用“第X章”或者“第X章第Y篇”等作为目录字符流,假设预定的目录字符为“第”、“章”、“篇”,则可确定其中“第”为主目录字符,而“章”、“篇”为副目录字符,假设主目录字符“第”对应的主目录关键字节为“m1”,而副目录字符“章”、“篇”对应的副目录关键字节分别为“m2”、“m3”,则可在相邻预定分隔符字节之间的字节流中,先搜索“m1”,若没有搜索到,则结束本次搜索,若搜索到,则继续在其之后的字节(或与其相隔一个字节之后的字节)中搜索“m2”和“m3”,若搜索到“m2”或“m3”,则确定当前相邻预定分隔符字节之间的字节流为目录字节流。
优选的,所述步骤22中,仅在确定相邻预定分隔符字节之间的字节流对应的字节总数大于最大目录字节数时,对所述字节流是否为目录字节流进行判断;所述最大目录字节数为预先估计的目录字符流包含的最多字符数与所述文本文件中单个字符对应的最大字节数的乘积。
文本文件中使用的目录字符流中的字符总数通常有一个上限,以中文为例,所使用的目录字符流为“第X章”或者“第X章第Y篇”时,其中的字符总数通常不超过50字,而超过50字的字符流通常为文本文件的内容字符流,基于这种先验知识,可确定具有最大字符总数的目录字符流所对应的字节总数(以下简称最大目录字节数),则对缓存内的字节搜索目录字节流时,可忽略相邻预定分隔符字节之间超过所述最大目录字节数的字节流。其中,最大目录字节数可采用估算的方式确定:首先需要估算文本文件通常使用的目录字符流所具有的最大字符总数,以及当前文本文件中一个字符对应的最大字节数(对于定长编码,一个字符对应的字节数为定值,对于变长编码,一个字符对应的字节数是不定的,取其最大值),求所述目录字符流所具有的最大字符总数与一个字符对应的最大字节数的乘积,将该乘积确定为最大目录字节数。例如,假设文本文件中目录字符流具有的最大字符总数为50字,并且一个字符对应的最大字节数为2,则最大目录字节数为100,则在对缓存内的字节搜索目录字节流时,可忽略相邻预定分隔符字节之间超过100字节的字节流,即不对相邻预定分隔符字节之间超过100字节的字节流进行判断是否为目录字节流,采用该策略,可大大提高目录提取的速度。
优选的,所述步骤11中,在搜索目录字节流的过程中,每搜索到一个目录字节流时,滑过当前搜索到的目录字节流后设定数目的字节之后,再在所述文本文件剩余的字节中继续搜索目录字节流。
优选的,对于读取文本文件的字节到缓存中的情况,在所述缓存中每搜索到一个目录字节流时,
若所述缓存中当前目录字节流之后的字节总数大于所述设定数目,则滑过所述缓存中当前目录字节流之后设定数目的字节,再继续搜索目录字节流;
若所述缓存中当前目录字节流之后的字节总数比所述设定数目少Y,则从所述文本文件当前未被读取的字节中滑过Y个字节后,再读取L数目的字节到缓存中,并继续在所述缓存中搜索目录字节流,Y为正整数。
文本文件中内容字符流的字符总数通常有一个下限,例如,多数文本文件中,一个目录下的内容字符总数通常不小于500字,基于这种先验知识,可估算文本文件中内容字符流的字符总数下限,并确定该字符总数下限对应的字节数目,将该数目确定为设定数目,则在缓存中每搜索到一个目录字节流时,都直接滑过(被读取,但未被读入所述缓存中)所述目录字节流之后设定数目的字节,再继续搜索目录字节流。
具体实施中,由于所述设定数目为一估计值,因此实际执行操作时可能会出现下一个目录被滑过,而没被搜索到的情况,为尽量避免这种情况的发生,可采取以下方式:对文本文件提取前Q个目录字节流时,不采用所述滑过设定数目的方法,确定这Q个目录字节流中,相邻两个目录字节流之间包含的最小字节数目min,则从搜索到的第Q+1个目录字节流开始,每识别到一个目录字节流,则滑过min数目的字节,再继续搜索。
优选的,每搜索到一个目录字节流时,本发明方法还包括:
确定所述搜索到的目录字节流到所述文本文件首字节的偏移量。
具体的,在所述文本文件的全部字节中搜索目录字节流时,每搜索到一个目录字节流,都确定当前搜索到的目录字节流到所述文本文件首字节的偏移量,以便在生成所述文本文件的目录时,可以快速定位到对应的文本内容。
优选的,对于读取文本文件的字节到缓存中的情况,确定所述搜索到的目录字节流到所述文本文件首字节的偏移量,具体包括:
在所述缓存内每搜索到一个目录字节流时,确定当前所述文本文件中已被读取的字节总数S,其中S为正整数;确定所述缓存内当前目录字节流中第一个字节对应的存储空间地址AM,,其中M为正整数,且1<M<L;确定当前目录字节流到所述文本文件首字节的偏移量为S-(L-M)。
优选的,所述步骤12中,根据搜索到的全部目录字节流生成所述文本文件的目录,具体包括:
确定所述搜索到的全部目录字节流对应的全部目录字符流;
根据所述全部目录字符流,生成所述文本文件的目录。
优选的,本发明方法根据所述全部目录字符流,生成所述文本文件的目录之前,还包括:
筛除所述全部目录字符流中的错误目录字节流,得到筛除后的目录字符流;
根据所述筛除后的目录字符流,生成所述文本文件的目录。
优选的,筛除所述全部目录字符流中的错误目录字节流,具体包括:
确定各预定目录字符对应的常数,其中不同目录字符对应不同的常数;
针对所述全部目录字符流中的每一个目录字符流,确定其包含的所有预定目录字符对应的常数集合{Ei|i=1,2,3...},其中i为各预定目录字符在当前目录字符流中出现的次序号,Ei为当前目录字符流中第i个预定目录字符对应的常数;
针对所述每一个目录字符流,采用以下公式计算该目录字符流对应的运算值W:
W=E1+E2×pow(2,delta)+...+Ei×pow(2,delta×(i-1)),
其中,pow为指数运算,delta为运算因子;
获得所述全部目录字符流对应的运算值序列后,按设定区间将所述各运算值序列进行划分;
确定所述各区间中的运算值个数,若所述运算值个数小于设定阈值,则将该区间内各运算值对应的目录字符流确定为错误目录字符流,并将其筛除。
具体的,确定各预定目录字符对应的常数是为了将语言类字符映射到数字方面,从而方便设备对其进行归类分析,例如可将第”、“章”、“节”、“篇”、“回”等预定目录字符分别映射为常数10、20、30、40、50,这样针对每一个目录字符流,都可确定其包含的所有预定目录字符所对应的常数集合,利用该集合中的各个常数,即可得到一个与当前目录字符流相关的运算值W。进一步,为了避免出现字符流内包含相同的预定目录字符,但预定目录字符出现的位置不一致(如字符流{第5章2篇}和{第二篇文章的启示}),却计算得到相同运算值的情况,对所述每一个目录字符流计算相关运算值W时,还需考虑其中每个预定目录字符所在的位置,上述公式中pow(2,delta×(i-1)为当前目录字符流中出现的每个预定目录字符的加权系数,其中,pow为指数运算,i为各预定目录字符在当前目录字符流中出现的次序号,delta为运算因子,其作用是为了增大所述各目录字符流对应的运算值的区分度,以方便按设定区间将所述各运算值划分开来,具体实施中,所述delta可根据实际经验取值,但需注意的是,delta值过大时可能会使得运算值W过长而出现存储越界现象。
针对所述每一个目录字符流,采用以上公式计算相应的运算值以后,可发现绝大部分目录字符流对应的运算值都大致相同(或在同一区间内相差不大),并且这部分目录字符流为具有相同规则的目录字符流,如{第1回}、{第2回}....{第20回}等目录字符流对应的运算值都是一致的,而少数目录字符流对应的运算值则很特别,如与其他绝大部分目录字符流对应的运算值相差很大,则这部分目录字符流就是属于被搜索到的错误目录字符流,如{第二篇文章的启示}、{第三次比赛回合中}、{第一次我们有了新的篇章}等。具体实施中,按照设定区间划分所述运算值序列后,也可以计算各区间内运算值个数占总运算值个数的百分比,并将其中百分比小于设定阈值的区间对应的各目录字符流确定为错误目录字符流。
本发明提供一种目录生成方法实施例,用于对TXT文本文件提取目录,假设当前TXT文本文件的语言类型为中文,预定主目录字符为“第”,对应的主目录字节为“m1”,副目录字符为“章”、“节”、“篇”、“回”、“集”,对应的副目录字节分别为“m2”、“m3”、“m4”、“m5”、“m6”,预定分隔符为回车换行符,回车符对应的字节为“0X0D”,换行符对应的字节为“0X0A”,则预定分隔符字节为“0X0D,0X0A”。
本方法实施例具体包括如下步骤:
步骤31,申请包含1024个一维数组的缓存,从TXT文本文件的首字节开始,读取1024个字节到所述缓存。
此步骤首先需根据TXTX文本文件的前导码bom(若没有bom,则根据TXT文本文件的前1024个字节流内容)判断该文本文件的字符编码类型,假设为UTF8码,则该文本文件中单个字符对应的最大字节数为5;估计目录字符流中最多包含50个字符,则计算最大目录字节数为250。
步骤32,在所述缓存中当前存储的字节中搜索预定分隔符字节,并判断相邻预定分隔符字节之间的字节流是否为目录字节流,若是,则确定搜索到目录字节流。
设当前读入缓存的字节流为{W1,W2,...,Wd,0X0D,0X0A,X1,X2,...,Xa,0X0D,0X0A,Y1,...,Yb,0X0D,0X0A,Z1,...,Zc},则本步骤中具体还包括以下各步骤:
步骤32_1,从当前缓存中搜索“0X0D,0X0A”字节,搜索到之后,判断第一个“0X0D,0X0A”字节和第二个“0X0D,0X0A”字节之间的字节流{X1,X2,...,Xa}是否为目录字节流。
具体的,首先在该段字节流内搜索主目录字节“m1”,若搜索到,则继续在该段字节流内“m1”之后的字节中搜索以下副目录字节“m2”、“m3”、“m4”、“m5”、“m6”,若搜索到其中任意一个副目录字节,则确定该字节流为目录字节流;若在该段字节流内未搜索到主目录字节“m1”,或未搜索到任意一个副目录字节,则转到下一段字节流(下一相邻回车换行符对应的字节之间的字节流)中去搜索。假设确定字节流{X1,X2,...,Xa}为目录字节流,且确定当前目录字节流的第一个字节X1对应的缓存存储地址为35,以及所述TXT文本文件中已被读取的字节总数为2450,则可确定当前目录字节流到文本文件首字节的偏移量为2450-(1024-35)=1461。
步骤32_2,搜索到第三个“0X0D,0X0A”字节后,确定第二个“0X0D,0X0A”字节和第三个“0X0D,0X0A”字节之间的字节流{Y1,...,Yb}中包含的字节总数为795,则可直接滑过该段字节流,不对其判断是否为目录字节流。
步骤32_3,确定缓存内当前搜索到的第三个“0X0D,0X0A”字节为最后一个“0X0D,0X0A”字节时,结束当前步骤32,继续执行步骤33。
步骤33,确定缓存内当前搜索到的第三个“0X0D,0X0A”字节为最后一个“0X0D,0X0A”字节,并且该“0X0D,0X0A”字节对应的缓存存储地址为993和994,则将缓存内当前地址为995~1024的数组(共29个数组)中存储的字节转存到该缓存内地址为1~29的数组中;
步骤34,从TXT文本文件未被读取的字节中继续读取数目为994个字节到该缓存中地址为30~1024的数组中,并返回执行步骤32,直到该TXT文本文件内全部字节都被读入所述缓存。
依据上述过程对该TXT文本文件的全部字节进行搜索后,初步搜索到若干目录字节流,假设这些目录字节流对应的目录字符流为:
第1章
第2章
第3章
第五集团军大举进攻
第4章
第5章
第一次我们有了新的篇章
第20章
步骤35,筛除以上初步得到的目录字符流中的错误目录字符流,具体包括以下步骤:
步骤35_1,确定各预定目录字符“第”、“章”、“节”、“篇”、“回”、“集”对应的常数分别为10、20、30、40、50、60;
步骤352,针对所述每个目录字符流,确定其中包含的所有预定目录字符对应的常数集合,例如针对目录字符流{第1章},确定其对应的常数集合为{E1=10,E2=20},针对目录字符流{第五集团军大举进攻},确定其对应的常数集合为{E1=10,E2=50},针对目录字符流{第一次我们有了新的篇章},确定其对应的常数集合为{E1=10,E2=40,E3=20};
步骤36_2,针对所述每个目录字符流,采用以下公式计算其对应的运算值:
W=E1+E2×pow(2,delta)+...+Ei×pow(2,delta×(i-1)),
其中,W为该目录字符流对应的运算值,pow为指数运算,delta为运算因子,此处delta取值为3,Ei为当前目录字符流中出现的第i个预定目录字符对应的常数;
例如,针对目录字符流{第1章}、{第2章}、{第3章}、{第4章}、{第5章}......{第20章},其对应的运算值都为:
W=10+20×pow(2,3×(2-1))=170;
针对目录字符流{第五集团军大举进攻},其对应的运算值为:
W=10+60×pow(2,3×(2-1))=490;
针对目录字符流{第一次我们有了新的篇章},其对应的运算值为:
W=10+40×pow(2,3×(2-1))+20×pow(2,3×(3-1))=10+40×8+20×64=1770;
具体的,按照上述公式针对以上全部目录字符流计算后可得出以下运算值序列:
170,170,170,490,170,170,1770......170
步骤36_3,按区间将所述各运算值进行划分,并计算各区间中的运算值个数百分比。
具体的,以所述运算值序列的最小值170和最大值1770为边界,以设定区间200进行划分,分别为:
区间[170,370>中的运算值个数为20,占总运算值个数的91%;
区间[370,570>中的运算值个数为1,占总运算值个数的4%;
区间[570,770>中的运算值个数为0;
区间[770,970>中的运算值个数为0;
区间[970,1170>中的运算值个数为0;
区间[1170,1370>中的运算值个数为0;
区间[1370,1570]中的运算值个数为0;
区间[1570,1770]中的运算值个数为1,占总运算值个数的4%;
步骤36_4,设定阈值为5%,将以上百分比小于5%的各区间内对应的目录字符流确定为错误字符流,并将其筛除。
具体的,可确定目录字符流{第五集团军大举进攻}和{第一次我们有了新的篇章}为错误目录字符流,将其删除,得到筛除后的目录字符流,用于生成文本目录。
相应的,本发明还提供一种目录生成装置,用于根据文本文件生成目录,如图2所示,该装置包括:
目录字节流搜索模块201,用于在文本文件的全部字节中搜索目录字节流,所述目录字节流为包含预定的目录关键字节的字节流,所述目录关键字节为预定目录字符对应的字节;
目录生成模块202,用于根据搜索到的全部目录字节流生成所述文本文件的目录。
优选的,所述目录字节流搜索模块201在所述文本文件的全部字节中搜索目录字节流,具体包括:
步骤121,从文本文件的首字节开始,读取L数目的字节到包含L个存储空间的缓存中,其中,每个存储空间存储一个字节,各存储空间对应的地址为A1~AL,L为预设正整数;
步骤122,从所述缓存当前存储的字节中搜索预定分隔符字节,并判断相邻预定分隔符字节之间的字节流是否为目录字节流,若是,则确定搜索到目录字节流;其中,搜索到所述缓存内最后一个预定分隔符字节时,确定最后一个预定分隔符字节对应的存储空间地址AN,将地址AN~AL中的字节转存到所述缓存内地址为A1~AL-N+1的存储空间中,其中N为正整数,且1≤N≤L;
步骤123,从所述文本文件未被读取的字节中,读取数目为N-1的字节到所述缓存内地址为AL-N+2~AL的存储空间中,并返回执行步骤122,直到所述文本文件内全部字节都被读入所述缓存并完成目录字节流搜索。
所述目录生成装置各个模块的具体实现功能参见上述目录生成方法的具体实现过程,在此不再赘述。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。