中文分詞 二級hash詞典構造

2022-03-23 19:22:12 字數 1585 閱讀 3328

漢字在計算機內部是以內碼的形式進行儲存的,漢字內碼是漢字在漢字資訊處理系統中最基本的表達形式,它與漢字交換碼、漢字區位碼有一定的對應關係。由於自定義編碼順序的特殊性,因而,可通過計算偏移量的方法來定位該漢字在編碼表中任意的位置。國標gb2312漢字編碼表共收錄了6763個漢字。gb2312-80

標註規定漢語字元的交換碼由兩個

ascii

碼構成:第乙個是區碼,取值從

oxa1

到oxf7

,共87

個區,第二個是位碼,從

oxa1

到0xfe

,共94

位。區碼為

oxa1

到0xae

的儲存全形符號,如標點、字母等。

gb2312-80

漢字的編碼空間是

boa1-fife

,共有72 * 94 = 6768

個碼位,實有

6763

個漢字,其中一級漢字

3755

個,接著是

5個空位,後面是

3008

個二級漢字。

漢字在編碼表中的偏移量計算公式如下:

offset = (ch1 – 0xb0) * 94 + (ch2 – 0xa1)    (1)[可以用乙個72*94的陣列實現漢字的一一對映,1標識漢字在詞典中存在,0標識不存在]

其中,offset代表某漢字在編碼表中的位置,ch1、ch2代表漢字的內部碼。

struct second//二級hash

};struct head//首字hash

};將gb2312中的所有漢字,用offset = (ch1 – 0xb0) * 94 + (ch2 – 0xa1) 一一對映到乙個長度為6763的head結構vector,首字hash表中每一項的結構如下,其中ch

為該漢字,second是指向二級hash表的指標。

對於不同的首字來說,以其開頭的詞不僅數量變化很大,而且沒有明顯的特徵規律。如果想要只通過首字hash表進行查詢不僅需要多次比較,而且不容易找出最長的詞條。為了減少查詢、比較次數,同時最精確的找出最長詞條,本文對以某個字開頭的所有詞的長度進行第二次hash,將以某個字開頭的所有詞條雜湊在不同的佇列上,比如以「電」開頭的所有詞條電影、電視、電路、電視迷、電視網、電視機、電視公司、電視直播、電視接收、電算中心、電視接收機,會被雜湊到二字詞、三自詞、四字詞、五字詞這四個佇列上。這樣增加了佇列個數,減少了佇列長度,不僅提高了查詢命中率,而且由於最長詞條的長度是已知的,所以能極大提高最長匹配分詞的效率。

詞條佇列包含一組首字相同、長度相同的詞條。乙個詞的首字和長度決定了它所在的詞條佇列,因此當查詢乙個詞是否在現有詞典中時最終變成查詢該詞是否存在於特定的詞條佇列裡。詞條佇列的結構如下,其中k為該詞條佇列的長度,word1,word2,word3…wordk為k個詞條。佇列中的詞條根據詞典排序規則進行公升序排列。

常用的有正向最大匹配和逆向最大匹配,統計結果表明單純使用正向最大匹配錯誤率為1/169,單純使用逆向最大匹配錯誤率1/245,逆向最大匹配會稍好一些。

參考:

二級python基礎之jieba庫分詞

jieba是優秀的中文分詞第三方庫 cmd命令列 pip install jieba jieba分詞依靠中文詞庫 精確模式 全模式 搜尋引擎模式 jieba.lcut s 精確模式,返回乙個列表型別的分詞結果 import jieba s jieba.lcut 中國是乙個偉大的國家 print s ...

中文檢索 分詞 同義詞 權重

1 首先匯入lucene相關包 lucene analyzers common 4.7.1.jar lucene core 4.7.1.jar lucene facet 4.7.1.jar lucene highlighter 4.7.1.jar lucene queries 4.7.1.jar l...

中文分詞jieba python 學習關鍵詞

jieba.cut for search方法接受兩個引數 需要分詞的字串 是否使用 hmm 模型。該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細 注意 待分詞的字串可以是 gbk 字串 utf 8 字串或者 unicode jieba.cut以及jieba.cut for search返回的結...