中文分詞之正向最大匹配演算法
阿新 • • 發佈:2019-01-26
中文分詞目前可以分為“規則分詞”,“統計分詞”,“混合分詞(規則+統計)”這三個主要流派。這次介紹下基於規則的分詞,其是一種機械的分詞方法,主要通過維護詞典,在切分語句時,將語句的每個字串與詞表中的詞逐一進行匹配,找到則切分,否則不予切分。
正向最大匹配演算法:這裡需要知道兩點,一個是分詞詞典(也即是已經分詞過的詞典),另一個是需要被分詞的文件。假定分詞詞典中的最長詞有個漢子字串,則用被處理文件的當前字串中的前個字作為匹配欄位,查詢字典。若此時分詞詞典中存在這樣一個字串,則匹配成功,而此時被匹配的欄位切分出來。如果匹配失敗,將匹配欄位中的最後一個字去掉,對此時剩下的字串重新與分詞詞典進行匹配,如此下去直到匹配成功。也即是切分出一個詞或剩餘字串的長度為零為止,這個時候才是匹配了一輪,接著進行下一個 字字串的匹配,方法同上,直到文件被掃描完為止。
正向最大匹配演算法的原理比較簡單,也沒有用到機器學習和概率論,統計的一些知識,下面貼出程式碼:
# 定義逆向最大匹配類
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自然語言處理實戰 核心技術與演算法》