本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,具體而言,涉及用于確定文本串公共子序列的方法和設(shè)備。
背景技術(shù):
當(dāng)今,人們對(duì)網(wǎng)絡(luò)安全日益重視,包括防火墻在內(nèi)的多種安全設(shè)備被廣泛應(yīng)用。然而,僅部署安全設(shè)備還不足以保護(hù)網(wǎng)絡(luò)的安全,相關(guān)人員還需要持續(xù)不斷監(jiān)控和分析安全設(shè)備產(chǎn)生的日志,這是因?yàn)槿罩局邪浅S袃r(jià)值的信息,比如利用這些日志可以檢測(cè)出諸如網(wǎng)絡(luò)入侵、病毒攻擊、反常行為、異常流量等安全威脅,從而有針對(duì)性地配置和調(diào)整網(wǎng)絡(luò)整體安全策略。
一種對(duì)日志進(jìn)行分析的方式是將日志的事件歸為“信息”、“錯(cuò)誤”和“警告”等幾個(gè)大類。這種分析方法具有局限性,由于日志數(shù)量巨大并且內(nèi)容繁雜,重要的事件信息很可能被淹沒在“警告”類別中而未能被及時(shí)處理。因此,為了方便統(tǒng)計(jì)并及時(shí)發(fā)現(xiàn)問(wèn)題、避免一類小事件被淹沒在同類的其他事件中,需要對(duì)日志進(jìn)行細(xì)分,以便能夠及時(shí)從日志判斷出事件類型并做相應(yīng)處理。
日志具有基于文本、因來(lái)源不同而可能格式各異的特點(diǎn)。例如,來(lái)自防火墻和網(wǎng)絡(luò)服務(wù)器的日志格式就存在差異。此外,即使來(lái)源相同,日志仍然可以按照其含義進(jìn)行細(xì)分。
對(duì)日志進(jìn)行細(xì)分的常規(guī)方法是計(jì)算最長(zhǎng)公共子序列(LCS),即把兩個(gè)日志文本歸并在一起,抽出公共的序列部分,進(jìn)而判斷兩者是否能夠歸為一類。然而,這種常規(guī)方法只支持兩個(gè)文本,在存在多個(gè)日志文本的情況下,需要對(duì)任何兩個(gè)文本進(jìn)行計(jì)算,導(dǎo)致計(jì)算量非常大。
技術(shù)實(shí)現(xiàn)要素:
根據(jù)本發(fā)明的一方面,提供了一種用于在多個(gè)文本串中確定最長(zhǎng)公共子序列的方法,包括:將多個(gè)文本串分別轉(zhuǎn)換為詞序列;將詞序列分別轉(zhuǎn)換為相應(yīng)的詞集合;計(jì)算每個(gè)詞集合的最小哈希值;根據(jù)最小哈希值,對(duì)詞序列進(jìn)行分類;以及在每一類中進(jìn)行最長(zhǎng)公共子序列運(yùn)算。
在這里和下文中,“詞序列”是指詞的序列;相應(yīng)的,“詞集合”是指詞的集合。換言之,序列和集合的構(gòu)成元素都是詞。兩者的區(qū)別在于,序列中的元素可以重復(fù)且必須有順序,而在集合中不考慮元素順序且元素?zé)o重復(fù)。
根據(jù)本發(fā)明的另一方面,提供了一種用于在多個(gè)文本串中確定最長(zhǎng)公共子序列的設(shè)備,包括:第一轉(zhuǎn)換裝置,用于將多個(gè)文本串分別轉(zhuǎn)換為詞序列;第二轉(zhuǎn)換裝置,用于將詞序列分別轉(zhuǎn)換為相應(yīng)的詞集合;第一運(yùn)算裝置,用于計(jì)算每個(gè)詞集合的最小哈希值;分類裝置,用于根據(jù)最小哈希值對(duì)詞序列進(jìn)行分類;以及第二運(yùn)算裝置,用于在每一類中進(jìn)行最長(zhǎng)公共子序列運(yùn)算。
本發(fā)明的實(shí)施方式可以包括下列一個(gè)或多個(gè)特征。
將最小哈希距離小于第一閾值的兩個(gè)詞序列劃分為同一類。
最長(zhǎng)公共子序列運(yùn)算包括:在該類中選擇一個(gè)詞序列作為第一詞序列,分別計(jì)算該第一詞序列與該類中的其他詞序列的最長(zhǎng)公共子序列,直至所得到的最長(zhǎng)公共子序列長(zhǎng)度大于第二閾值。
最長(zhǎng)公共子序列運(yùn)算包括:如果所得到的最長(zhǎng)公共子序列長(zhǎng)度均不大于第二閾值,則從該類中刪除該第一詞序列,繼續(xù)最長(zhǎng)公共子序列運(yùn)算。
將長(zhǎng)度大于第二閾值的最長(zhǎng)公共子序列確定為文本串模板。
文本串模板依次與該類中的其他詞序列計(jì)算最長(zhǎng)公共序列,在該計(jì)算過(guò)程中,將長(zhǎng)度大于第二閾值的最長(zhǎng)公共子序列確定為新的文本串模板并繼續(xù)該計(jì)算過(guò)程。
輸出最終的文本串模板,刪除該類中能與所述最終的文本串模板匹配的詞序列。
繼續(xù)進(jìn)行最長(zhǎng)公共子序列運(yùn)算,直至該類為空。
本發(fā)明的某些實(shí)施方式可能具有下列一個(gè)或多個(gè)有益效果:與常規(guī)LCS算法相比,支持多文本,并且通過(guò)最小哈希算法快速判斷文本之間是否差異過(guò)大,從而有效節(jié)省了LCS運(yùn)算所需的時(shí)間。
本發(fā)明的其他方面、特征和有益效果將在具體實(shí)施方式、附圖及權(quán)利要求中得到進(jìn)一步明確。
附圖說(shuō)明
下面結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步說(shuō)明。
圖1是根據(jù)本發(fā)明的用于在多個(gè)文本串中確定最長(zhǎng)公共子序列的方法的流程圖;
圖2和圖3是根據(jù)一種實(shí)施方式的進(jìn)行最長(zhǎng)公共子序列運(yùn)算并確定文本串模板的流程圖;以及
圖4根據(jù)本發(fā)明的用于在多個(gè)文本串中確定最長(zhǎng)公共子序列的設(shè)備的框圖。
具體實(shí)施方式
參看圖1步驟S100,將文本串分別轉(zhuǎn)換為相應(yīng)的詞序列。下面示例性地借助文本串A和B對(duì)步驟S100做進(jìn)一步說(shuō)明。假設(shè),文本串A為:“The quick brown fox jumps over the lazy dog”;文本串B為:“The lazy brown dog jumps over the quick fox”。
文本串A經(jīng)過(guò)分詞操作得到詞序列A:{the,quick,brown,fox,jumps,over,the,lazy,dog}。文本串B經(jīng)過(guò)分詞操作得到詞序列B:{the,lazy,brown,dog,jumps,over,the,quick,fox}。
除上述示例中基于拉丁字母的文本串外,分詞操作的對(duì)象同樣可以包括中文文本串,支持中文分詞操作的方案例如包括CRF和MMSEG等。分詞的簡(jiǎn)單方法可以是查一個(gè)中文詞庫(kù)。例如,用一個(gè)包含“中華”、“人民”、“共和國(guó)”的詞庫(kù)可以把中英文混合的一句話“how to translate中華人民共和國(guó)”分詞成'how'、'to'、'translate'、“中華”、“人民”、“共和國(guó)”六個(gè)詞。
分詞操作影響詞序列的元素構(gòu)成和長(zhǎng)度。詞序列越長(zhǎng),后續(xù)執(zhí)行LCS算法所需的時(shí)間也相應(yīng)越長(zhǎng)。然而需要指出,除了LCS運(yùn)算速度外,分詞操作基本上對(duì)整個(gè)算法的結(jié)果沒有影響。
根據(jù)步驟S200,將詞序列分別轉(zhuǎn)換為相應(yīng)的詞集合。繼續(xù)以詞序列A和B為例,在轉(zhuǎn)換過(guò)程中,重復(fù)出現(xiàn)的詞只保留一個(gè),例如“the”。轉(zhuǎn)換后得到詞集合A為[the,quick,brown,fox,jumps,over,lazy,dog];詞集合B為[the,lazy,brown,dog,jumps,over,quick,fox]。
在存在多個(gè)文本串的情況下,可以按照上述步驟將所有文本串分別轉(zhuǎn)換為相應(yīng)的詞集合。
根據(jù)步驟S300,計(jì)算每個(gè)詞集合的最小哈希(MinHash)值,最小哈希值用于判斷兩個(gè)集合的相似性。已知多種計(jì)算MinHash的方法,下文示出的是其中一種基于Python實(shí)現(xiàn)的偽碼。
在步驟S400中,計(jì)算任意兩個(gè)詞集合的MinHash距離。MinHash是固定長(zhǎng)度的數(shù)值,假設(shè)其長(zhǎng)度為64位,那么在這64位中,位置相同而值不同的位的個(gè)數(shù)即為兩個(gè)MinHash值的MinHash距離。這里,兩個(gè)集合的MinHash距離短是該兩個(gè)集合相似的必要非充分條件,這是因?yàn)镸inHash本身是一種概率方法,存在誤報(bào);此外MinHash只考慮元素集合,而忽略元素出現(xiàn)的先后次序。以文本串A和B為例,雖然兩個(gè)文本串不同,但其對(duì)應(yīng)的詞集合有同樣的MinHash值。
將MinHash距離與第一閾值相比較,并且將MinHash距離小于第一閾值的兩個(gè)詞集合所對(duì)應(yīng)的詞序列歸為同一類。其中第一閾值是可調(diào)的,其默認(rèn)值可以設(shè)置為80% 乘以MinHash的位數(shù)。通過(guò)步驟S400,將所有文本串對(duì)應(yīng)的詞序列劃分為一個(gè)或多個(gè)類。
根據(jù)步驟500,在每一類中進(jìn)行最長(zhǎng)公共子序列運(yùn)算。已知多種LCS運(yùn)算的方法,下文示出的是其中一種基于Java實(shí)現(xiàn)的偽碼。
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(tǒng)[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對(duì)步驟S500進(jìn)行詳細(xì)說(shuō)明。
參看圖2,根據(jù)步驟S502到S506,從同一類中選擇兩個(gè)詞序列作為第一詞序列和第二詞序列,并計(jì)算第一詞序列和第二詞序列的最長(zhǎng)公共子序列。需要指出,在這里和下文中,詞序列的選擇可以在符合條件的集合中任意進(jìn)行。
根據(jù)步驟S508,將計(jì)算得到的LCS與第二閾值進(jìn)行比較,如果LCS長(zhǎng)度大于第二閾值,則將該LCS轉(zhuǎn)換為文本串模板。這里,第二閾值是可調(diào)的,其默認(rèn)值可以設(shè)置為80%乘以第一詞序列和第二詞序列長(zhǎng)度中的較大值。換言之,LCS長(zhǎng)度與第一詞序列和第二詞序列長(zhǎng)度中的較大值的比例應(yīng)大于80%。
如果計(jì)算得到LCS長(zhǎng)度不大于第二閾值,則返回步驟S504,將當(dāng)前第二詞序列替換為同一類中的另一詞序列,并重復(fù)步驟S506和S508。這里,該另一詞序列是從該類中在當(dāng)前第一詞序列的運(yùn)算周期內(nèi)尚未參與LCS運(yùn)算的詞序列中選擇的。
重復(fù)步驟S504至S508,直到生成文本串模板。如果窮盡該類中的所有詞序列都無(wú)法生成模板(步驟S504),則刪除當(dāng)前第一詞序列,并從該類中選擇一個(gè)詞序列作為第一詞序列開始重復(fù)上述步驟S504。
下面結(jié)合第一詞序列和第二詞序列的具體實(shí)例進(jìn)一步說(shuō)明生成文本串模板的過(guò)程。為簡(jiǎn)便起見,假設(shè)第一和第二詞序列中的詞都是一個(gè)字母。
一種情況下,假設(shè)第一詞序列為{A,B,A,D,E,F,G},第二詞序列為{A,B,B,D,E,F,G}。經(jīng)過(guò)LCS運(yùn)算,第一詞序列和第二詞序列的LCS為{A,B,D,E,F,G},長(zhǎng)度為6。由于第一和第二詞序列的長(zhǎng)度都是7,可知LCS長(zhǎng)度大于默認(rèn)的第二閾值80%。因此,可以將該LCS轉(zhuǎn)換為模板{A,B,*,D,E,F,G},其中,“*”為占位詞,表示在詞“B”和“D”之間的詞最多為一個(gè)。占位詞也可以選用其他符號(hào),為避免歧義,通常使用在輸入文本中不出現(xiàn)的特殊詞。
另一種情況,假設(shè)第一詞序列為{A,B,D,E,F,G},第二詞序列為{A,B,B,D,E,F,G}。經(jīng)過(guò)LCS運(yùn)算,第一詞序列和第二詞序列的LCS為{A,B,D,E,F,G},長(zhǎng)度為6。由于第一和第二詞序列長(zhǎng)度的較大值是7,可知LCS長(zhǎng)度大于默認(rèn)的第二閾值 80%。因此,同樣可以將該LCS轉(zhuǎn)換為模板{A,B,*,D,E,F,G},其中,“*”為占位詞,表示在詞“B”和“D”之間的詞最多為一個(gè)。
再一種情況,第一詞序列為{A,B,A,D,E,F,G},第二詞序列為{A,B,B,C,E,F,G}。經(jīng)過(guò)LCS運(yùn)算,第一詞序列和第二詞序列的LCS為{A,B,E,F,G},長(zhǎng)度為5。由于第一和第二詞序列的長(zhǎng)度都是7,可知LCS長(zhǎng)度小于默認(rèn)的第二閾值80%。因此,該LCS不能被轉(zhuǎn)換為模板。
應(yīng)當(dāng)理解,根據(jù)詞序列的實(shí)際長(zhǎng)度,生成的模板可以包括多個(gè)占位詞“*”,每個(gè)占位詞表示其所在位置最多可以插入一個(gè)詞。
在生成文本串模板之后,根據(jù)圖3中步驟S510到S512,選擇另一個(gè)詞序列與該文本串模板進(jìn)行LCS計(jì)算。與步驟S502類似,該另一詞序列是從該類中在當(dāng)前第一詞序列的運(yùn)算周期內(nèi)尚未參與LCS運(yùn)算的詞序列中選擇的。例如,第一和第二詞序列計(jì)算得到的LCS已經(jīng)轉(zhuǎn)換為文本串模板,則在該類中選擇除當(dāng)前的第一、第二詞序列之外的一個(gè)詞序列與該文本串模板進(jìn)行LCS計(jì)算。
根據(jù)步驟S512,將計(jì)算得到的LCS與第二閾值進(jìn)行比較,如果LCS長(zhǎng)度大于第二閾值,則將該LCS轉(zhuǎn)換為新的文本串模板。
如果計(jì)算得到LCS長(zhǎng)度不大于第二閾值,則返回步驟S510。
重復(fù)步驟S510到S514,直到窮盡這個(gè)類中所有的詞序列。
根據(jù)步驟S516,輸出文本串模板,并將該文本串模板所能匹配的所有詞序列從該類中刪除。作為替代,刪除文本串模板所能匹配的詞序列也可以在每次得到該文本串模板后進(jìn)行。
返回步驟S502,直至該類為空,即該類中所有的詞序列均被刪除。
同樣的,對(duì)其他類進(jìn)行LCS及文本串模板運(yùn)算,直至所有類為空。
圖4所示的根據(jù)本發(fā)明的用于在多個(gè)文本串中確定最長(zhǎng)公共子序列的設(shè)備400包括第一轉(zhuǎn)換裝置402、第二轉(zhuǎn)換裝置404、第一運(yùn)算裝置406、分類裝置408和第二運(yùn)算裝置410。其中,第一轉(zhuǎn)換裝置402用于將多個(gè)文本串分別轉(zhuǎn)換為詞序列,第二轉(zhuǎn)換裝置404用于將詞序列分別轉(zhuǎn)換為相應(yīng)的詞集合,第一運(yùn)算裝置406用于計(jì)算每個(gè)詞集合的最小哈希值,分類裝置408用于根據(jù)最小哈希值對(duì)詞序列進(jìn)行分類,第二運(yùn)算裝置410用于在每一類中進(jìn)行最長(zhǎng)公共子序列運(yùn)算。
設(shè)備400的功能模塊可以通過(guò)硬件、軟件或硬件與軟件的結(jié)合實(shí)現(xiàn),從而執(zhí)行上述根據(jù)本發(fā)明的方法步驟。此外,第一轉(zhuǎn)換裝置402、第二轉(zhuǎn)換裝置404、第一運(yùn)算裝置406、分類裝置408和第二運(yùn)算裝置410可以組合或者進(jìn)一步分解成子模塊,從而執(zhí)行上述根據(jù)本發(fā)明的方法步驟。因此,上述功能模塊的任何可能的組合、分解或進(jìn)一步的定義都落入權(quán)利要求所保護(hù)的范圍之內(nèi)。
本發(fā)明不限于上述具體描述,本領(lǐng)域技術(shù)人員在上述描述基礎(chǔ)上容易想到的任何改變,都在本發(fā)明的范圍內(nèi)。