專利名稱:一種快速分詞的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)自然語言處理領(lǐng)域,尤其涉及一種快速分詞的實(shí)現(xiàn)方法。
技術(shù)背景-
自然語言處理(Natural Language Processing簡稱NLP)是計(jì)算機(jī)人工智能和 語言學(xué)領(lǐng)域的交叉學(xué)科。此領(lǐng)域中探討如何處理及運(yùn)用自然語言,實(shí)現(xiàn)人與計(jì)算 機(jī)之間用自然語言進(jìn)行有效信息交換。自然語言理解系統(tǒng)把自然語言轉(zhuǎn)化為計(jì)算 機(jī)程序更易于處理的形式。搜索引擎發(fā)展成為互聯(lián)網(wǎng)的基礎(chǔ)應(yīng)用,使得人們能夠 方便的進(jìn)行信息的檢索,在這個(gè)過程中自然語言處理技術(shù)得到了很大的推進(jìn)。
英文是以單詞為單位的,句中的單詞靠空格隔開,而中文等語言是以字為單 位,句子中所有的字連起來才能描述一個(gè)意思。例如,英文句子Helike叩ple, 用中文則為"他喜歡蘋果"。計(jì)算機(jī)可通過空格分隔符知道like是一個(gè)單詞,但 要明白"喜"、"歡"兩個(gè)字合起來才表示一個(gè)詞則需要進(jìn)行更多的處理和運(yùn)算。把 文字序列切分成有意義的單獨(dú)的詞,就是分詞,有時(shí)也稱為切詞。他喜歡蘋果, 分詞的結(jié)果是他喜歡蘋果。在對(duì)中文等語言的自然語言處理過程中,需要自 動(dòng)對(duì)中文文本進(jìn)行詞語的切分,即像英文那樣使得中文句子由字的序列轉(zhuǎn)換為詞 的序列。中文自動(dòng)分詞被認(rèn)為是中文自然語言處理中的一個(gè)最基本的環(huán)節(jié)。分詞 的性能將直接影響自然與語言處理系統(tǒng)的整體性能。
計(jì)算機(jī)中央處理器(CPU)的計(jì)算能力正在不斷的增強(qiáng),存儲(chǔ)器的容量和性價(jià) 比也在不斷的提升,與此同時(shí)待處理數(shù)據(jù)也在不斷的增加,從2006年到2010 年,全球數(shù)字信息量將增長6倍,不斷高速增長的自然語言文本數(shù)據(jù),客觀上需 要高性能的分詞方法以應(yīng)對(duì)海量文本數(shù)據(jù)的處理。
自動(dòng)分詞的過程是將連續(xù)文本進(jìn)行正向和反向潛在詞語切割,羅列出所有潛 在的詞語組合。在需要最優(yōu)切割路徑的應(yīng)用中,可先前切出的潛在的詞語組合中借助最長匹配、最短路徑、概率統(tǒng)計(jì)等評(píng)估方法,計(jì)算出最優(yōu)的切割路徑。因此 進(jìn)行正向和反向潛在詞語切割的速度直接決定了分詞系統(tǒng)的性能。
發(fā)明內(nèi)容
針對(duì)高性能、海量自然語言文本處理的需求,本發(fā)明的目的是提供快速分詞 系統(tǒng)的實(shí)現(xiàn)方法。
本發(fā)明是這樣實(shí)現(xiàn)的 一種快速分詞的實(shí)現(xiàn)方法,包括以下主要過程和步驟 基于詞條査找樹的快速分詞方法,詞條查找樹由一級(jí)索引表和HASH多叉 樹構(gòu)成。 一級(jí)索引表是數(shù)組,通過下標(biāo)直接訪問,可快速縮小搜索范圍,時(shí)間復(fù) 雜度為常數(shù)。HASH多叉樹是基于HASH的多叉樹,即每個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)列表 通過HASH散列,査找的時(shí)候平均時(shí)間復(fù)雜度為常數(shù)。通過詞條添加操作構(gòu)建 詞條査找樹,利用詞條査找樹進(jìn)行快速分詞。
所述HASH多叉樹
HASH多叉樹和一級(jí)索引表相連,以進(jìn)一步加快詞條查找樹的搜索速度。
HASH多叉樹中的節(jié)點(diǎn)為字符節(jié)點(diǎn),字符節(jié)點(diǎn)至少包含字符值,詞條結(jié)束 標(biāo)志,子節(jié)點(diǎn)數(shù),子節(jié)點(diǎn)列表,在上級(jí)節(jié)點(diǎn)中的HASH沖突的下一個(gè)兄弟節(jié)等 信息。子節(jié)點(diǎn)列表是通過HASH散列的列表。
HASH桶的大小由子節(jié)點(diǎn)數(shù)確定,并在增加子節(jié)點(diǎn)時(shí)自動(dòng)擴(kuò)展,并根據(jù)新 HASH桶大小重新構(gòu)造節(jié)點(diǎn)。動(dòng)態(tài)增長的HASH桶可以減少HASH沖突,同時(shí) 保證匹配效率和資源利用率。通過子節(jié)點(diǎn)數(shù)獲得最佳HASH桶的大小,可事先 好的值的對(duì)應(yīng)表,以加快計(jì)算速度。
根據(jù)HASH值獲得HASH位置的操作,用與操作替換取模操作可以加快運(yùn) 算速度,即HASH值和一個(gè)特定值進(jìn)行與運(yùn)算來獲得HASH索引,該特定值和 HASH桶大小相關(guān),可以取小于HASH桶大小且BIT位連續(xù)為1的最大值,可 事先好的值的對(duì)應(yīng)表,以加快計(jì)算速度。
所述一級(jí)索引表-前導(dǎo)字符是首先取出并處理的字符,可快速縮小搜索范圍。前導(dǎo)字符和一級(jí) 索引表密切相關(guān),前導(dǎo)字符的數(shù)目等于一級(jí)索引表的維數(shù)。前導(dǎo)字符至少可以為 l個(gè),對(duì)應(yīng)的快速索引表的記錄數(shù)為256 (1X256)。如果最小詞條字節(jié)數(shù)均不小 于2則前導(dǎo)字符可以為2個(gè),對(duì)應(yīng)的快速索引表的記錄數(shù)為65536 (256X256)。 256是字符值的個(gè)數(shù)(0-255)。
添加詞條操作
步驟l.從被添加詞條中取出前導(dǎo)字符,在一級(jí)索引表中進(jìn)行匹配。若記錄不 存在,為前導(dǎo)字符構(gòu)造字符節(jié)點(diǎn),并將該節(jié)點(diǎn)加入到一級(jí)索引表中,并記錄為當(dāng) 前節(jié)點(diǎn);若記錄存在,則直接記為當(dāng)前節(jié)點(diǎn)。
步驟2.取出被添加詞條的下一個(gè)字符,在當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行匹 配。如果不存在,則為該字符構(gòu)造一個(gè)字符節(jié)點(diǎn),并添加到當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列 表中,并記錄新添加節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn);如果存在則直接設(shè)置為當(dāng)前節(jié)點(diǎn)。重復(fù)步 驟2的過程,直到被添加詞條所有字符被加入。
步驟3.在最末節(jié)點(diǎn)上設(shè)置詞條結(jié)束標(biāo)志。
進(jìn)一步的說,所述詞條添加操作
添加字符節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表的過程,是添加元素到HASH多叉 樹的過程。通過該字符的值作為HASH值,計(jì)算其在HASH桶中的索引位置, 該索引位置己有節(jié)點(diǎn)以鏈表的形式組織。將該節(jié)點(diǎn)作為首節(jié)點(diǎn)加入到該鏈表中, 并記錄在HASH桶的對(duì)應(yīng)索引位置。
若添加過程中需要擴(kuò)展當(dāng)前節(jié)點(diǎn),則申請(qǐng)一塊新空間,并構(gòu)造新的當(dāng)前節(jié)點(diǎn), 并將舊節(jié)點(diǎn)進(jìn)行回收。判斷是否需要擴(kuò)展的依據(jù)是HASH桶大小是否無法容下 新的子節(jié)點(diǎn)數(shù)。
分詞操作
步驟l.取出輸入文本的前導(dǎo)字符,在一級(jí)索引表中進(jìn)行匹配,若存在則取出 匹配字符節(jié)點(diǎn),并設(shè)置為當(dāng)前節(jié)點(diǎn),檢測當(dāng)前節(jié)點(diǎn)是否有詞條結(jié)束標(biāo)志,如果有 詞條結(jié)束標(biāo)志則輸出一個(gè)匹配詞條。步驟2.取出輸入文本的下一個(gè)字符,在當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行匹配, 若存在則取出存在匹配字符節(jié)點(diǎn),并設(shè)置為當(dāng)前節(jié)點(diǎn),檢測當(dāng)前節(jié)點(diǎn)是否有詞條 結(jié)束標(biāo)志,如果有詞條結(jié)束標(biāo)志則輸出一個(gè)匹配詞條。重復(fù)步驟2進(jìn)行后續(xù)字符 匹配,直到輸入文本匹配完畢或者無法匹配后續(xù)字符,輸出所有帶有詞條結(jié)束標(biāo) 志的節(jié)點(diǎn)對(duì)應(yīng)的詞條組合。
進(jìn)一步說,所述添加詞條操作、所述分詞操作'
前向匹配和后向匹配的操作分別需要建立對(duì)應(yīng)的一級(jí)索引表和HASH多叉 樹。進(jìn)行添加詞條操作、分詞操作時(shí),若是前向匹配則從前往后逐一提取輸入字 符,若是后向匹配則從后往前逐一提取字符,進(jìn)行同樣的算法匹配。 進(jìn)一步的說,如果匹配操作不區(qū)分英文字母大小寫,則將字符統(tǒng)一到大寫或者小 寫即可。
系統(tǒng)啟動(dòng)初始化操作
詞條存儲(chǔ)在持久存儲(chǔ)介質(zhì)中,可以以文件或者數(shù)據(jù)庫表的形式進(jìn)行組織,每 個(gè)詞條對(duì)應(yīng)持久文件的存儲(chǔ)記錄。存儲(chǔ)記錄可包含詞條文本,和應(yīng)用所需的詞性 等附加信息。系統(tǒng)從詞條存儲(chǔ)模塊讀取所有詞條,將讀出詞條逐一送入詞條添加 模塊,添加模塊執(zhí)行詞條添加操作,將詞條加入到詞條査找樹中。
下面結(jié)合附圖,對(duì)本發(fā)明作出詳細(xì)描述。
圖1為添加BE詞條后的詞條查找樹結(jié)構(gòu)圖 圖2為添加BT詞條后的詞條査找樹結(jié)構(gòu)圖 圖3為添加BUT詞條后的詞條查找樹結(jié)構(gòu)圖 圖4為添加所有示例詞條后的詞條查找樹結(jié)構(gòu)圖
具體實(shí)施例方式
本發(fā)明是通過將詞條添加到詞條査找樹中,實(shí)現(xiàn)快速的詞條添加、分詞操作。本發(fā)明構(gòu)造的詞條查找樹如圖4所示,一級(jí)索引表作為檢索的入口,和HASH 多叉樹相連。
本實(shí)施案例中取前導(dǎo)字符數(shù)為1,對(duì)應(yīng)的一級(jí)索引表為256條記錄;字符節(jié) 點(diǎn)的子節(jié)點(diǎn)列表每次按照2的整次方大小進(jìn)行申請(qǐng)。
重點(diǎn)闡述由本發(fā)明方法實(shí)現(xiàn)的系統(tǒng)最主要的兩大功能,詞條添加,基于詞條 匹配的分詞的實(shí)現(xiàn)過程。
"詞條添加"
以從空置系統(tǒng)中依次添加BE, BT, BUT, BUSH, BUSY, BOX, BOY等
詞條為例進(jìn)行說明。 添加詞條BE
步驟l.取出詞條的前導(dǎo)字符B,在一級(jí)索引表中進(jìn)行直接下標(biāo)檢索,不存在, 申請(qǐng)一塊新空間用于構(gòu)建B字符節(jié)點(diǎn),并將該節(jié)點(diǎn)添加到一級(jí)索引表中,并記 錄為當(dāng)前節(jié)點(diǎn)。
步驟2.取出下一個(gè)字符E,在當(dāng)前B字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索(此時(shí)HASH桶為空)。不存在,申請(qǐng)一塊新空間用于構(gòu)建E字符節(jié)點(diǎn),當(dāng) 前字符B節(jié)點(diǎn)的HASH桶大小為O,擴(kuò)展當(dāng)前字符B節(jié)點(diǎn)到可以存下2個(gè)(始 終保持2的N次方大小),擴(kuò)展過程為先申請(qǐng)新空間,將老節(jié)點(diǎn)中的子節(jié)點(diǎn)列表 在新塊中重新構(gòu)造,回收老的字符節(jié)點(diǎn)。將該E字符節(jié)點(diǎn)加入到當(dāng)前B字符節(jié) 點(diǎn)的子節(jié)點(diǎn)列表,設(shè)置當(dāng)前節(jié)點(diǎn)為E字符節(jié)點(diǎn)。 -
步驟3.詞條結(jié)束,將當(dāng)前E字符節(jié)點(diǎn)的完整詞條標(biāo)志設(shè)置為真,如圖l所 示。 -
添加詞條BT
步驟l.取出詞條的前導(dǎo)字符B,在一級(jí)索引表中進(jìn)行直接下標(biāo)檢索,已存在, 將該B字符節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)。
步驟2.取出下一個(gè)字符T,在當(dāng)前B字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索。HASH檢索的方法是,將E字符的值84作為HASH值,當(dāng)前HASH桶大 小為2,對(duì)應(yīng)的HASH索引位置為O,檢測該位置記錄的鏈表中是否有字符為E的節(jié)點(diǎn)。記錄不存在,申請(qǐng)一塊新空間用于構(gòu)建T字符節(jié)點(diǎn),并將該T字符節(jié) 點(diǎn)加入到當(dāng)前B字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表,設(shè)置為T字符節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn)。
步驟3.詞條結(jié)束,將當(dāng)前T字符節(jié)點(diǎn)的完整詞條標(biāo)志設(shè)置為真,如圖2所示。
添加詞條BUT
步驟l.取出詞條的前導(dǎo)字符B,在一級(jí)索引表中進(jìn)行直接下標(biāo)檢索,已存在, 將該B字符節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)。
步驟2.取出下一個(gè)字符U,在當(dāng)前B字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索,不存在,當(dāng)前字符B節(jié)點(diǎn)的HASH桶大小為2,需要存第3個(gè)子節(jié)點(diǎn), 擴(kuò)展當(dāng)前字符B節(jié)點(diǎn)到最大可以存下4個(gè)子節(jié)點(diǎn)的大小,然后申請(qǐng)一塊新空間 用于構(gòu)建U字符節(jié)點(diǎn),回收老的字符節(jié)點(diǎn),并將該U字符節(jié)點(diǎn)加入到當(dāng)前B字 符節(jié)點(diǎn)的子節(jié)點(diǎn)列表,設(shè)置U字符節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn)。
步驟3.取出下一個(gè)字符T,在當(dāng)前U字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索,不存在,當(dāng)前字符U節(jié)點(diǎn)的HASH桶大小為O,擴(kuò)展當(dāng)前字符U節(jié)點(diǎn)到 可以存下2個(gè)子節(jié)點(diǎn)的大小,申請(qǐng)一塊新空間用于構(gòu)建T字符節(jié)點(diǎn),回收老的 字符節(jié)點(diǎn),并將該T字符節(jié)點(diǎn)加入到當(dāng)前U字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表,設(shè)置T字 符節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn)。
步驟4.詞條結(jié)束,將當(dāng)前T字符節(jié)點(diǎn)的完整詞條標(biāo)志設(shè)置為真,如圖3所示。
按照上述添加BT,BE,BUT過程依次繼續(xù)添加BUSH, BUSY, BOX, BOY 等詞條,最后形成如圖4所示的詞條査找樹的結(jié)構(gòu)。
分詞
輸入字符串BOXBEBUSY進(jìn)行分詞,在基于如圖4所示的詞條査找樹中進(jìn) 行分詞。
步驟l.將字符串BOXBEBUSY進(jìn)行分詞,取出1個(gè)前導(dǎo)字符B,在一級(jí)索 引表中査找到B字符節(jié)點(diǎn),檢測未發(fā)現(xiàn)詞條結(jié)束標(biāo)志,將其記錄為當(dāng)前節(jié)點(diǎn); 步驟2.取出下一字符O,在當(dāng)前B字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH檢索,找到o字符節(jié)點(diǎn),檢測未發(fā)現(xiàn)詞條結(jié)束標(biāo)志,將o字符節(jié)點(diǎn)記錄為當(dāng)前節(jié) 占.
J "、 9
步驟3.取出下一個(gè)字符X,在當(dāng)前O字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索,找到X字符節(jié)點(diǎn),檢測發(fā)現(xiàn)詞條結(jié)束標(biāo)志,記錄匹配詞條BOX到結(jié)果集 中,將X字符節(jié)點(diǎn)記錄為當(dāng)前節(jié)點(diǎn);
步驟4.取出下一字符節(jié)點(diǎn)B,在當(dāng)前X字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索,未找到B字符節(jié)點(diǎn),結(jié)束匹配操作。記錄詞條BOX。
步驟5.將去掉BOX部分的剩余BEBUSY字符送入分詞,基于如圖4所示的 詞條査找樹中進(jìn)行分詞,取出1個(gè)前導(dǎo)字符B,在一級(jí)索引表中査找到B字符節(jié) 點(diǎn),檢測未發(fā)現(xiàn)詞條結(jié)束標(biāo)志,將其記錄為當(dāng)前節(jié)點(diǎn);
步驟6.取出下一字符E,在當(dāng)前B字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH檢 索,找到E字符節(jié)點(diǎn),檢測發(fā)現(xiàn)詞條結(jié)束標(biāo)志,記錄匹配詞條BE到結(jié)果集中, 將E字符節(jié)點(diǎn)記錄為當(dāng)前節(jié)點(diǎn);
步驟7.取出下一個(gè)字符B,在當(dāng)前E字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索,未找到B字符節(jié)點(diǎn),未找到B字符節(jié)點(diǎn),結(jié)束匹配操作。記錄詞條BE。
步驟8.將去掉BE部分的剩余BUSY字符串送入詞條分詞,基于如圖4所示 的詞條查找樹中進(jìn)行分詞,取出1個(gè)前導(dǎo)字符B,在一級(jí)索引表中査找到B字符 節(jié)點(diǎn),檢測未發(fā)現(xiàn)詞條結(jié)束標(biāo)志,將其記錄為當(dāng)前節(jié)點(diǎn);
步驟9.取出下一字符U,在當(dāng)前B字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH檢 索,找到U字符節(jié)點(diǎn),檢測未發(fā)現(xiàn)詞條結(jié)束標(biāo)志,將U字符節(jié)點(diǎn)記錄為當(dāng)前節(jié) 點(diǎn);
步驟IO.取出下一個(gè)字符S,在當(dāng)前U字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索,找到S字符節(jié)點(diǎn),檢測未發(fā)現(xiàn)詞條結(jié)束標(biāo)志,將S字符節(jié)點(diǎn)記錄為當(dāng)前 節(jié)點(diǎn);
步驟ll.取出下一個(gè)字符Y,在當(dāng)前S字符節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行HASH 檢索,找到Y(jié)字符節(jié)點(diǎn),檢測發(fā)現(xiàn)詞條結(jié)束標(biāo)志,記錄匹配詞條BUSY到結(jié)果 集中;無剩余字符,結(jié)束匹配操作。記錄詞條BUSY。
分詞結(jié)果為"BOX""BE" "BUSY"。
權(quán)利要求
1.本發(fā)明是這樣實(shí)現(xiàn)的一種快速分詞的實(shí)現(xiàn)方法,其特征在于,該方法包括以下步驟基于詞條查找樹的快速分詞方法,詞條查找樹由一級(jí)索引表和HASH多叉樹構(gòu)成。一級(jí)索引表是數(shù)組,通過下標(biāo)直接訪問,可快速縮小搜索范圍,時(shí)間復(fù)雜度為常數(shù)。HASH多叉樹是基于HASH的多叉樹,即每個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)列表通過HASH散列,查找的時(shí)候平均時(shí)間復(fù)雜度為常數(shù)。通過詞條添加操作構(gòu)建詞條查找樹,利用詞條查找樹進(jìn)行快速分詞。
2. 如權(quán)利要求1所述HASH多叉樹其特征在于HASH多叉樹和一級(jí)索引表相連,以進(jìn)一步加快詞條査找樹的搜索速度。HASH多叉樹中的節(jié)點(diǎn)為字符節(jié)點(diǎn),字符節(jié)點(diǎn)至少包含字符值,詞條結(jié)束 標(biāo)志,子節(jié)點(diǎn)數(shù),子節(jié)點(diǎn)列表,HASH沖突的下一個(gè)兄弟節(jié)點(diǎn)等信息。子節(jié)點(diǎn)列 表是通過HASH散列的列表。HASH桶的大小由子節(jié)點(diǎn)數(shù)確定,并在增加子節(jié)點(diǎn)時(shí)自動(dòng)擴(kuò)展,并根據(jù)新 HASH桶大小重新構(gòu)造節(jié)點(diǎn)。動(dòng)態(tài)增長的HASH桶可以減少HASH沖突,同時(shí)保 證匹配效率和資源利用率。通過子節(jié)點(diǎn)數(shù)獲得最佳HASH桶的大小,可事先構(gòu)造 對(duì)應(yīng)表,以加快計(jì)算速度。根據(jù)HASH值獲得HASH位置的操作,用與操作替換取模操作可以加快運(yùn)算 速度,即HASH值和一個(gè)特定值進(jìn)行與運(yùn)算來獲得HASH索引,該特定值和HASH 桶大小相關(guān),可以取小于HASH桶大小且BIT位連續(xù)為1的最大值,可事先構(gòu)造 好對(duì)應(yīng)表,以加快計(jì)算速度。HASH沖突的節(jié)點(diǎn)相連,以鏈表的形式組織,并將 首節(jié)點(diǎn)記錄在對(duì)應(yīng)的HASH索引位置。添加字符節(jié)點(diǎn)到子節(jié)點(diǎn)列表中的過程。首先根據(jù)新的子節(jié)點(diǎn)數(shù)目計(jì)算是否需 要擴(kuò)展當(dāng)前節(jié)點(diǎn),如果需要擴(kuò)展則申請(qǐng)新的空間重新構(gòu)造新節(jié)點(diǎn),并回收舊節(jié)點(diǎn)。 將字符的值作為HASH值,根據(jù)HASH桶的大小獲得HASH索引位置,并加入到 該索引位置的鏈表中。
3. 如權(quán)利要求1所述一級(jí)索引表其特征在于前導(dǎo)字符是首先取出并處理的字符,可快速縮小搜索范圍。前導(dǎo)字符和一級(jí) 索引表密切相關(guān),前導(dǎo)字符的數(shù)目等于一級(jí)索引表的維數(shù)。前導(dǎo)字符至少可以為1 個(gè),對(duì)應(yīng)的一級(jí)索引表的記錄數(shù)為256 (1X256)。如果最小詞條字節(jié)數(shù)均不小于 2則前導(dǎo)字符可以為2個(gè),對(duì)應(yīng)的一級(jí)索引表的記錄數(shù)為65536 (256X256)。 256 是字符值的個(gè)數(shù)(0-255)。
4. 如權(quán)利要求1所述添加詞條操作其特征在于步驟l.從被添加詞條中取出前導(dǎo)字符,在一級(jí)索引表中進(jìn)行匹配。若記錄不 存在,為前導(dǎo)字符構(gòu)造字符節(jié)點(diǎn),并將該節(jié)點(diǎn)加入到一級(jí)索引表中,并記錄為當(dāng) 前節(jié)點(diǎn);若記錄存在,則直接記為當(dāng)前節(jié)點(diǎn)。步驟2.取出被添加詞條的下一個(gè)字符,在當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行匹配。 如果不存在,則為該字符構(gòu)造一個(gè)字符節(jié)點(diǎn),并添加到當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表中, 并記錄新添加節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn);如果存在則直接設(shè)置為當(dāng)前節(jié)點(diǎn)。重復(fù)歩驟2的 過程,直到被添加詞條所有字符被加入。步驟3.在最末節(jié)點(diǎn)上設(shè)置詞條結(jié)束標(biāo)志。
5. 如權(quán)利要求4所述詞條添加操作其特征在于添加字符節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表的過程,是添加元素到HASH多叉樹 的過程。通過該字符的值作為HASH值,計(jì)算其在HASH桶中的索引位置,該索 引位置已有節(jié)點(diǎn)以鏈表的形式組織。將該節(jié)點(diǎn)作為首節(jié)點(diǎn)加入到該鏈表中,并記 錄在HASH桶的對(duì)應(yīng)索引位置。若添加過程中需要擴(kuò)展當(dāng)前節(jié)點(diǎn),則申請(qǐng)一塊新空間,并構(gòu)造新的當(dāng)前節(jié)點(diǎn), 并將舊節(jié)點(diǎn)進(jìn)行回收。判斷是否需要擴(kuò)展的依據(jù)是HASH桶大小是否無法容下新 的子節(jié)點(diǎn)數(shù)。
6. 如權(quán)利要求1所述分詞操作其特征在于步驟l.取出輸入文本的前導(dǎo)字符,在一級(jí)索引表中進(jìn)行匹配,若存在則取出 匹配字符節(jié)點(diǎn),并設(shè)置為當(dāng)前節(jié)點(diǎn),檢測當(dāng)前節(jié)點(diǎn)是否有詞條結(jié)束標(biāo)志,如果有 詞條結(jié)束標(biāo)志則輸出一個(gè)匹配詞條。步驟2.取出輸入文本的下一個(gè)字符,在當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表中進(jìn)行匹配,若存在則取出存在匹配字符節(jié)點(diǎn),并設(shè)置為當(dāng)前節(jié)點(diǎn),檢測當(dāng)前節(jié)點(diǎn)是否有詞條結(jié)束標(biāo)志,如果有詞條結(jié)束標(biāo)志則輸出一個(gè)匹配詞條。重復(fù)步驟2進(jìn)行后續(xù)字符 匹配,直到輸入文本匹配完畢或者無法匹配后續(xù)字符,輸出所有帶有詞條結(jié)束標(biāo) 志的節(jié)點(diǎn)對(duì)應(yīng)的詞條組合。
7.如權(quán)利要求4所述添加詞條操作和權(quán)利要求6所述分詞操作其特征在于前向匹配和后向匹配的操作分別需要建立對(duì)應(yīng)的一級(jí)索引表和HASH多叉樹。進(jìn)行添加詞條操作、分詞操作時(shí),若是前向匹配則從前往后逐一提取輸入字符,若是后向匹配則從后往前逐一提取字符,進(jìn)行同樣的算法匹配。進(jìn)一步的說,如果匹配操作不區(qū)分英文字母大小寫,則將字符統(tǒng)一到大寫或者小寫即可。
全文摘要
本發(fā)明公開了一種基于詞條查找樹的快速分詞方法,詞條查找樹由一級(jí)索引表和HASH多叉樹構(gòu)成。一級(jí)索引表是數(shù)組,通過下標(biāo)直接訪問,可快速縮小搜索范圍,時(shí)間復(fù)雜度為常數(shù)。HASH多叉樹是基于HASH的多叉樹,即每個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)列表通過HASH散列,查找的時(shí)候平均時(shí)間復(fù)雜度為常數(shù)。通過本發(fā)明的詞條查找樹能利用相對(duì)較少的內(nèi)存資源,獲得近乎常數(shù)時(shí)間復(fù)雜度的分詞功能,可支持大型詞典,滿足海量文本信息的分析需求。
文檔編號(hào)G06F17/30GK101576877SQ20091010796
公開日2009年11月11日 申請(qǐng)日期2009年6月16日 優(yōu)先權(quán)日2009年6月16日
發(fā)明者程治永 申請(qǐng)人:程治永