【Python自然语言处理】中文分词技术——规则分词
中文分詞方法
本文參考自書籍《Python自然語(yǔ)言處理實(shí)戰(zhàn):核心技術(shù)與算法》
用做個(gè)人的學(xué)習(xí)筆記和分享
1. 規(guī)則分詞
規(guī)則分詞是一種機(jī)械分詞方法,主要通過(guò)維護(hù)詞典,在切分語(yǔ)句時(shí)將語(yǔ)句的每個(gè)字符串和詞表中的詞逐一匹配找到則切分,找不到則不切分。
具體包括正向最大匹配法、逆向最大匹配法和雙向最大匹配法
1.1 正向最大匹配法
1.1.1 算法描述
①?gòu)淖笙蛴胰〈蟹譂h語(yǔ)句的m 個(gè)字符作為匹配字段, m 為機(jī)器詞典中最長(zhǎng)詞條的
字符數(shù)。
②查找機(jī)器詞典并進(jìn)行匹配。
若匹配成功, 則將這個(gè)匹配字段作為一個(gè)詞切分出來(lái)。
若匹配不成功,則將這個(gè)匹配宇段的最后一個(gè)字去掉,剩下的字符串作為新的匹配字段, 進(jìn)行再次匹配。
③重復(fù)以上過(guò)程,直到切分出所有詞為止。
1.1.2 算法實(shí)現(xiàn)
# 正向最大匹配 class MM(object):def __init__(self, dic_path):self.dictionary = set()self.maximum = 0with open(dic_path, 'r', encoding='utf8') as f:for line in f:line = line.strip()if not line:continueself.dictionary.add(line)if len(line) > self.maximum:self.maximum = len(line)def cut(self, text):result = []size = self.maximumtext_len = len(text)while text_len > 0:word = text[0:size]while word not in self.dictionary:if len(word) == 1:breakword = word[0:len(word) - 1]result.append(word)text = text[len(word):]text_len = len(text)return resultif __name__ == '__main__':text = "南京市長(zhǎng)江大橋"tokenizer = MM('dic.utf8')print(tokenizer.cut(text))注:dic.utf8文件是自定義的詞典文件
這個(gè)詞典包括一下詞匯:
南京市
南京市長(zhǎng)
長(zhǎng)江大橋
人名解放軍
大橋
1.2 逆向最大匹配法
1.2.1 算法描述
①?gòu)谋惶幚砦膿醯哪┒碎_(kāi)始匹配掃描
②每次取最末端i個(gè)字符( i 為詞典中最長(zhǎng)詞數(shù))作為匹配字段
若匹配失敗,則去掉匹配字段最前面的一個(gè)字,繼續(xù)匹配。
若匹配成功則保存字段,它使用的分詞詞典是逆序詞典, 其中的每個(gè)詞條都將按逆序方式存放。
③在實(shí)際處理時(shí),可以先將文檔進(jìn)行倒排處理成逆序文檔。然后根據(jù)逆序詞典,對(duì)逆序文檔用正向最大匹配法處理即可。
由于漢語(yǔ)中偏正結(jié)構(gòu)較多,若從后向前匹配,可以適當(dāng)提高精確度。所以,逆向最大匹配法比正向最大匹配法的誤差要小。
統(tǒng)計(jì)結(jié)果表明,單純使用正向最大匹配的錯(cuò)誤率為1/169 ,單純使用逆向最大匹配的錯(cuò)誤率為1/245
1.2.2 算法實(shí)現(xiàn)
# 逆向最大匹配 class IMM(object):def __init__(self, dic_path):self.dictionary = set()self.maximum = 0with open(dic_path, 'r', encoding='utf8') as f:for line in f:line = line.strip()if not line:continueself.dictionary.add(line)if len(line) > self.maximum:self.maximum = len(line)def cut(self, text):result = []index = len(text)while index > 0:word = Nonefor size in range(self.maximum, 0, -1):if index - size < 0:continuepiece = text[(index - size):index]if piece in self.dictionary:word = pieceresult.append(word)index -= sizebreakif word is None:index -= 1return result[::-1]if __name__ == '__main__':text = "南京市長(zhǎng)江大橋"tokenizer = IMM('dic.utf8')print(tokenizer.cut(text))1.3 雙向最大匹配法
1.3.1 算法描述
將正向最大匹配法得到的分詞結(jié)果和逆向最大匹配法得到的結(jié)果進(jìn)行比較
按照最大匹配原則,選取詞數(shù)切分最少的作為結(jié)果。
雙向匹配法被廣泛應(yīng)用
據(jù)SunM.S. 和Bejamin K.T. ( 1995 )的研究表明,中文中90.0% 左右的句子,正向最大匹配法和逆向最大匹配法完全重合且正確,只有大概9.0% 的句子兩種切分方法得到的結(jié)果不一樣,但其中必有一個(gè)是正確的(歧義檢測(cè)成功),只有不到1.0%的句子,使用正向最大匹配法和逆向最大匹配法的切分雖重合卻是錯(cuò)的,或者正向最大匹配法和逆向最大匹配法切分不同但兩個(gè)都不對(duì)(歧義檢測(cè)失敗) 。
2. 統(tǒng)計(jì)分詞
統(tǒng)計(jì)分詞的詳細(xì)筆記
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【Python自然语言处理】中文分词技术——规则分词的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 翻译:A DSL in 5 Langua
- 下一篇: Android官方开发文档Trainin