正向最大匹配(maximum match method, mm法)的基本思想為:假定分詞詞典中的最長詞有i個漢字字元,則用被處理文件的當前字串中的前i個字作為匹配字段,查詢字典。若字典中存在這樣的乙個i字詞,則匹配成功,匹配欄位被作為乙個詞切分出來。如果詞典中找不到這樣的乙個i字詞,則匹配失敗,將匹配欄位中的最後乙個字去掉,對剩下的字串重新進行匹配處理。如此進行下去,直到匹配成功,即切分出乙個詞或剩餘字串的長度為零為止。這樣就完成了一輪匹配,然後取下乙個i字字串進行匹配處理,直到文件被掃瞄完為止。
# 正向最大匹配法mm
class mm(object):
def __init__(self):
self.window_size = 3
def cut(self, text):
result =
index = 0
text_length = len(text)
dic = ['研究', '研究生', '生命', '命', '的', '起源']
while text_length > index:
for size in range(self.window_size + index, index, -1):
piece = text[index:size]
if piece in dic:
index = size - 1
break
index = index + 1
return result
if __name__ == '__main__':
text = '研究生命的起源'
tokenizer = mm()
print(tokenizer.cut(text))
分詞結果:
['研究生----', '命----', '的----', '起源----']
逆向最大匹配(reverse maximum match method, rmm法)的基本原理與mm法相同,不同的是分詞切分的方向與mm法相反。逆向最大匹配法從被處理文件的末端開始匹配掃瞄,每次取最末端的i個字元(i為詞典中最長詞數)作為匹配字段,若匹配失敗,則去掉匹配欄位最前面的乙個字,繼續匹配。相應地,它使用的分詞詞典是逆序詞典,其中的每個詞條都將按逆序方式存放。在實際處理時,先將文件進行倒排處理,生成逆序文件。然後,根據逆序詞典,對逆序文件用正向最大匹配法處理即可。
# 逆向最大匹配法rmm
class rmm(object):
def __init__(self):
self.window_size = 3
def cut(self, text):
result =
index = len(text)
dic = ['研究', '研究生', '生命', '命', '的', '起源']
while index > 0:
for size in range(index - self.window_size, index):
piece = text[size:index]
if piece in dic:
index = size + 1
break
index = index - 1
result.reverse()
return result
if __name__ == '__main__':
text = '研究生命的起源'
tokenizer = rmm()
print(tokenizer.cut(text))
分詞結果:
['研究----', '生命----', '的----', '起源----']
雙向最大匹配法(bi-direction matching method)是將正向最大匹配法得到的分詞結果和逆向最大匹配法得到的結果進行比較,然後按照最大匹配原則,選取詞數切分最少的作為結果。
例如「南京市長江大橋」,正向最大匹配的結果為「南京市/長江/大橋」,逆向最大匹配的結果為「南京市/長江大橋」,選取詞數較少的「南京市/長江大橋」這一結果。
雙向最大匹配的規則是:
(1)如果正反向分詞結果詞數不同,則取分詞數量較少的那個。
(2)如果分詞結果詞數相同:
1)分詞結果相同,就說明沒有歧義,可返回任意乙個。
2)分詞結果不同,返回其中單字較少的那個。
**如下:
# 雙向最大匹配法bmm
class bmm(object):
def __init__(self):
self.window_size = 3
def cut(self, text):
dic = ['研究', '研究生', '生命', '命', '的', '起源']
result_mm =
index = 0
text_length = len(text)
while text_length > index:
for size in range(self.window_size + index, index, -1):
piece = text[index:size]
if piece in dic:
index = size - 1
break
index = index + 1
result_rmm =
index = len(text)
while index > 0:
for size in range(index - self.window_size, index):
piece = text[size:index]
if piece in dic:
index = size + 1
break
index = index - 1
result_rmm.reverse()
if len(result_mm) > len(result_rmm):
return result_rmm
elif len(result_mm) < len(result_rmm):
return result_mm
elif len(result_mm) == len(result_rmm):
if result_mm == result_rmm:
return result_mm
else:
single_mm = 0
single_rmm = 0
for s_mm in result_mm:
if s_mm[1] == '-':
single_mm += 1
for s_rmm in result_rmm:
if s_rmm[1] == '-':
single_rmm += 1
if single_mm > single_rmm:
return result_rmm
elif single_mm < single_rmm:
return result_mm
if __name__ == '__main__':
text = '研究生命的起源'
tokenizer = bmm()
print(tokenizer.cut(text))
分詞結果:
['研究----', '生命----', '的----', '起源----']
中文分詞 基於字標註法的分詞
中文分詞字標註通常有2 tag,4 tag和6 tag這幾種方法,其中4 tag方法最為常用。標註集是依據漢字 其中也有少量的非漢字字元 在漢語詞中的位置設計的。1.2 tag法 2 tag是一種最簡單的標註方法,標註集合為,其將詞首標記設計為b,而將詞的其他位置標記設計為i。例如詞語 重慶 的標註...
基於詞表的中文分詞演算法
對於輸入的一段文字從左至右,以貪心的方式切分出當前位置上長度最大的詞.正向最大匹配法是基於詞典的分詞方法,其分詞原理是 單詞的顆粒度越大,所能表示的含義越確切.該演算法主要分兩個步驟 一般從乙個字串的開始位置,選擇乙個最大長度的詞長的片段,如果序列不足最大詞長,則選擇全部序列.首先看該片段是否在詞典...
機器學習 基於HMM的中文分詞
encoding utf 8 b表示詞彙的開始 m表示詞彙的中間 e表示詞彙的尾部 s表示詞彙單獨成詞 class hmm object def init self self.states b m e s self.load para false self.a dic self.b dic self...