中文分词之正向最大匹配算法
生活随笔
收集整理的這篇文章主要介紹了
中文分词之正向最大匹配算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
中文分詞目前可以分為“規則分詞”,“統計分詞”,“混合分詞(規則+統計)”這三個主要流派。這次介紹下基于規則的分詞,其是一種機械的分詞方法,主要通過維護詞典,在切分語句時,將語句的每個字符串與詞表中的詞逐一進行匹配,找到則切分,否則不予切分。
正向最大匹配算法:這里需要知道兩點,一個是分詞詞典(也即是已經分詞過的詞典),另一個是需要被分詞的文檔。假定分詞詞典中的最長詞有ii個漢子字符串,則用被處理文檔的當前字符串中的前ii個字作為匹配字段,查找字典。若此時分詞詞典中存在這樣一個字符串,則匹配成功,而此時被匹配的字段切分出來。如果匹配失敗,將匹配字段中的最后一個字去掉,對此時剩下的字串重新與分詞詞典進行匹配,如此下去直到匹配成功。也即是切分出一個詞或剩余字串的長度為零為止,這個時候才是匹配了一輪,接著進行下一個ii<script type="math/tex" id="MathJax-Element-3">i</script>字字串的匹配,方法同上,直到文檔被掃描完為止。
正向最大匹配算法的原理比較簡單,也沒有用到機器學習和概率論,統計的一些知識,下面貼出代碼:
# 定義逆向最大匹配類 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:continueself.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 = Nonefor size in range(self.maximum, 0, -1):if index - size < 0:continueprint('index - size=>',index - size,':',index)piece = text[(index - size):index]print('piece:',piece)# 判斷該詞是否在詞典中if piece in self.dictionary:word = pieceresult.append(word)index -= sizebreakif word is None:index -= 1return 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自然語言處理實戰 核心技術與算法》
總結
以上是生活随笔為你收集整理的中文分词之正向最大匹配算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 递归神经网络部分组件(七)
- 下一篇: 顺丰速运从沈阳市到重庆市要多少时间?