确定文本串公共子序列的方法和设备与流程

文档序号:11063488阅读:508来源:国知局
确定文本串公共子序列的方法和设备与制造工艺

本发明涉及计算机应用领域,具体而言,涉及用于确定文本串公共子序列的方法和设备。



背景技术:

当今,人们对网络安全日益重视,包括防火墙在内的多种安全设备被广泛应用。然而,仅部署安全设备还不足以保护网络的安全,相关人员还需要持续不断监控和分析安全设备产生的日志,这是因为日志中包含非常有价值的信息,比如利用这些日志可以检测出诸如网络入侵、病毒攻击、反常行为、异常流量等安全威胁,从而有针对性地配置和调整网络整体安全策略。

一种对日志进行分析的方式是将日志的事件归为“信息”、“错误”和“警告”等几个大类。这种分析方法具有局限性,由于日志数量巨大并且内容繁杂,重要的事件信息很可能被淹没在“警告”类别中而未能被及时处理。因此,为了方便统计并及时发现问题、避免一类小事件被淹没在同类的其他事件中,需要对日志进行细分,以便能够及时从日志判断出事件类型并做相应处理。

日志具有基于文本、因来源不同而可能格式各异的特点。例如,来自防火墙和网络服务器的日志格式就存在差异。此外,即使来源相同,日志仍然可以按照其含义进行细分。

对日志进行细分的常规方法是计算最长公共子序列(LCS),即把两个日志文本归并在一起,抽出公共的序列部分,进而判断两者是否能够归为一类。然而,这种常规方法只支持两个文本,在存在多个日志文本的情况下,需要对任何两个文本进行计算,导致计算量非常大。



技术实现要素:

根据本发明的一方面,提供了一种用于在多个文本串中确定最长公共子序列的方法,包括:将多个文本串分别转换为词序列;将词序列分别转换为相应的词集合;计算每个词集合的最小哈希值;根据最小哈希值,对词序列进行分类;以及在每一类中进行最长公共子序列运算。

在这里和下文中,“词序列”是指词的序列;相应的,“词集合”是指词的集合。换言之,序列和集合的构成元素都是词。两者的区别在于,序列中的元素可以重复且必须有顺序,而在集合中不考虑元素顺序且元素无重复。

根据本发明的另一方面,提供了一种用于在多个文本串中确定最长公共子序列的设备,包括:第一转换装置,用于将多个文本串分别转换为词序列;第二转换装置,用于将词序列分别转换为相应的词集合;第一运算装置,用于计算每个词集合的最小哈希值;分类装置,用于根据最小哈希值对词序列进行分类;以及第二运算装置,用于在每一类中进行最长公共子序列运算。

本发明的实施方式可以包括下列一个或多个特征。

将最小哈希距离小于第一阈值的两个词序列划分为同一类。

最长公共子序列运算包括:在该类中选择一个词序列作为第一词序列,分别计算该第一词序列与该类中的其他词序列的最长公共子序列,直至所得到的最长公共子序列长度大于第二阈值。

最长公共子序列运算包括:如果所得到的最长公共子序列长度均不大于第二阈值,则从该类中删除该第一词序列,继续最长公共子序列运算。

将长度大于第二阈值的最长公共子序列确定为文本串模板。

文本串模板依次与该类中的其他词序列计算最长公共序列,在该计算过程中,将长度大于第二阈值的最长公共子序列确定为新的文本串模板并继续该计算过程。

输出最终的文本串模板,删除该类中能与所述最终的文本串模板匹配的词序列。

继续进行最长公共子序列运算,直至该类为空。

本发明的某些实施方式可能具有下列一个或多个有益效果:与常规LCS算法相比,支持多文本,并且通过最小哈希算法快速判断文本之间是否差异过大,从而有效节省了LCS运算所需的时间。

本发明的其他方面、特征和有益效果将在具体实施方式、附图及权利要求中得到进一步明确。

附图说明

下面结合附图对本发明做进一步说明。

图1是根据本发明的用于在多个文本串中确定最长公共子序列的方法的流程图;

图2和图3是根据一种实施方式的进行最长公共子序列运算并确定文本串模板的流程图;以及

图4根据本发明的用于在多个文本串中确定最长公共子序列的设备的框图。

具体实施方式

参看图1步骤S100,将文本串分别转换为相应的词序列。下面示例性地借助文本串A和B对步骤S100做进一步说明。假设,文本串A为:“The quick brown fox jumps over the lazy dog”;文本串B为:“The lazy brown dog jumps over the quick fox”。

文本串A经过分词操作得到词序列A:{the,quick,brown,fox,jumps,over,the,lazy,dog}。文本串B经过分词操作得到词序列B:{the,lazy,brown,dog,jumps,over,the,quick,fox}。

除上述示例中基于拉丁字母的文本串外,分词操作的对象同样可以包括中文文本串,支持中文分词操作的方案例如包括CRF和MMSEG等。分词的简单方法可以是查一个中文词库。例如,用一个包含“中华”、“人民”、“共和国”的词库可以把中英文混合的一句话“how to translate中华人民共和国”分词成'how'、'to'、'translate'、“中华”、“人民”、“共和国”六个词。

分词操作影响词序列的元素构成和长度。词序列越长,后续执行LCS算法所需的时间也相应越长。然而需要指出,除了LCS运算速度外,分词操作基本上对整个算法的结果没有影响。

根据步骤S200,将词序列分别转换为相应的词集合。继续以词序列A和B为例,在转换过程中,重复出现的词只保留一个,例如“the”。转换后得到词集合A为[the,quick,brown,fox,jumps,over,lazy,dog];词集合B为[the,lazy,brown,dog,jumps,over,quick,fox]。

在存在多个文本串的情况下,可以按照上述步骤将所有文本串分别转换为相应的词集合。

根据步骤S300,计算每个词集合的最小哈希(MinHash)值,最小哈希值用于判断两个集合的相似性。已知多种计算MinHash的方法,下文示出的是其中一种基于Python实现的伪码。

在步骤S400中,计算任意两个词集合的MinHash距离。MinHash是固定长度的数值,假设其长度为64位,那么在这64位中,位置相同而值不同的位的个数即为两个MinHash值的MinHash距离。这里,两个集合的MinHash距离短是该两个集合相似的必要非充分条件,这是因为MinHash本身是一种概率方法,存在误报;此外MinHash只考虑元素集合,而忽略元素出现的先后次序。以文本串A和B为例,虽然两个文本串不同,但其对应的词集合有同样的MinHash值。

将MinHash距离与第一阈值相比较,并且将MinHash距离小于第一阈值的两个词集合所对应的词序列归为同一类。其中第一阈值是可调的,其默认值可以设置为80% 乘以MinHash的位数。通过步骤S400,将所有文本串对应的词序列划分为一个或多个类。

根据步骤500,在每一类中进行最长公共子序列运算。已知多种LCS运算的方法,下文示出的是其中一种基于Java实现的伪码。

publicclassLCSProblem

{

publicstaticvoidmain(String[]args)

{

String[]x={"","A","B","C","B","D","A","B"};

String[]y={"","B","D","C","A","B","A"};

int[][]b=getLength(x,y);

Display(b,x,x.length-1,y.length-1);

}

publicstaticint[][]getLength(String[]x,String[]y)

{

int[][]b=newint[x.length][y.length];

int[][]c=newint[x.length][y.length];

for(inti=1;i<x.length;i++)

{

for(intj=1;j<y.length;j++)

{

if(x[i]==y[j])

{

c[i][j]=c[i-1][j-1]+1;

b[i][j]=1;

}

elseif(c[i-1][j]>=c[i][j-1])

{

c[i][j]=c[i-1][j];

b[i][j]=0;

}

else

{

c[i][j]=c[i][j-1];

b[i][j]=-1;

}

}

}

returnb;

}

publicstaticvoidDisplay(int[][]b,String[]x,inti,intj)

{

if(i==0||j==0)

return;

if(b[i][j]==1)

{

Display(b,x,i-1,j-1);

System.out.print(x[i]+"");

}

elseif(b[i][j]==0)

{

Display(b,x,i-1,j);

}

elseif(b[i][j]==-1)

{

Display(b,x,i,j-1);

}

}

}

下面借助图2对步骤S500进行详细说明。

参看图2,根据步骤S502到S506,从同一类中选择两个词序列作为第一词序列和第二词序列,并计算第一词序列和第二词序列的最长公共子序列。需要指出,在这里和下文中,词序列的选择可以在符合条件的集合中任意进行。

根据步骤S508,将计算得到的LCS与第二阈值进行比较,如果LCS长度大于第二阈值,则将该LCS转换为文本串模板。这里,第二阈值是可调的,其默认值可以设置为80%乘以第一词序列和第二词序列长度中的较大值。换言之,LCS长度与第一词序列和第二词序列长度中的较大值的比例应大于80%。

如果计算得到LCS长度不大于第二阈值,则返回步骤S504,将当前第二词序列替换为同一类中的另一词序列,并重复步骤S506和S508。这里,该另一词序列是从该类中在当前第一词序列的运算周期内尚未参与LCS运算的词序列中选择的。

重复步骤S504至S508,直到生成文本串模板。如果穷尽该类中的所有词序列都无法生成模板(步骤S504),则删除当前第一词序列,并从该类中选择一个词序列作为第一词序列开始重复上述步骤S504。

下面结合第一词序列和第二词序列的具体实例进一步说明生成文本串模板的过程。为简便起见,假设第一和第二词序列中的词都是一个字母。

一种情况下,假设第一词序列为{A,B,A,D,E,F,G},第二词序列为{A,B,B,D,E,F,G}。经过LCS运算,第一词序列和第二词序列的LCS为{A,B,D,E,F,G},长度为6。由于第一和第二词序列的长度都是7,可知LCS长度大于默认的第二阈值80%。因此,可以将该LCS转换为模板{A,B,*,D,E,F,G},其中,“*”为占位词,表示在词“B”和“D”之间的词最多为一个。占位词也可以选用其他符号,为避免歧义,通常使用在输入文本中不出现的特殊词。

另一种情况,假设第一词序列为{A,B,D,E,F,G},第二词序列为{A,B,B,D,E,F,G}。经过LCS运算,第一词序列和第二词序列的LCS为{A,B,D,E,F,G},长度为6。由于第一和第二词序列长度的较大值是7,可知LCS长度大于默认的第二阈值 80%。因此,同样可以将该LCS转换为模板{A,B,*,D,E,F,G},其中,“*”为占位词,表示在词“B”和“D”之间的词最多为一个。

再一种情况,第一词序列为{A,B,A,D,E,F,G},第二词序列为{A,B,B,C,E,F,G}。经过LCS运算,第一词序列和第二词序列的LCS为{A,B,E,F,G},长度为5。由于第一和第二词序列的长度都是7,可知LCS长度小于默认的第二阈值80%。因此,该LCS不能被转换为模板。

应当理解,根据词序列的实际长度,生成的模板可以包括多个占位词“*”,每个占位词表示其所在位置最多可以插入一个词。

在生成文本串模板之后,根据图3中步骤S510到S512,选择另一个词序列与该文本串模板进行LCS计算。与步骤S502类似,该另一词序列是从该类中在当前第一词序列的运算周期内尚未参与LCS运算的词序列中选择的。例如,第一和第二词序列计算得到的LCS已经转换为文本串模板,则在该类中选择除当前的第一、第二词序列之外的一个词序列与该文本串模板进行LCS计算。

根据步骤S512,将计算得到的LCS与第二阈值进行比较,如果LCS长度大于第二阈值,则将该LCS转换为新的文本串模板。

如果计算得到LCS长度不大于第二阈值,则返回步骤S510。

重复步骤S510到S514,直到穷尽这个类中所有的词序列。

根据步骤S516,输出文本串模板,并将该文本串模板所能匹配的所有词序列从该类中删除。作为替代,删除文本串模板所能匹配的词序列也可以在每次得到该文本串模板后进行。

返回步骤S502,直至该类为空,即该类中所有的词序列均被删除。

同样的,对其他类进行LCS及文本串模板运算,直至所有类为空。

图4所示的根据本发明的用于在多个文本串中确定最长公共子序列的设备400包括第一转换装置402、第二转换装置404、第一运算装置406、分类装置408和第二运算装置410。其中,第一转换装置402用于将多个文本串分别转换为词序列,第二转换装置404用于将词序列分别转换为相应的词集合,第一运算装置406用于计算每个词集合的最小哈希值,分类装置408用于根据最小哈希值对词序列进行分类,第二运算装置410用于在每一类中进行最长公共子序列运算。

设备400的功能模块可以通过硬件、软件或硬件与软件的结合实现,从而执行上述根据本发明的方法步骤。此外,第一转换装置402、第二转换装置404、第一运算装置406、分类装置408和第二运算装置410可以组合或者进一步分解成子模块,从而执行上述根据本发明的方法步骤。因此,上述功能模块的任何可能的组合、分解或进一步的定义都落入权利要求所保护的范围之内。

本发明不限于上述具体描述,本领域技术人员在上述描述基础上容易想到的任何改变,都在本发明的范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1