1. 程式人生 > >【串和序列處理 1】PAT Tree 子串匹配結構

【串和序列處理 1】PAT Tree 子串匹配結構

Patricia Tree  簡稱PAT tree。 它是 trie 結構的一種特殊形式。是目前資訊檢索領域應用十分成功的索引方
法,它是1992年由Connel根據《PATRICIA——Patrical Algorithm to Retrieve Information Coded in Alphanumeric》演算法發展起來的。

PAT tree 在字串子串匹配 上有這非常優異的表現,這使得它經常成為一種高效的全文檢索演算法,在自然語言處理領域也有廣泛的應用。其演算法中最突出的特點就是採用半無限長字串(semi-infinite string 簡稱 sistring) 作為字串的查詢結構。

採用半無限長字串(sistring): 一種特殊的子串資訊儲存方式。

比如一個字串CUHK。它的子串有C、CU、CUH、CUHK、U、UH、UHK、H、HK、K十種。如果有n個字元的串,就會有n(n+1)/2種子串,其中最長的子串長度為n。因此我們不得不開闢 n(n+1)/2個長度為n的陣列來儲存它們,那麼儲存的空間複雜度將達到驚人的O(n^3)級別。

但是我們發現這樣一個特點:

CUHK ——  完全可以表示 C、CU、CUH、CUHK

            UHK   ——  完全可以表示 U、UH、UHK

            HK     ——  完全可以表示 H、HK、

            K       ——  完全可以表示

 K

這樣我們就得到了4個sistring: CUHK、UHK、HK和K。

PAT tree的儲存結構

如果直接用單個字元作為儲存結點,勢必構造出一棵多叉樹(如果是中文字元的話,那就完蛋了)。檢索起來將會相當不便。事實上,PAT tree是一棵壓縮儲存的二叉樹結構。現在我們用“CUHK”來構造出這樣一棵PAT tree 。

開始先介紹一下PAT tree的結點結構(看了後面的過程就再來理解這些概念)

* 內部結點:用橢圓形表示,用來儲存不同的bit位在整個完整bit sequence中的位置。

* 外部節點(葉子結點): 用方形表示,用來記錄sistring的首字元在完整sistring中的開始位置(字元索引)和sistring出現的頻次。

* 左指標:如果 待儲存的sistring在 內部結點所儲存的bit位置上的資料 是0,則將這個sistring儲存在該結點的左子樹中。

* 右指標:若資料是1,則儲存在右子樹中。

(1) 將所有sistring的字元轉化成1 bytes的ASCII碼值,用二進位制位來表示。形成一個bit sequence pattern(沒有的空字元我們用0來填充)。

                         sistring                           bit sequence

 完整sistring  ->   CUHK        010 00011   01010101   01001000   01001011   <- 完整bit sequence

                          UHK0        010 10101   01001000   01001011   00000000                          

                          HK00         01001000   01001011   00000000   00000000

                          K000         01001011   00000000   00000000   00000000

(2) 從第一個bit開始我們發現所有sistring的前3個bit位都相同010,那麼相同的這些0/1串對於匹配來說就毫無意義了,因此我們接下來發現第4個bit開始有所不同了。UHK 的第4個bit是1,而CUHK、HK、K的第4個bit是0。則先構造一個內部結點iNode.bitSize=4(第4個bit),然後將UHK的字元索引 cIndex=2(UHK的開始字元U在完整的CUHK的第2位置上)構造成葉子結點插入到iNode的左孩子上,而CUHK、HK、K放在iNode右子樹中。(如下圖2)

(3) 遞迴執行第2步,將CUHK、HK、K進一步插入到PAT tree中。流程如下圖所示。所有sistring都插入以後結束。

注意:既然PAT tree 是二叉查詢樹,那麼一定要滿足二叉查詢樹的特點。所以,內部結點中的bit 位就需要滿足,左孩子的bit 位< 結點bit 位< 右孩子的bit 位。

PAT tree的檢索過程

利用PAT tree可以實現對語料的快速檢索,檢索過程就是根據查詢字串在PAT tree中從根結點尋找路徑的過程。當比較完查詢字串所有位置後,搜尋路徑達到PAT tree的某一結點。

      若該結點為葉子結點,則判斷查詢字串是否為葉子結點所指的半無限長字串的字首,如果判斷為真,則查詢字串在語料中出現的頻次即為葉子結點中記錄的頻次;否則,該查詢字串在語料中不存在。

      若該結點為內部結點,則判斷查詢字串是否為該結點所轄子樹中任一葉子結點所指的半無限長字串的字首。如果判斷為真,該子樹中所有葉子結點記錄的頻次之和即為查詢字串的出現頻次。否則,查詢字串在語料中不存在。

      這樣,通過PAT tree可以檢索原文中任意長度的字串及其出現頻次,所以,PAT tree也是可變長統計語言模型優良的檢索結構。

例如:要查詢string= “CU ”(bit sequence=010 00 0 1 1 01010101) 是不是在CUHK 中。

(1)   根據“CUHK ”的PAT tree 結構( 如上圖) ,根結點r 的bit position=4 ,那麼查詢bit sequence 的第4 個bit=0 。然後查詢R 的左孩子rc 。

(2)    rc 的bit position=5 ,在bit sequence 的第5 個bit=0 。則查詢rc 的左孩子rcc 。

(3)   rcc= ” CUHK ” 已經是葉子結點了,則確定一下CU 是不是CUHK 的字首即可。

PAT tree 的效率

      特點:PAT tree查詢的時間複雜度和樹的深度有關,由於樹的構造取決於不同bit位上0,1的分佈。因此PAT tree有點像二叉查詢樹 ,最壞情況下是單支樹(如上圖例子),此時的時間複雜度是O(n-1),n為字串的長度。最好情況下是平衡二叉樹 結構,時間複雜度是O(log2(N))。另外,作為壓縮的二叉查詢樹,其儲存的空間代價大大減少了。

PAT tree的實際應用

       PAT tree在子串匹配上有很好的效率,這一點和Suffix Tree(字尾樹),KMP演算法的優點相同。因此PAT tree在資訊檢索和自然語言處理領域是非常常用的工具。比如:關鍵字提取,新詞發現等NLP領域經常使用這種結構。