1. 程式人生 > >中文分詞之正向最大匹配演算法

中文分詞之正向最大匹配演算法

中文分詞目前可以分為“規則分詞”,“統計分詞”,“混合分詞(規則+統計)”這三個主要流派。這次介紹下基於規則的分詞,其是一種機械的分詞方法,主要通過維護詞典,在切分語句時,將語句的每個字串與詞表中的詞逐一進行匹配,找到則切分,否則不予切分。

正向最大匹配演算法:這裡需要知道兩點,一個是分詞詞典(也即是已經分詞過的詞典),另一個是需要被分詞的文件。假定分詞詞典中的最長詞有i個漢子字串,則用被處理文件的當前字串中的前i個字作為匹配欄位,查詢字典。若此時分詞詞典中存在這樣一個字串,則匹配成功,而此時被匹配的欄位切分出來。如果匹配失敗,將匹配欄位中的最後一個字去掉,對此時剩下的字串重新與分詞詞典進行匹配,如此下去直到匹配成功。也即是切分出一個詞或剩餘字串的長度為零為止,這個時候才是匹配了一輪,接著進行下一個

i字字串的匹配,方法同上,直到文件被掃描完為止。

正向最大匹配演算法的原理比較簡單,也沒有用到機器學習和概率論,統計的一些知識,下面貼出程式碼:

# 定義逆向最大匹配類
class IMM(object):

    # 初始化得到給定的字典中的所有詞和長度最大的詞
    def __init__(self, dic_path):
        self.dictionary = set()
        self.maximum = 0
        #讀取詞典
        with open(dic_path, 'r', encoding='utf8') as f:
            for
line in f: # strip():只能刪除開頭或是結尾的字元,不能刪除中間部分的字元 line = line.strip() print('line:',line) if not line: continue self.dictionary.add(line) if len(line)>=self.maximum: self.maximum = len(line) print('self.dictionary:'
,self.dictionary,'\n','self.maximum:',self.maximum) # 該方法可切分新得到的片語 def cut(self, text): result = [] index = len(text) print('index:',index) while index > 0: word = None for size in range(self.maximum, 0, -1): if index - size < 0: continue print('index - size=>',index - size,':',index) piece = text[(index - size):index] print('piece:',piece) # 判斷該詞是否在詞典中 if piece in self.dictionary: word = piece result.append(word) index -= size break if word is None: index -= 1 return result[::-1] def main(): text = "南京市長江大橋" # 詞典的地址 tokenizer = IMM(r'./imm_dic.utf8') print(tokenizer.cut(text)) main()

執行結果:

line: 南京市
line: 南京市長
line: 長江大橋
line: 人名解放軍
line: 大橋
self.dictionary: {'人名解放軍', '長江大橋', '大橋', '南京市長', '南京市'} 
 self.maximum: 5
index: 7
index - size=> 2 : 7
piece: 市長江大橋
index - size=> 3 : 7
piece: 長江大橋
index - size=> 0 : 3
piece: 南京市
['南京市', '長江大橋']

而且這裡的分詞詞典是自己定義好的,作為簡單的demo學習一下。

參考:《pytho自然語言處理實戰 核心技術與演算法》