專(zhuān)利名稱(chēng):一種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及信息檢索和自然語(yǔ)言處理技術(shù)領(lǐng)域,尤其涉及一種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法。
背景技術(shù):
在信息檢索和自然語(yǔ)言處理等領(lǐng)域的很多應(yīng)用中都涉及到詞典查找,詞典查找的速度很大程度上決定了系統(tǒng)的整體性能。例如,集成開(kāi)發(fā)環(huán)境(IDE)的保留詞識(shí)別、編輯器的拼寫(xiě)檢查、光學(xué)字符識(shí)別(OCR)的結(jié)果校驗(yàn)、文本處理的中文分詞、倒排索引的Post list定位等速度要求都非常高,都需要快速詞典查找。完美哈希函數(shù)能夠?qū)⒃~典的單詞快速映射到唯一的整數(shù),不存在沖突,因此是一種理想的詞典查找方法。
已經(jīng)有不少人提出了完美哈希函數(shù)的構(gòu)造策略,但是都不能很好地處理大規(guī)模的詞典,而且已有的大部分哈希函數(shù)都不能處理像漢語(yǔ)這樣的大字符集的詞典。
如Cichille提出了給單詞首尾兩字符關(guān)聯(lián)整數(shù),取單詞首尾兩字符所關(guān)聯(lián)整數(shù)和單詞長(zhǎng)度之和作為單詞的哈希值。Cichelli的方法只能處理不超過(guò)45個(gè)單詞的詞典。
Cercone提出了詞典劃分的方法,將詞典按照單詞長(zhǎng)度劃分為不同子詞典,對(duì)單詞所有字符均關(guān)聯(lián)整數(shù),再將各子哈希函數(shù)合并得到整個(gè)詞典的完美哈希函數(shù)。Cercone的方法可以對(duì)1000個(gè)以?xún)?nèi)單詞的詞典成功構(gòu)造完美哈希函數(shù)。
Gperf是Linux系統(tǒng)下著名的哈希函數(shù)構(gòu)造方法,但是其官方網(wǎng)站提供的最新版本Gperf也不能處理超過(guò)15000個(gè)單詞的詞典,尤其是對(duì)類(lèi)似中文的大字符集詞典時(shí)效果更差。另外,Gperf不能保證每次運(yùn)行都能找到詞典的完美哈希函數(shù),哈希函數(shù)的填充因子非常小,導(dǎo)致哈希函數(shù)表占用內(nèi)存非常多。
已有實(shí)驗(yàn)表明,對(duì)含有15000個(gè)詞語(yǔ)的中文詞典,使用Gperf構(gòu)造哈希函數(shù)構(gòu)造過(guò)程需要大概8個(gè)小時(shí),填充因子不到4%。
Sager提出minicycle算法來(lái)構(gòu)造完美哈希函數(shù),他通過(guò)對(duì)單詞所有字符關(guān)聯(lián)整數(shù),從而為每個(gè)單詞對(duì)應(yīng)一個(gè)三元組(h0,h1,h2),并試圖找到映射g(0…r)→(0…|K|-1),使得h(key)=h0+g(h1)+g(h2)是一個(gè)完美哈希函數(shù)。Sager提出的minicycle算法最多也只能處理包含512個(gè)單詞的詞典。
在Sager的工作基礎(chǔ)上,F(xiàn)ox改善了單詞三元組的生成方式,并提出使用相關(guān)圖來(lái)加速映射過(guò)程。Fox對(duì)每個(gè)字符在每個(gè)位置出現(xiàn)關(guān)聯(lián)三個(gè)隨機(jī)數(shù)s0、s1和s2,單詞對(duì)應(yīng)的三元組的h0、h1和h2分別由單詞各字母在相應(yīng)位置對(duì)應(yīng)的s0、s1和s2之和。得到每個(gè)單詞的h0、h1和h2之后,F(xiàn)ox以所有單詞的h1和h2為頂點(diǎn),將每個(gè)單詞對(duì)應(yīng)的h1和h2頂點(diǎn)之間連一條邊,構(gòu)成詞典的相關(guān)圖,在相關(guān)圖的基礎(chǔ)上Fox對(duì)每個(gè)頂點(diǎn)hi關(guān)聯(lián)一個(gè)整數(shù)g(hi),使得h(key)=h0+g(h1)+g(h2)是一個(gè)完美哈希函數(shù)。
Fox的方法最大的缺點(diǎn)在于需要大量的空間保存隨機(jī)數(shù)集合,同時(shí)該方法的相關(guān)圖頂點(diǎn)數(shù)為詞典單詞數(shù)量的0.6倍,這些都導(dǎo)致了Fox方法的工作空間(保存哈希函數(shù)需要的內(nèi)存)較大。另外隨機(jī)數(shù)策略不能保證對(duì)任何詞典均能構(gòu)造其完美哈希函數(shù)。
發(fā)明內(nèi)容
(一)要解決的技術(shù)問(wèn)題有鑒于此,本發(fā)明的主要目的在于提供一種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,以成功對(duì)包含上百萬(wàn)單詞的詞典構(gòu)造完美哈希函數(shù),處理中文等大字符集詞典,并提高填充因子,縮短構(gòu)造時(shí)間,減少哈希函數(shù)的工作空間。
(二)技術(shù)方案為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的一種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,該方法包括A、將待構(gòu)造哈希函數(shù)的詞典中的單詞平滑;B、將平滑后詞典按照單詞長(zhǎng)度分為n個(gè)子詞典,對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖,n為自然數(shù);C、對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序,對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,得到詞典的完美哈希函數(shù)。
所述步驟A包括采用兩個(gè)不同的平滑函數(shù),分別將每個(gè)單詞除首字符外的每個(gè)字符平滑為兩個(gè)字符。
對(duì)于單詞k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2為兩個(gè)平滑函數(shù),f1(ci)和f2(ci)表示由字符ci及其附近字符計(jì)算得到的平滑值。
所述平滑函數(shù)為自定義的函數(shù),或?yàn)楦鶕?jù)詞典大小和期望填充因子調(diào)整相關(guān)參數(shù)得到的函數(shù)。
對(duì)于英文詞典,所述平滑函數(shù)為f(ci)=a(ci-1)2+bci;對(duì)于中文詞典,所述平滑函數(shù)為f(ci)=aci-1+bci;其中a、b為參數(shù)。
步驟B中所述每個(gè)子詞典內(nèi)所有單詞長(zhǎng)度相同;步驟B中所述對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖包括對(duì)單詞長(zhǎng)度大于1的子詞典,以其所有單詞最后兩個(gè)字符為頂點(diǎn),兩個(gè)字符出現(xiàn)在同一個(gè)單詞的最后兩個(gè)位置,則在這兩個(gè)字符對(duì)應(yīng)的頂點(diǎn)間連一條邊,形成該子詞典的相關(guān)圖。
所述形成該子詞典的相關(guān)圖后進(jìn)一步包括將各子詞典相關(guān)圖的集合在一起,形成原詞典的多級(jí)相關(guān)圖。
步驟B中所述多級(jí)相關(guān)圖,其頂點(diǎn)集合為相應(yīng)子詞典平滑后單詞最后兩個(gè)字符的集合,其邊集為相應(yīng)子詞典所有單詞的集合。
步驟C中所述對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序按照類(lèi)似Prim算法的方式進(jìn)行,具體包括對(duì)各級(jí)相關(guān)圖頂點(diǎn)按照類(lèi)似Prim算法排序,將度最高的頂點(diǎn)v1排第一,與v1相鄰的度最高的頂點(diǎn)v2排第二,與v1或v2相鄰的度最高的頂點(diǎn)v3排第三,……,直到該級(jí)相關(guān)圖所有頂點(diǎn)都已經(jīng)排序。
步驟C中所述對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,得到詞典的完美哈希函數(shù)包括對(duì)各級(jí)相關(guān)圖的每個(gè)頂點(diǎn)依次關(guān)聯(lián)一個(gè)合適的整數(shù),將與當(dāng)前頂點(diǎn)相鄰的所有單詞映射到哈希表空閑地址,即對(duì)于單詞k=c1c2…cn,平滑后單詞形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),對(duì)k`各字符關(guān)聯(lián)整數(shù),使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn))為完美哈希函數(shù),其中g(shù)(f1(ci))和g(f2(ci))分別表示對(duì)頂點(diǎn)f1(ci)和f2(ci)關(guān)聯(lián)的整數(shù)。
(三)有益效果從上述技術(shù)方案可以看出,本發(fā)明具有以下有益效果1、利用本發(fā)明,通過(guò)將待構(gòu)造哈希函數(shù)的詞典中的單詞平滑,將平滑后詞典按照單詞長(zhǎng)度分為n個(gè)子詞典(n為自然數(shù)),對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖,然后對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序,對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,進(jìn)而能夠?qū)Π习偃f(wàn)單詞的詞典成功構(gòu)造完美哈希函數(shù),并且能夠處理中文等大字符集詞典,填充因子接近1,提高了填充因子,縮短了構(gòu)造時(shí)間,減少了哈希函數(shù)的工作空間。
2、本發(fā)明提供的這種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,可以對(duì)任意大小的詞典成功構(gòu)造完美哈希函數(shù),尤其是對(duì)如漢語(yǔ)這樣的大字符集上的詞典,效果更好。
3、本發(fā)明提供的這種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,可以通過(guò)調(diào)整工作空間大小來(lái)調(diào)節(jié)填充因子,當(dāng)需要更高的填充因子時(shí)只需要更改平滑函數(shù),增加相關(guān)圖頂點(diǎn)數(shù)量即可。
4、本發(fā)明提供的這種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,將原始詞典劃分為若干個(gè)子詞典,對(duì)每個(gè)子詞典獨(dú)立構(gòu)造相關(guān)圖,因此本發(fā)明提供的哈希函數(shù)構(gòu)造方法比Fox等已有方法速度更快。對(duì)從北大人民日?qǐng)?bào)語(yǔ)料庫(kù)上抽取的12萬(wàn)中文詞語(yǔ)構(gòu)成的詞典,用本發(fā)明提供的完美哈希函數(shù)構(gòu)造方法構(gòu)造過(guò)程僅需4.14秒,工作空間僅為60867個(gè)整數(shù),將12萬(wàn)詞語(yǔ)映射到13萬(wàn)1千個(gè)哈希地址空間。
圖1為本發(fā)明提供的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法流程圖;圖2為依照本發(fā)明實(shí)施例對(duì)子詞典構(gòu)造的相關(guān)圖;其中,圖2(a)是對(duì)子詞典K1構(gòu)造的相關(guān)圖;圖2(b)是對(duì)子詞典K2構(gòu)造的相關(guān)圖;圖3為依照本發(fā)明實(shí)施例各級(jí)相關(guān)圖的頂點(diǎn)排序與關(guān)聯(lián)整數(shù)過(guò)程示意圖。
具體實(shí)施例方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,以下結(jié)合具體實(shí)施例,并參照附圖,對(duì)本發(fā)明進(jìn)一步詳細(xì)說(shuō)明。
本發(fā)明的實(shí)現(xiàn)原理如下本發(fā)明提供的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,將哈希函數(shù)的構(gòu)造過(guò)程分為字符平滑階段、多級(jí)相關(guān)圖構(gòu)造階段、頂點(diǎn)賦值階段。
在字符平滑階段,將單詞除首字符外的其它每個(gè)字符都用兩個(gè)不同的平滑函數(shù)將其平滑為兩個(gè)字符,對(duì)于單詞k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2為兩個(gè)平滑函數(shù)。
在多級(jí)相關(guān)圖構(gòu)造階段,對(duì)平滑后的詞典,按照單詞長(zhǎng)度分為若干子詞典,各子詞典內(nèi)所有單詞長(zhǎng)度相同。對(duì)每個(gè)子詞典,以其所有單詞最后兩個(gè)字符為頂點(diǎn),兩個(gè)字符出現(xiàn)在同一個(gè)單詞的最后兩個(gè)位置,則在這兩個(gè)字符對(duì)應(yīng)的頂點(diǎn)間連一條邊,形成該子詞典的相關(guān)圖。各子詞典相關(guān)圖的集合形成原詞典的多級(jí)相關(guān)圖。
在頂點(diǎn)賦值階段,對(duì)各級(jí)相關(guān)圖的每個(gè)頂點(diǎn)依次關(guān)聯(lián)一個(gè)合適的整數(shù),將與當(dāng)前頂點(diǎn)相鄰的所有單詞映射到哈希表空閑地址,即對(duì)于單詞k=c1c2…cn,平滑后單詞形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),對(duì)k`各字符關(guān)聯(lián)的整數(shù)使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn)),其中g(shù)(f1(ci))和g(f2(ci))分別表示對(duì)頂點(diǎn)f1(ci)和f2(ci)關(guān)聯(lián)的整數(shù)。
如圖1所示,圖1為本發(fā)明提供的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法流程圖,該方法包括以下步驟步驟101將待構(gòu)造哈希函數(shù)的詞典中的單詞平滑;步驟102將平滑后詞典按照單詞長(zhǎng)度分為n個(gè)子詞典,對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖,n為自然數(shù);步驟103對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序,對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,得到詞典的完美哈希函數(shù)。
上述步驟101包括采用兩個(gè)不同的平滑函數(shù),分別將每個(gè)單詞除首字符外的每個(gè)字符平滑為兩個(gè)字符。
對(duì)于單詞k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2為兩個(gè)平滑函數(shù),f1(ci)和f2(ci)表示由字符ci及其附近字符計(jì)算得到的平滑值。
上述平滑函數(shù)為自定義的函數(shù),或?yàn)楦鶕?jù)詞典大小和期望填充因子調(diào)整相關(guān)參數(shù)得到的函數(shù)。
對(duì)于英文詞典,所述平滑函數(shù)為f(ci)=a(ci-1)2+bci;對(duì)于中文詞典,所述平滑函數(shù)為f(ci)=aci-1+bci;其中a、b為參數(shù)。
上述步驟102中所述每個(gè)子詞典內(nèi)所有單詞長(zhǎng)度相同。上述步驟102中所述對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖包括對(duì)單詞長(zhǎng)度大于1的子詞典,以其所有單詞最后兩個(gè)字符為頂點(diǎn),兩個(gè)字符出現(xiàn)在同一個(gè)單詞的最后兩個(gè)位置,則在這兩個(gè)字符對(duì)應(yīng)的頂點(diǎn)間連一條邊,形成該子詞典的相關(guān)圖。
所述形成該子詞典的相關(guān)圖后進(jìn)一步包括將各子詞典相關(guān)圖的集合在一起,形成原詞典的多級(jí)相關(guān)圖。
上述步驟102中所述多級(jí)相關(guān)圖,其每級(jí)相關(guān)圖頂點(diǎn)集合為相應(yīng)子詞典平滑后單詞最后兩個(gè)字符的集合,其邊集為相應(yīng)子詞典所有單詞的集合。
上述步驟103中所述對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序按照類(lèi)似Prim算法的方式進(jìn)行,具體包括對(duì)各級(jí)相關(guān)圖頂點(diǎn)按照類(lèi)似Prim算法排序,將度最高的頂點(diǎn)v1排第一,與v1相鄰的度最高的頂點(diǎn)v2排第二,與v1或v2相鄰的度最高的頂點(diǎn)v3排第三,……,直到該級(jí)相關(guān)圖所有頂點(diǎn)都已經(jīng)排序。
上述步驟103中所述對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,得到詞典的完美哈希函數(shù)包括對(duì)各級(jí)相關(guān)圖的每個(gè)頂點(diǎn)依次關(guān)聯(lián)一個(gè)合適的整數(shù),將與當(dāng)前頂點(diǎn)相鄰的所有單詞映射到哈希表空閑地址,即對(duì)于單詞k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),對(duì)k′各字符對(duì)應(yīng)頂點(diǎn)關(guān)聯(lián)的整數(shù)使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn))為完美哈希函數(shù),其中g(shù)(f1(ci))和g(f2(ci))分別表示對(duì)頂點(diǎn)f1(ci)和f2(ci)關(guān)聯(lián)的整數(shù)。
基于圖1所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法流程圖,以下結(jié)合具體的實(shí)施例對(duì)本發(fā)明構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法進(jìn)一步詳細(xì)說(shuō)明。
實(shí)施例在本實(shí)施例中,構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法也分為三個(gè)階段字符平滑階段、多級(jí)相關(guān)圖構(gòu)造階段和頂點(diǎn)賦值階段,下面分別詳細(xì)介紹如下1.字符平滑階段在相關(guān)圖中,頂點(diǎn)的度越高,為該頂點(diǎn)關(guān)聯(lián)一個(gè)整數(shù)越困難,哈希函數(shù)的填充因子可能越小。因此,本發(fā)明在構(gòu)造多級(jí)相關(guān)圖之前先對(duì)詞典所有單詞做平滑處理,使得構(gòu)造的每一級(jí)相關(guān)圖頂點(diǎn)度都較小,并且分布均勻。本發(fā)明將單詞除首字符外的所有字符都用兩個(gè)不同的平滑函數(shù)將其平滑為兩個(gè)字符,例如對(duì)單詞k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2為平滑函數(shù)。f1(ci)和f2(ci)表示由字符ci及其附近字符計(jì)算得到的平滑值。平滑函數(shù)是用戶(hù)自定義的函數(shù),對(duì)于英文詞典,f(ci)=a(ci-1)2+bci是常用的平滑函數(shù);對(duì)于中文詞典,f(ci)=aci-1+bci是常用的平滑函數(shù),其中a、b是參數(shù)。表1顯示了詞典K={aa,ac,ba,bb,bc,aca,baa,cab,cbc,cca}的平滑結(jié)果,令a、b、c的整數(shù)id分別為1、2、3,平滑函數(shù)分別為f1(ci)=2c1+ci,f2(ci)=ci-1+ci(i≥2)。例如對(duì)單詞“cab”,f1(‘a(chǎn)’)=2‘c’+‘a(chǎn)’=2×3+1=7;f2(‘a(chǎn)’)=‘c’+‘a(chǎn)’=3+1=4;f1(‘b’)=2‘c’+‘b’=2×3+2=8;f2(‘b’)=‘a(chǎn)’+‘b’=1+2=3;因此,“cab”平滑后為(3,7,4,8,3)。
表12.多級(jí)相關(guān)圖構(gòu)造階段對(duì)平滑后的詞典,本發(fā)明將構(gòu)造多級(jí)相關(guān)圖。多級(jí)相關(guān)圖的構(gòu)造首先需要將平滑后詞典按照單詞長(zhǎng)度分為若干子詞典,每個(gè)子詞典內(nèi)所有單詞長(zhǎng)度相同,對(duì)每個(gè)子詞典構(gòu)造一級(jí)相關(guān)圖,形成原始詞典的多級(jí)相關(guān)圖。對(duì)于表1所示的詞典,將劃分為兩個(gè)子詞典K1={aa,ac,ba,bb,bc}和K2={aca,baa,cab,cbc,cca},每個(gè)子詞典分別構(gòu)造一級(jí)相關(guān)圖,每個(gè)子詞典對(duì)應(yīng)的相關(guān)圖頂點(diǎn)為平滑后單詞最后兩個(gè)字符的集合,邊為子詞典所有單詞的集合。圖2(a)和圖2(b)分別是對(duì)子詞典K1和K2的相關(guān)圖,其中圖中各頂點(diǎn)表示平滑后各字符,下標(biāo)表示字符在單詞中的位置。
3.頂點(diǎn)賦值階段本發(fā)明在頂點(diǎn)賦值階段首先將所有哈希表地址全部置為“空閑”,然后按照單詞長(zhǎng)度依次對(duì)各子詞典處理。對(duì)所有字符在第一個(gè)位置出現(xiàn)關(guān)聯(lián)隨機(jī)整數(shù),如表1所示的詞典,第一個(gè)位置a、b、c字符分別關(guān)聯(lián)1、3和8。對(duì)于每一個(gè)子詞典所構(gòu)造相關(guān)圖的頂點(diǎn)進(jìn)行排序,對(duì)排序后的頂點(diǎn)vi依次關(guān)聯(lián)整數(shù)g(vi),使得與vi相鄰的所有單詞映射到哈希表空閑地址,標(biāo)志這些地址為占用,直到各相關(guān)圖所有頂點(diǎn)均已經(jīng)關(guān)聯(lián)合適整數(shù)。
對(duì)每一級(jí)相關(guān)圖,本發(fā)明按照類(lèi)似于Prim算法的排序方式對(duì)相關(guān)圖頂點(diǎn)排序,度最高的頂點(diǎn)v1排第一,與v1相鄰的度最高的頂點(diǎn)v2排第二,與v1或v2相鄰的度最高的頂點(diǎn)v3排第三......。圖3是圖2(a)所示相關(guān)圖的排序示意圖,本發(fā)明將按照52、43、33、62、32、23、72、53的順序?qū)@些頂點(diǎn)關(guān)聯(lián)整數(shù),使得K1={aa,ac,ba,bb,bc}各單詞映射到哈希表的不同地址。首先對(duì)52頂點(diǎn)關(guān)聯(lián)整數(shù)0,43頂點(diǎn)關(guān)聯(lián)整數(shù)必須保證將與之相鄰的單詞“ac”映射到第一個(gè)空閑地址(地址1),因此43頂點(diǎn)所關(guān)聯(lián)整數(shù)g(43)=1可滿(mǎn)足hash(″ac″)=g(11)+g(52)+g(43)=1+0+1=1,標(biāo)志哈希表地址1為“占用”。同理33頂點(diǎn)應(yīng)該關(guān)聯(lián)整數(shù)g(33)=1才能使單詞“ba”映射到第一個(gè)空閑地址2......。表2顯示了單詞平滑后各字符在各位置關(guān)聯(lián)的整數(shù)。
表2以上所述的具體實(shí)施例,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說(shuō)明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,該方法包括A、將待構(gòu)造哈希函數(shù)的詞典中的單詞平滑;B、將平滑后詞典按照單詞長(zhǎng)度分為n個(gè)子詞典,對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖,n為自然數(shù);C、對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序,對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,得到詞典的完美哈希函數(shù)。
2.根據(jù)權(quán)利要求1所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,所述步驟A包括采用兩個(gè)不同的平滑函數(shù),分別將每個(gè)單詞除首字符外的每個(gè)字符平滑為兩個(gè)字符。
3.根據(jù)權(quán)利要求2所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,對(duì)于單詞k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2為兩個(gè)平滑函數(shù),f1(ci)和f2(ci)表示由字符ci及其附近字符計(jì)算得到的平滑值。
4.根據(jù)權(quán)利要求1所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,所述平滑函數(shù)為自定義的函數(shù),或?yàn)楦鶕?jù)詞典大小和期望填充因子調(diào)整相關(guān)參數(shù)得到的函數(shù)。
5.根據(jù)權(quán)利要求2、3或4所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,對(duì)于英文詞典,所述平滑函數(shù)為f(ci)=a(ci-1)2+bci;對(duì)于中文詞典,所述平滑函數(shù)為f(ci)=aci-1+bci;其中a、b為參數(shù)。
6.根據(jù)權(quán)利要求1所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,步驟B中所述每個(gè)子詞典內(nèi)所有單詞長(zhǎng)度相同;步驟B中所述對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖包括對(duì)單詞長(zhǎng)度大于1的子詞典,以其所有單詞最后兩個(gè)字符為頂點(diǎn),兩個(gè)字符出現(xiàn)在同一個(gè)單詞的最后兩個(gè)位置,則在這兩個(gè)字符對(duì)應(yīng)的頂點(diǎn)間連一條邊,形成該子詞典的相關(guān)圖。
7.根據(jù)權(quán)利要求6所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,所述形成該子詞典的相關(guān)圖后進(jìn)一步包括將各子詞典相關(guān)圖的集合在一起,形成原詞典的多級(jí)相關(guān)圖。
8.根據(jù)權(quán)利要求6所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,步驟B中所述多級(jí)相關(guān)圖,其頂點(diǎn)集合為相應(yīng)子詞典平滑后單詞最后兩個(gè)字符的集合,其邊集為相應(yīng)子詞典所有單詞的集合。
9.根據(jù)權(quán)利要求1所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,步驟C中所述對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序按照類(lèi)似Prim算法的方式進(jìn)行,具體包括對(duì)各級(jí)相關(guān)圖頂點(diǎn)按照類(lèi)似Prim算法排序,將度最高的頂點(diǎn)v1排第一,與v1相鄰的度最高的頂點(diǎn)v2排第二,與v1或v2相鄰的度最高的頂點(diǎn)v3排第三,……,直到該級(jí)相關(guān)圖所有頂點(diǎn)都已經(jīng)排序。
10.根據(jù)權(quán)利要求1所述的構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,其特征在于,步驟C中所述對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,得到詞典的完美哈希函數(shù)包括對(duì)各級(jí)相關(guān)圖的每個(gè)頂點(diǎn)依次關(guān)聯(lián)一個(gè)合適的整數(shù),將與當(dāng)前頂點(diǎn)相鄰的所有單詞映射到哈希表空閑地址,即對(duì)于單詞k=c1c2…cn,平滑后單詞形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),對(duì)k`各字符關(guān)聯(lián)整數(shù),使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn))為完美哈希函數(shù),其中g(shù)(f1(ci))和g(f2(ci))分別表示對(duì)頂點(diǎn)f1(ci)和f2(ci)關(guān)聯(lián)的整數(shù)。
全文摘要
本發(fā)明涉及信息檢索和自然語(yǔ)言處理技術(shù)領(lǐng)域,公開(kāi)了一種構(gòu)造用于處理大規(guī)模詞典的完美哈希函數(shù)的方法,該方法包括A、將待構(gòu)造哈希函數(shù)的詞典中的單詞平滑;B、將平滑后詞典按照單詞長(zhǎng)度分為n個(gè)子詞典,對(duì)每個(gè)子詞典構(gòu)造相關(guān)圖,n為自然數(shù);C、對(duì)構(gòu)造的每個(gè)子詞典的相關(guān)圖中的頂點(diǎn)進(jìn)行排序,對(duì)排序后各頂點(diǎn)依次關(guān)聯(lián)整數(shù),將各單詞映射到不同的哈希地址,得到詞典的完美哈希函數(shù)。利用本發(fā)明,能夠?qū)Π习偃f(wàn)單詞的詞典成功構(gòu)造完美哈希函數(shù),并且能夠處理中文等大字符集詞典,填充因子接近1,提高了填充因子,縮短了構(gòu)造時(shí)間,減少了哈希函數(shù)的工作空間。
文檔編號(hào)G06F17/30GK1996306SQ200610171640
公開(kāi)日2007年7月11日 申請(qǐng)日期2006年12月31日 優(yōu)先權(quán)日2006年12月31日
發(fā)明者龔才春 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所