專利名稱:通過預(yù)計算優(yōu)化搜索引擎分詞的方法及搜索引擎分詞裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機科學(xué)技術(shù)領(lǐng)域,特別涉及一種通過預(yù)計算優(yōu)化搜索引擎分詞的方法及搜索引擎分詞裝置。
背景技術(shù):
分詞是搜索引擎最基本的功能,是搜索引擎根據(jù)用戶提交的關(guān)鍵詞串用各種方法進行匹配的一種技術(shù)。現(xiàn)有搜索引擎為了達到較好的分詞效果,分詞詞典容量一般都比較大,并且采用明文分詞詞典,通過線上計算的方式生成內(nèi)部的數(shù)據(jù)結(jié)構(gòu)?,F(xiàn)有搜索引擎一般采用線性索引表、倒排表、散列(hash)和搜索樹等數(shù)據(jù)結(jié)構(gòu)。線性索引表和倒排表都是靜態(tài)索引結(jié)構(gòu)。散列(Hash)是通過特定的散列函數(shù)和與之配套的處理沖突方法,將字符映射到某個存儲位置,在搜索時只要對字符進行Hash計算就能得到存儲位置。現(xiàn)有技術(shù)的缺點如下(I)、靜態(tài)搜索搜索時間與分詞詞典的大小相關(guān),當(dāng)詞典容量大的時候響應(yīng)時間長,難以達到0(1)的量級,并且靜態(tài)搜索在詞典變更時需要做的改動較大。(2)、散列搜索速度快,時間復(fù)雜度能夠優(yōu)化到0(1),但是空間利用率低,內(nèi)存占用大,并且查詢時間也依賴于Hash沖突處理機制的設(shè)計。(3)、分詞詞典大導(dǎo)致載入時間長,使得搜索產(chǎn)品應(yīng)對故障的響應(yīng)不夠敏捷,容易造成流量的大規(guī)模損失,同時模塊啟動時間長也會影響到日常產(chǎn)品運維的效率。(4)、載入過程中大量的計算和頻繁的IO操作,容易給線上服務(wù)的穩(wěn)定性造成沖擊。
發(fā)明內(nèi)容
本發(fā)明的目的旨在至少解決上述技術(shù)缺陷之一。為此,本發(fā)明的目的在于提出一種通過預(yù)計算優(yōu)化搜索引擎分詞的方法,通過優(yōu)先考慮Trie樹子節(jié)點數(shù)目較多節(jié)點的轉(zhuǎn)移字符以及空閑碎片的有效利用,提高了空間利用率,并通過進行線下的預(yù)計算,提高了搜索引擎線上分詞模塊的載入速度,不需要耗費大量計算資源和頻繁10,不會對線上服務(wù)的穩(wěn)定性造成沖擊。通過簽名還能夠有效避免詞典文件格式錯誤或者內(nèi)容缺失對分詞效果的影響。本發(fā)明的第二個目的在于提供一種通過預(yù)計算優(yōu)化搜索引擎分詞的系統(tǒng)。為達到上述目的,本發(fā)明第一方面的實施例公開了一種通過預(yù)計算優(yōu)化搜索引擎分詞的方法。該方法包括以下步驟按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼,其中,對所述Trie樹子節(jié)點的數(shù)目多的字符優(yōu)先進行編碼;根據(jù)所述序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組;根據(jù)所述序列碼、所述第一數(shù)組和所述第二數(shù)組在所述分詞詞典中進行分詞查詢。由于序列碼是優(yōu)先考慮Trie樹子節(jié)點數(shù)目較多節(jié)點的轉(zhuǎn)移字符,因此這部分子節(jié)點最后在雙數(shù)組存儲的時候一般都是連續(xù)的,從而在查詢時間保持0(1)的量級的同時提高了空間利用率,降低了內(nèi)存占用。在本發(fā)明的一個實施例中,還包括將所述序列碼、所述第一數(shù)組和所述第二數(shù)組轉(zhuǎn)換為二進制文件,并生成相應(yīng)的簽名。在搜索引擎線上服務(wù)時,分詞模塊能直接從二進制文件進行載入,載入速度快,避免了大量的計算和頻繁的IO操作,并且不會對線上服務(wù)的穩(wěn)定性造成沖擊。生成的相應(yīng)簽名能夠預(yù)防文件格式和內(nèi)容的錯誤。在本發(fā)明的一個實施例中,還包括將所述序列碼、所述第一數(shù)組和所述第二數(shù)組進行尾部位置空間截斷。尾部位置空間截斷能夠有效節(jié)省內(nèi)存。 在本發(fā)明的一個實施例中,所述按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼進一步包括計算每個字符的Trie樹子節(jié)點的數(shù)目;根據(jù)所述Trie樹子節(jié)點的數(shù)目依次對所述字符的內(nèi)碼進行哈希計算以生成所述序列碼,并根據(jù)所述字符在所述分詞詞典中詞語中的位置確定所述字符的節(jié)點位置。在本發(fā)明的一個實施例中,所述根據(jù)序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組進一步包括根據(jù)所述Trie樹子節(jié)點的數(shù)目依次將所述序列碼中的字符填入所述第一數(shù)組和所述第二數(shù)組。在本發(fā)明的一個實施例中,其中,如果所述字符所代表的詞屬于所述分詞詞典,則所述字符在所述第一數(shù)組中對應(yīng)的值為0,或者所述字符在所述第二數(shù)組中對應(yīng)的值為負(fù)值;如果所述字符為中間節(jié)點,則所述字符在所述第一數(shù)組中對應(yīng)的值非O。在本發(fā)明的一個實施例中,其中,如果所述字符在所述第一數(shù)組中對應(yīng)的值為負(fù)值,則表示向前查找空閑位置。對于子節(jié)點數(shù)較少節(jié)點的轉(zhuǎn)移字符,在填充數(shù)組的時候采用從前向后回溯的方式來填補前面產(chǎn)生的空隙,將之前閑置的零散節(jié)點回收利用,從而更進一步提高了空間利用率。本發(fā)明第一方面的實施例公開了一種搜索引擎分詞裝置,包括序列碼生成模塊,用于按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼,其中,對所述Trie樹子節(jié)點的數(shù)目多的字符優(yōu)先進行編碼;數(shù)組生成模塊,用于根據(jù)所述序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組;以及分詞查詢模塊,用于根據(jù)所述序列碼、所述第一數(shù)組和所述第二數(shù)組在所述分詞詞典中進行分詞查詢。搜索引擎分詞裝置中,由于序列碼是優(yōu)先考慮Trie樹子節(jié)點數(shù)目較多節(jié)點的轉(zhuǎn)移字符,因此這部分子節(jié)點最后在雙數(shù)組存儲的時候一般都是連續(xù)的,從而在查詢時間保持0(1)的量級的同時提高了空間利用率,降低了內(nèi)存占用。在本發(fā)明的一個實施例中,還包括轉(zhuǎn)換模塊,用于將所述序列碼、所述第一數(shù)組和所述第二數(shù)組轉(zhuǎn)換為二進制文件,并生成相應(yīng)的簽名。在搜索引擎線上服務(wù)時,分詞模塊能直接從二進制文件進行載入,載入速度快,避免了大量的計算和頻繁的IO操作,并且不會對線上服務(wù)的穩(wěn)定性造成沖擊。生成的相應(yīng)簽名能夠預(yù)防文件格式和內(nèi)容的錯誤。在本發(fā)明的一個實施例中,所述轉(zhuǎn)換模塊還用于將所述序列碼、所述第一數(shù)組和所述第二數(shù)組進行尾部位置空間截斷。尾部位置空間截斷能夠有效節(jié)省內(nèi)存。在本發(fā)明的一個實施例中,所述序列碼生成模塊進一步包括計算子模塊,用 于計算每個字符的Trie樹子節(jié)點的數(shù)目;以及生成子模塊,用于根據(jù)所述Trie樹子節(jié)點的數(shù)目依次對所述字符的內(nèi)碼進行哈希計算以生成所述序列碼,并根據(jù)所述字符在所述分詞詞典中詞語中的位置確定所述字符的節(jié)點位置。在本發(fā)明的一個實施例中,所述數(shù)組生成模塊根據(jù)所述Trie樹子節(jié)點的數(shù)目依次將所述序列碼中的字符填入所述第一數(shù)組和所述第二數(shù)組。在本發(fā)明的一個實施例中,其中,如果所述字符所代表的詞屬于所述分詞詞典,則所述字符在所述第一數(shù)組中對應(yīng)的值為0,或者所述字符在所述第二數(shù)組中對應(yīng)的值為負(fù)值;如果所述字符為中間節(jié)點,則所述字符在所述第一數(shù)組中對應(yīng)的值非O。在本發(fā)明的一個實施例中,其中,如果所述字符在所述第一數(shù)組中對應(yīng)的值為負(fù)值,則表示向前查找空閑位置。本發(fā)明附加的方面和優(yōu)點將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過本發(fā)明的實踐了解到。
本發(fā)明上述的和/或附加的方面和優(yōu)點從下面結(jié)合附圖對實施例的描述中將變得明顯和容易理解,其中圖I為根據(jù)本發(fā)明實施例的通過預(yù)計算優(yōu)化搜索引擎分詞的方法的流程框圖;圖2為本發(fā)明具體實施例的Trie樹示意圖;圖3為根據(jù)本發(fā)明實施例的雙數(shù)組內(nèi)容示意圖;以及圖4為根據(jù)本發(fā)明實施例的搜索引擎分詞裝置的結(jié)構(gòu)圖。
具體實施例方式下面詳細(xì)描述本發(fā)明的實施例,所述實施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實施例是示例性的,僅用于解釋本發(fā)明,而不能解釋為對本發(fā)明的限制。下面參考圖I至圖3描述根據(jù)本發(fā)明實施例的通過預(yù)計算優(yōu)化搜索引擎分詞的方法。在本發(fā)明的一個實施例中,分詞詞典里內(nèi)容包括啊、阿根廷、阿膠、阿拉伯、阿拉伯人、埃及。根據(jù)分詞詞典生成的Trie樹如圖2所示??梢岳斫獾氖?,上述分詞詞典以及Trie樹僅出于示例的目的,本發(fā)明實施例并不限于此。步驟SllO :按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼,其中,對Trie樹子節(jié)點的數(shù)目多的字符優(yōu)先進行編碼。
按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼進一步包括步驟Slll :計算每個字符的Trie樹子節(jié)點的數(shù)目。步驟S112 :根據(jù)Trie樹子節(jié)點的數(shù)目依次對字符的內(nèi)碼進行哈希計算以生成序列碼,并根據(jù)字符在分詞詞典中詞語中的位置確定字符的節(jié)點位置。(例如為中間節(jié)點或葉子節(jié)點)在本發(fā)明的一個實施例中,漢字的內(nèi)碼由兩個字節(jié)組成,共計65536個,一般分詞詞典中出現(xiàn)的字符小于內(nèi)碼總數(shù),設(shè)計 時將序列碼為連續(xù)的。按照圖2所示的Trie樹對分詞詞典中字符按照Trie樹子節(jié)點的數(shù)目遞減的順序進行編碼,生成序列碼如表I所示,
~W\阿I埃I根卜·膠I拉I及I SI伯I人
~ 2 35 6 7 8 9 θ~表I表I中第一行存儲字符,第二行存儲與該字符對應(yīng)的序列碼,例如,“啊”的序列碼為1,“阿”的序列碼為2。采用code數(shù)組來表示序列表,選擇適當(dāng)?shù)膆ash函數(shù),使得hash計算量小,并且序列碼表的長度和出現(xiàn)過的字符數(shù)差距較小。當(dāng)給定一個字符時,將其內(nèi)碼通過hash函數(shù)進行轉(zhuǎn)換,能夠在O (I)的時間內(nèi)得到該字符對應(yīng)的序列碼??梢岳斫獾氖?,上述序列碼以及code數(shù)組僅出于示例的目的,本發(fā)明實施例并不限于此。步驟S120 :根據(jù)序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組;根據(jù)序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組進一步包括步驟S121 :根據(jù)Trie樹子節(jié)點的數(shù)目依次將序列碼中的字符填入第一數(shù)組和第二數(shù)組。在本發(fā)明的一個實施例中,將第一數(shù)組記作數(shù)組base□,將第二數(shù)組記作數(shù)組check[]0從Trie樹子節(jié)點數(shù)最多的節(jié)點開始,選擇圖2中第一層的轉(zhuǎn)移條件“啊”、“阿”和“?!?,根據(jù)表I得到對應(yīng)的序列碼分別為1、2、3,如圖3所示,依次放入雙數(shù)組對應(yīng)的I、2、3的位置上,再繼續(xù)選擇子節(jié)點最多的節(jié)點3,轉(zhuǎn)移條件分別為“根”、“膠”和“拉”,根據(jù)表I查出對應(yīng)的序列碼分別為4、5、6。由于序列碼是優(yōu)先考慮Trie樹子節(jié)點數(shù)目較多節(jié)點的轉(zhuǎn)移字符,因此這部分子節(jié)點最后在雙數(shù)組存儲的時候一般都是連續(xù)的,從而提高了空間利用率。對于子節(jié)點數(shù)較少節(jié)點的轉(zhuǎn)移字符,在填充數(shù)組的時候采用從前向后回溯的方式來填補前面產(chǎn)生的空隙,將之前閑置的零散節(jié)點回收利用,尤其對于含有大量專有名字的分詞詞典,能夠更進一步提高了空間利用率。如圖3所示,“阿拉”在雙數(shù)組對應(yīng)的7的位置上,“埃及”在雙數(shù)組對應(yīng)的8的位置上等。步驟S122 :如果字符所代表的詞屬于分詞詞典,則字符在第一數(shù)組中對應(yīng)的值為0,或者字符在第二數(shù)組中對應(yīng)的值為負(fù)值。在本發(fā)明的一個實施例中,由于Trie樹中節(jié)點2是葉子節(jié)點,因此“啊”對應(yīng)的base [I]標(biāo)記為0,Check值標(biāo)記為0,check值標(biāo)記為O表示對應(yīng)的節(jié)點父節(jié)點為根節(jié)點;由于“阿膠”是一個分詞詞典中的詞,因此“阿膠”對應(yīng)的base[6] = O, check[6] = -check[6]。
步驟S123 :如果字符為中間節(jié)點,則字符在第一數(shù)組中對應(yīng)的值非O?!鞍ⅰ睘橹虚g節(jié)點,設(shè)置“阿”對應(yīng)的base[2] = I。在本發(fā)明的一個實施例中,每次為序列碼中的字符查找存儲空間時,不能使用字符的序列碼所對應(yīng)的數(shù)組的位置,必須向前或者向后移動I個單位及以上。例如“根”的序列碼是4,那么即使base[4]和check[4]這兩個位置目前是空閑的也不可以使用,需要向前或者向后移動I個單位及以上。此處設(shè)置單位為數(shù)組的一個位置??梢岳斫獾氖?,上述單位僅出于示例目的,本發(fā)明不限于此。具體設(shè)置“阿”對應(yīng)的base[2] = I過程如下詞典中以“阿”為前綴的詞有“阿根廷”、“阿膠”和“阿拉伯”三個。“根”,“膠”和“拉”是“阿”的子節(jié)點,需要在數(shù)組中為這些子節(jié)點找到合適的存儲空間。根據(jù)表I得出“根”、“膠”和“拉”的編碼分別是4、5和6,首先從第一數(shù)組 base[]和第二數(shù)組check[]中向數(shù)組后方移動I個單位,得出存在連續(xù)的三個空位可以放入“根”,“膠”和“拉”三個子節(jié)點,即能滿足base[1+4] = check[1+4] = O ;base[1+5] = check[l+5] = 0 ;base[1+6] = check[l+6]=O0 因此設(shè)置 base[2] = I。設(shè)置check[5] = check[6] = check[7] = 2,表示5、6、7這三個位置對應(yīng)的節(jié)點的父節(jié)點是數(shù)組的第二個位置上對應(yīng)的結(jié)點,即“阿根”、“阿膠”、“阿拉”的父節(jié)點為“阿”。步驟S124 :如果字符在第一數(shù)組中對應(yīng)的值為負(fù)值,則表示向前查找空閑位置。例如,“阿拉伯”對應(yīng)的base[10] = _6。步驟S130 :根據(jù)序列碼、第一數(shù)組和第二數(shù)組在分詞詞典中進行分詞查詢。在本發(fā)明的一個實施例中,具體的查詢過程為s表示上一個狀態(tài)時字符在數(shù)組中的位置,c表示當(dāng)前狀態(tài)時字符的序列碼,t表示下一狀態(tài)轉(zhuǎn)移后字符在數(shù)組中的位置,查詢過程的偽代碼如下
權(quán)利要求
1.一種通過預(yù)計算優(yōu)化搜索引擎分詞的方法,其特征在于,包括以下步驟 按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼,其中,對所述Trie樹子節(jié)點的數(shù)目多的字符優(yōu)先進行編碼; 根據(jù)所述序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組;以及 根據(jù)所述序列碼、所述第一數(shù)組和所述第二數(shù)組在所述分詞詞典中進行分詞查詢。
2.如權(quán)利要求I所述的通過預(yù)計算優(yōu)化搜索引擎分詞的方法,其特征在于,還包括 將所述序列碼、所述第一數(shù)組和所述第二數(shù)組轉(zhuǎn)換為ニ進制文件,并生成相應(yīng)的簽名。
3.如權(quán)利要求2所述的通過預(yù)計算優(yōu)化搜索引擎分詞的方法,其特征在于,還包括 將所述序列碼、所述第一數(shù)組和所述第二數(shù)組進行尾部位置空間截斷。
4.如權(quán)利要求1-3任一項所述的通過預(yù)計算優(yōu)化搜索引擎分詞的方法,其特征在干,所述按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼進一歩包括 計算姆個字符的Trie樹子節(jié)點的數(shù)目; 根據(jù)所述Trie樹子節(jié)點的數(shù)目依次對所述字符的內(nèi)碼進行哈希計算以生成所述序列碼,井根據(jù)所述字符在所述分詞詞典中詞語中的位置確定所述字符的節(jié)點位置。
5.如權(quán)利要求4所述的通過預(yù)計算優(yōu)化搜索引擎分詞的方法,其特征在于,所述根據(jù)序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組進一歩包括 根據(jù)所述Trie樹子節(jié)點的數(shù)目依次將所述序列碼中的字符填入所述第一數(shù)組和所述第二數(shù)組。
6.如權(quán)利要求5所述的通過預(yù)計算優(yōu)化搜索引擎分詞的方法,其特征在于,其中, 如果所述字符所代表的詞屬于所述分詞詞典,則所述字符在所述第一數(shù)組中對應(yīng)的值為O,或者所述字符在所述第二數(shù)組中對應(yīng)的值為負(fù)值; 如果所述字符為中間節(jié)點,則所述字符在所述第一數(shù)組中對應(yīng)的值非O。
7.如權(quán)利要求1-6任一項所述的通過預(yù)計算優(yōu)化搜索引擎分詞的方法,其特征在干,其中, 如果所述字符在所述第一數(shù)組中對應(yīng)的值為負(fù)值,則表示向前查找空閑位置。
8.ー種搜索引擎分詞裝置,其特征在于,包括 序列碼生成模塊,用于按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼,其中,對所述Trie樹子節(jié)點的數(shù)目多的字符優(yōu)先進行編碼; 數(shù)組生成模塊,用于根據(jù)所述序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組;以及 分詞查詢模塊,用于根據(jù)所述序列碼、所述第一數(shù)組和所述第二數(shù)組在所述分詞詞典中進行分詞查詢。
9.如權(quán)利要求8所述的搜索引擎分詞裝置,其特征在于,還包括 轉(zhuǎn)換模塊,用于將所述序列碼、所述第一數(shù)組和所述第二數(shù)組轉(zhuǎn)換為ニ進制文件,井生成相應(yīng)的簽名。
10.如權(quán)利要求9所述的搜索引擎分詞裝置,其特征在于,所述轉(zhuǎn)換模塊還用于將所述序列碼、所述第一數(shù)組和所述第二數(shù)組進行尾部位置空間截斷。
11.如權(quán)利要求8-10任ー項所述的搜索引擎分詞裝置,其特征在于,所述序列碼生成模塊進一歩包括計算子模塊,用于計算每個字符的Trie樹子節(jié)點的數(shù)目;以及生成子模塊,用于根據(jù)所述Trie樹子節(jié)點的數(shù)目依次對所述字符的內(nèi)碼進行哈希計算以生成所述序列碼,井根據(jù)所述字符在所述分詞詞典中詞語中的位置確定所述字符的節(jié)點位置。
12.如權(quán)利要求11所述的搜索引擎分詞裝置,其特征在于,所述數(shù)組生成模塊根據(jù)所述Trie樹子節(jié)點的數(shù)目依次將所述序列碼中的字符填入所述第一數(shù)組和所述第二數(shù)組。
13.如權(quán)利要求12所述的搜索引擎分詞裝置,其特征在于,其中, 如果所述字符所代表的詞屬于所述分詞詞典,則所述字符在所述第一數(shù)組中對應(yīng)的值為O,或者所述字符在所述第二數(shù)組中對應(yīng)的值為負(fù)值; 如果所述字符為中間節(jié)點,則所述字符在所述第一數(shù)組中對應(yīng)的值非O。
14.如權(quán)利要求13所述的搜索引擎分詞裝置,其特征在于,其中, 如果所述字符在所述第一數(shù)組中對應(yīng)的值為負(fù)值,則表示向前查找空閑位置。
全文摘要
本發(fā)明提出一種通過預(yù)計算優(yōu)化搜索引擎分詞的方法,包括以下步驟按照Trie樹子節(jié)點的數(shù)目對分詞詞典中字符進行編碼以生成序列碼,其中,對所述Trie樹子節(jié)點的數(shù)目多的字符優(yōu)先進行編碼;根據(jù)所述序列碼進行預(yù)計算以生成雙數(shù)組Trie樹的第一數(shù)組和第二數(shù)組;根據(jù)所述序列碼、所述第一數(shù)組和所述第二數(shù)組在所述分詞詞典中進行分詞查詢。本發(fā)明提高了搜索引擎分詞的空間利用率,加快了分詞模塊的載入速度,增強了線上服務(wù)的穩(wěn)定性。本發(fā)明還公開了一種搜索引擎分詞裝置。
文檔編號G06F17/30GK102651026SQ20121009655
公開日2012年8月29日 申請日期2012年4月1日 優(yōu)先權(quán)日2012年4月1日
發(fā)明者張敏, 阮星華 申請人:百度在線網(wǎng)絡(luò)技術(shù)(北京)有限公司