211 - 218 頁 pp. 211 - 218
࣒Լ Boyer-Moore ႊზڱٺ͛̚ф̝ຩವ
Ղ烱ˬ
1,*ౘ༄ј
1ၡ ࢋ
本論文發表一個改良的 Boyer-Moore(BM)搜尋演算法,主要觀念是利用中文字出現頻率不同的特性,來 修改比對的順序,使其在中文字串的搜尋上發揮更大的效能。本方法是以先比對搜尋字串中「最不常使用字」 的方式,讓比對的次數降低,以增進搜尋的效率。根據 BM 演算法作者所定義的效能指標,計算比對字串所需 次數與搜尋到字串前跳過字數之比值,本方法效能指標約為 BM 演算法的一半。 ᙯᔣෟ:中文字串搜尋、Boyer-Moore 演算法、最不常使用字壹、݈֏
在電腦軟體應用的領域中,搜尋是一項很重要的議題。不管是用來尋找文件中的某些文字,或者是在網路 上找尋特定關鍵字的網頁,我們都會使用到搜尋的功能。隨著網際網路的發展以及儲存媒體容量的增大,我們 也能夠從網路上獲得大量的數位化內容;除了提供各種資訊的網頁,另外像是電子書、電子期刊,更將原有紙 本的內容以數位化文字的方式重新呈現。數位化所帶來的好處,不僅讓資訊傳播的速度更加快速,運用搜尋的 功能也讓我們能更快速的找到我們想要的資訊。因此,如何在大量的文字之中,找到特定的字串(pattern),便 是我們所關心的事情。 許多研究也都致力於從文字中尋找特定字串的過程,也已經有許多演算法針對其效率做改進。暴力搜尋法 (brute force searching)是從文字的開頭比對字串,並從字串的最左邊一個字元開始比對[1],如果這兩個字元是 一樣的話,就向右繼續比對下一個字元;如果不一樣的話,就將整個字串沿著文字向右移動一個字元,並且重 覆上面的步驟。而 KMP 演算法(Knuth-Morris-Pratt algorithm)是以暴力演算法為基礎,並從字串比較之中獲得 字串的特性,依此改善搜尋效率[2]。BM 演算法(Boyer-Moore algorithm)則是從搜尋字串的最右邊一個字元開 始比對,並試圖跳過一些不可能具有該搜尋字串的字元[3]。而 Hume 與 Sunday 則為字串搜尋演算法提供分類與 組織架構並且評估其效能[5]。 目前有許多字串搜尋的技巧都是針對英文字來做改良,因為有大量的文章、電子期刊、網頁都是以英文撰 寫而成。同樣的,中文字也可用數位化的方式呈現,據估計有 70%的中文出版品在印行之前也都是以數位化的 格式儲存[6]。而且在網路上中文的資料更是快速的成長。因此絕對有必要發展適合中文字特性的字串搜尋方法。 在本篇論文中,將使用一個修改自 BM 演算法的方法,用來尋找特定中文字串出現在文章中的位置。這個 1 亞東技術學院電子工程系教授 * 通訊作者:李烱三 E-mail:[email protected]方法是基於 BM 演算法[3]來改進,以增加比對不吻合(mismatch)的機率來減少比對的次數。
෮ă͛̚ф۞পّ
中文與英文有許多地方不同,主要的差異在於,英文單字是由 26 個英文字母構成;而中文字是由單一的字 元所組成,而且每個字都具有獨立的意義。在 CNS11643 中文標準交換碼中,中文字總計有 48,027 字[7],其中 大部份為異體字或罕用字。因此,中文字需要以 16 個 bit 來編碼,而英文字僅需要 7 個 bit 的 ASCII 碼就足夠 表示。另外,中文是一種相黏的語言,也就是詞與詞之間並沒有用符號分隔,不像英文單字間會以空白分隔, 讀者必須以自己對中文的了解來正確的斷詞。 中文字的另一個特徵就是每個字出現的頻率都不一樣,而且某些字的出現頻率遠較其他字為高。在教育部 的常用國字標準字體表[8]中,共列出常用字 4,808 字。在蔡登傳、羅書宜的台灣地區中文新聞常用字彙的調查 研究中[9],統計 3,600 餘則新聞共 260 餘萬字後,發現這些新聞共用到 5,235 字,另外,95%的中文字是由 1,519 的最常用字所組成的。而其中最常用的字是「的」,佔了 3.37%。 我們也對網路上的 Yahoo!奇摩新聞(http://tw.news.yahoo.com)的用字做調查,統計的期間從 2005-11-20 到 2005-11-26。在分析了這一週內的 1,042 則新聞共 442,601 字後,發現總共使用了 4,051 個中文字,最常使用 的字是「的」,佔了文章總字數的 2.56%。另外,最常出現的標點符號是「,」,佔了 3.02%。而佔總字數 95% 的最常用字是由 1,449 個中文字所組成的。所以,從表一可以知道,每個中文字出現的頻率都不一樣,而且某 些字的出現頻率遠較其他字的頻率為高。而在英文字中並沒有這樣的特性,英文字母的出現頻率並不會有如此 大的差異性。所以接下來我們將運用此一特性,來改善 BM 演算法在搜尋中文字串時的效率。 ܑ˘ ͛̚фֹϡᐛத̙Т۞পّ 項目 中文報紙[9] 網路新聞 文章的文字總數 2.61*106 字 4.4*105 字 最常用字出現次數(佔百分比) 78170(3.37%) 11346 (2.56%) 最罕用字出現次數(佔百分比) 1(0.000038%) 1(0.0002%) 總共所使用的中文字 5235 字 4051 字 佔總字數 95%的最常用字 1519 字 1449 字
ણăBM ႊზڱ̈́Լ։͞ڱ
在這個部份,我們將要介紹一種改良自 BM 演算法(Boyer-Moore algorithm)的字串搜尋方法。BM 演算法 試圖跳過一些不可能具有該搜尋字串的字元,並且是從搜尋字串的最右邊一個字元開始比對,如果這兩個字元 是一樣的話,就向左回來比對前一個字元;如果不一樣的話,則檢查這個字是不是曾出現在要搜尋的字串中, 有出現則移動字串將該字元與該字元最右一次出現在字串的位置對齊;如果比對的字元沒有出現在要搜尋的字 串中,也就是所謂的比對不吻合(mismatch),則可以直接跳過與字串等長的字元,因為其中必不存在我們要尋 找的字串。因為 BM 演算法是從搜尋字串的最右邊的字元開始比對,所以如果該字元經常出現在文章中,將會 使得比對的次數增加。在圖一中,我們使用這個繞口令做為搜尋的文章,因為它是由較少的相異中文字(四、 個、十、共、幾)所組成,而且每個中文字出現的頻率差異較大(四:9 次、個:6 次、十:7 次、共:1 次、幾:1 次)。假設我們要搜尋的字串是「幾個四」,那麼在 BM 演算法中的比對順序就是「四」,接著是「個」, 最後比對「幾」。這麼一來,需要比對三次,如圖一中的○1 到○3 ,才能跳過開頭的「四個四」,因為先比對的「四」 和「個」在我們要搜尋的文字中,出現的頻率很高,所以會增加比對的次數。在○12、○13和○14中也有一樣的情形。 最後 BM 演算法總共需要比對 20 次才能找到搜尋字串「幾個四」出現在文字中的位置。根據文獻[3]作者所定 義的效能指標(performance index),計算找到搜尋字串所需要的比對次數與在找到字串前跳過的字數之比值, 當比對次數越少時,效能指標也越小。在圖一例子的搜尋,BM 演算法的效能指標為 0.74(=20/27)。 ဦ˘ ֹϡ BM ႊზڱຩವфҚĶೀ࣎αķ 因此,我們將 BM 演算法做一些修改,讓比對字串的順序不再是從最右邊的字元開始,而是從最不常用字 開始比對,因為這樣可以增加比對不吻合的機率,進而減少比對的次數。在實做時,將需要建立一個中文字的 出現頻率表,從頻率表中出現次數最少的字,也就是最不常用字開始比對;而在圖二中,我們依照「幾」「個」 「四」出現在文章中的次數來安排比對的順序,也就是從最少出現的「幾」開始比對,然後是「個」,最後才比 對「四」。比對的結果便如圖二所示,共比對 15 次就找到搜尋的字串。在圖二例子的搜尋,改良的 BM 演算法 之效能指標為 0.56(=15/27)。 ဦ˟ ֹϡԼ։۞ BM ႊზڱຩವфҚĶೀ࣎αķ 為了便於解釋比對的概念,我們定義每次在文字中要與搜尋字串比對的一組文字為一個比對的區間,其長 度為搜尋字串的長度。比對區間將隨著要搜尋的字串移動,然後依照最不常用字先比對的順序,檢查比對區間 中的字元是否相同。當檢查到字元不同時,就移動到下一個比對的區間。在圖二中,因為前三個比對區間中的 第一個字元不是「幾」,所以我們可以順利的跳過,並且移動到第四個比對區間。在第四個比對區間中,第一個 字元是「個」,雖然不是「幾」,但是他出現在我們要搜尋的字串「幾個四」中,有可能是我們要找的。因此我
們就產生一個暫時的比對區間,將「個」與搜尋字串中的「個」對齊,然後重新檢查第一個字元是不是「幾」。 結果第一個字元是「四」,於是我們便放棄這個比對區間,回到之前比對的下一個比對區間。到了第○13次比對時, 因為「幾」出現在要搜尋的字串中,而且正與「幾」在搜尋字串中的位置相符,所以我們便繼續比對這個比對 區間中的其他文字,直到我們依照比對順序在最後找到「幾」、「個」、「四」,並且傳回字串所在的位置。 這樣的方法通常可以減少比對的次數,而發揮比 BM 演算法更好的效能。在中文字的比對中更是如此,通 常我們只需要兩次的比對就可以跳過含有部份搜尋文字的比對區間;第一次是產生一個暫時的比對區間與該組 文字對齊,第二次比對則可以找到與搜尋字串相異的字元,也就是可以跳過該比對區間。舉例來說,當我們在 圖二中比對「十四個四十四」這組文字時,我們需要比對○9、○10、○11三次,就可以發現其中不含有要搜尋的字 串而跳過這組文字;而在圖一中以 BM 演算法比對時,則需要○10到○15共六次才能跳過該組文字。然而,在改良 的方法中,如果搜尋字串的比對順序與 BM 演算法相同時,則比對的效能可能不會有明顯的增加。 改進方法的步驟如圖三所示。在步驟一中所使用的中文字出現頻率表,可以從一些相關的文獻[9],或是一 些統計資料中取得,在本文第四部分中,將使用一個可以動態更新的頻率表。步驟四可以減少在 BM 演算法中 重覆比對某些字元的問題。 1. 從中文字出現頻率表中,找出搜尋字串裡每個字元出現的頻率,由先比對不常用字的原則來 建立比對的順序 2. 從要搜尋的文章開頭,產生一個比對區間 3. 依照比對順序檢查區間中的字, If 第一個比對的字元有出現在搜尋字串中, Then 產生一個暫時的比對區間 並且將該字元與他在搜尋字串中的位置對齊 然後依照比對順序檢查區間中的字 If 與搜尋字串完全符合的話 Then 傳回字串在文章中的位置 4. 移動距離=MAX(用 BM 演算法計算的值,下一個比對區間) 5. If 已經比對到了文章的結尾 Then 傳回找不到的訊息 Else 回到步驟 2. ဦˬ Լ։͞ڱ۞Վូ 當我們在比對區間中檢查的第一個字元曾經出現在搜尋字串中時,會產生一個暫時的比對區間,然後繼續 比對其中的字元。但是,如果這個字元不只一次出現在搜尋字串中時,我們就要產生許多暫時的比對區間來繼 續比對的動作。在文獻[3]中的例子,搜尋字串「AT-THAT」包含了兩個「A」與三個「T」,而應用我們的方法, 比對的順序則為 H、A、A、T、T、T、-。如圖四所示,第五個比對的字元是第四個比對區間的○5 「T」。因此, 我們需要三個暫時的比對區間來對齊「T」並繼續比對,分別是「-THAT-P」、「AT-THAT」和「.--AT-T」。在第 一個暫時的比對區間「-THAT-P」中,因為第一個檢查的字元,也就是比對區間中的倒數第三個字元○6 ,並不是 「H」,所以我們就跳過這個暫時的比對區間。接著第二個暫時的比對區間「AT-THAT」,按照比對順序從○7到○13, 就可以找到搜尋字串的位置。我們改良的方法共比對了 13 次,比原本的 BM 演算法少了 9 次。
ဦα ֹϡԼ։۞ BM ႊზڱֽຩವфҚĶAT-THATķ
དྷăෞҤԼ։͞ڱ۞ड़த
本節引用兩種實際的搜尋應用來說明 BM 改良法有很明顯的效能提昇,第一例是應用於網路新聞的搜尋 上,第二例是應用於在一般個人電腦搜尋電腦名稱。 4.1 შྮາჷ۞ຩವ 首先,我們以網路上的 Yahoo!奇摩新聞(http://tw.news.yahoo.com)為文章的來源。該新聞共分十二大類(政 治、社會、國際、兩岸、財經、影視、體育、生活、休閒、科技、健康、新奇),每則新聞的內容是由不同的平 面或電子媒體所提供。我們將新聞內容按照日期存入資料庫,同時也計算每一篇蒐集到的新聞中,每個中文字 的使用頻率。我們每天會更新一次資料庫,一天約有 150 則新聞,一個星期所蒐集到的新聞約有 43 萬個中文字。 因為中文字的使用頻率,會隨著時間的不同而異,所以我們每天更新一次資料庫,並且在搜尋時從資料庫取出 最新一週的中文字累積出現頻率,來排列搜尋字串的比對順序。 評估的方法是讓 BM 演算法與我們改良的方法同時尋找所有含有搜尋字串的新聞,然後計算找到這些新聞 所需要的總比對次數。在不考慮 BM 演算法在實做時需要製作每個字元可跳過長度表的時間以及改良的演算法 從資料庫中搜尋不常用字頻率的時間和程式執行所需的時間的前提下,針對兩種搜尋方法的總比對次數進行比 較。 在開始搜尋前,我們先利用之前統計的中文字出現頻率表,以執行搜尋時一週內的資料為基礎,來安排搜 尋字串的比對順序。譬如,搜尋字串是「我們」,「我」在中文字出現頻率表中的次數是 382 次,「們」是 337 次。 依照不常用字先搜尋的規則,搜尋的順序是「們」→「我」,其比對順序恰與 BM 演算法相同。而如果搜尋字串 是「你的」,「你」在中文字出現頻率表中的次數是 105 次,「的」是 6,644 次,所以搜尋的順序是「你」→「的」, 比對順序與 BM 演算法不同。 然後從中研院現代漢語平衡語料庫的雙音節頻率前 5000 詞表[10]中,取出 100 個二字詞(如:我們、你的、 台灣、公司、研究)為搜尋字串。比對結果發現,在這 100 個二字詞中,兩者的比對次數有 29 個是相同的,而 有 71 個是改良後的演算法比對次數較少,也就是效能較佳;在這 71 個比對的二字詞中,BM 演算法總比對次 數為 202,154 次,而改良後的演算法總比對次數為 196,408 次,減少的次數為 5,746 次。另外,我們也從中研院現代漢語平衡語料庫[10]中,取出 100 個三字詞(如:為什麼、小朋友、研究所、教 育部)為搜尋字串。結果發現,在這 100 個三字詞中,有 54 個是改良後的演算法比對次數較少,也就是效能較 佳;在這 54 個比對的三字詞中,BM 演算法總比對次數為 173,431 次,而改良後的演算法總比對次數為 168,653 次,減少的次數為 4,778 次。也就是說,依照中文字出現頻率的不同,來改變比對字串順序的方法,能夠增進 比對的效能。 同樣的,我們也比較在搜尋兩個字到六個字的搜尋字串時,與 BM 演算法比對效能的差別。我們各選出 20 組關鍵字如旅遊、委員會、…,長度從兩個字到六個字的搜尋字串共 100 組,讓 BM 演算法與我們改良的方法 同時尋找所有含有搜尋字串的新聞。比較 BM 演算法與本論文提出的方法效能指標的差別。結果如圖五所示, 可以發現改良後的方法之效能指標約為 BM 演算法的一半,而兩者之間顯著的差距表示,本方法確實能有效的 增進搜尋的效率,而且關鍵字長度愈長其搜尋效率愈好。 ဦ̣ BM ႊზڱᄃԼ։͞ڱ۞ड़ਕᇾͧྵ 4.2 ࣎ˠཝ˯͛̚۞ᙯᔣфຩವ 很多人都需建置文件檔案(如撰寫報告、研究計畫、結案報告等),儲存於個人電腦中。經過一段時間後, 會忘記該文件的名稱及儲存位置,而只記得幾個重要的關鍵字。一個最簡單的方法是用搜尋『檔案名稱』或『檔 案裡的字或片語』來找關鍵字。 在圖六中,我們分別依據 BM 演算法及改良方法的觀念來發展兩支搜尋『檔案裡的片語』程式,該程式會 先詢問關鍵字及資料夾路徑,然後一直搜尋到該關鍵字或整個資料夾找完為止。在搜尋過程中同時記錄比較次 數及跳過的字數。我們製作了一個全為中文檔案的資料夾,內有大小不一的檔案共約 300 個、總共約 400MB。 中文字含標點符號 2bytes 算一個字,英文字含標點符號 1byte 算一個字。 我們控制『跳過的字數』是約 50 萬字、100 萬字、150 萬字、200 萬字、250 萬字、300 萬字,來觀察效能 提昇的百分比,也就是改良 BM 演算法所『減少的比較次數』除以 BM 演算法的比較次數之百分比,如所示。 控制『跳過的字數』是找尋特定關鍵字的位置必須跳過指定的字數。這樣可以看出『減少的比較次數』與關鍵 字數關係。
ဦ̱ ड़ਕ೩چѺ̶ͧ
̣ăඕኢ
本文呈現一種中文字串搜尋方法,是利用中文字出現頻率的不同來改良 Boyer-Moore(BM)演算法。因此 本搜尋方法也承襲了 BM 演算法的基礎,會跳過一些不可能含有欲搜尋字串的中文字。改良 BM 演算法在搜尋 過程中會形成一比對區間,並且先比對較不常用的字以增加比對不吻合的機率,進而減少比對的次數來增進搜 尋的效率。本文將所提出的改良 BM 演算法運用到中文環境上,如搜尋新聞文章及個人電腦內特定中文關鍵字, 皆有顯著的效能提昇,而且搜尋字串越長其效率越高。ણ҂͛ᚥ
1. S. Baase, Computer Algorithms – Introduction to design and analysis, Addison Wesley (1988).
2. D.E. Knuth, J. H. Morris and V.R. Pratt, “Fast pattern matching in strings,” SIAM Journal of Computing, Vol.6, pp. 323-350 (1990). 3. R.S. Boyer and J. S. Moore, “A Fast String Searching Algorithm,” Communication of the ACM, NO. 10, Vol. 20, pp. 762-772 (1997). 4. A. Apostolico and R. Giancarlo, “The Boyer-Moore-Galil string searching strategies revisited,” SIAM Journal on Computing, vol. 15,
no. 1, pp. 98-105, Feb. 1986.
5. A. Hume and D. Sunday, “Fast String Searching,” Software – Practice and Experience, Vol. 21, pp. 1221-1248 (1991).
6. J.N. Chang and M. H. Chen, “Using World-segmentation model for compression of Chinese text,” Computer processing of Chinese and oriental Languages, Vol. 9, No. 1, pp. 17-30 (1995)
7. CNS11643 中文標準交換碼,參閱日期 105 年 9 月 22 日,http://www.cns11643.gov.tw. 8. 教育部,常用國字標準字體表,參閱日期 105 年 9 月 22 日,
http://language.moe.gov.tw/result.aspx?classify_sn=23&subclassify_sn=437&content_sn=46
9. 蔡登傳,羅書宜,台灣地區中文新聞常用字彙的調查研究,科技學刊,第 8 卷,第 4 期,第 312-332 頁(1999)。 10. 中研院現代漢語平衡語料庫,參閱日期 105 年 9 月 22 日,http://app.sinica.edu.tw/cgi-bin/kiwi/mkiwi/kiwi.sh.
A Searching Heuristic for Chinese Texts based on Boyer-Moore Algorithm
Chiung-San Lee
1,*Jui-Cheng Chen
Abstract
This paper proposed a searching heuristic for Chinese Texts based on Boyer-Moore (BM)algorithm, using the characteristic of Chinese texts that the characters occur with unequal frequency to modify comparative sequence. It makes better performance when searching Chinese patterns. In the proposed heuristic, the character in the pattern with the least used frequency will be checked first. Thus, we can reduce the comparisons, and improve performance. According to the performance index defined by BM’s authors, dividing the number of comparisons by the number of characters passed before the pattern was found, the proposed heuristic’s performance index is about half of the original BM algorithm.
Keywords: Chinese string searching, Boyer-Moore algorithm, least frequently used character
1
Oriental Institute of Technology
*
Correspondence author: Chiung-San Lee E-mail:[email protected]