python自然語言處理(NLP)1------中文分詞1,基於規則的中文分詞方法
阿新 • • 發佈:2019-01-09
python中文分詞方法之基於規則的中文分詞
目錄
常見中文分詞方法
推薦中文分詞工具
參考連結
一、四種常見的中文分詞方法:
- 基於規則的中文分詞
- 基於統計的中文分詞
- 深度學習中文分詞
- 混合分詞方法
基於規則的中文分詞
包括, 正向最大匹配法,逆向最大匹配法和雙向最大匹配法。
最大匹配方法是最有代表性的一種基於詞典和規則的方法,其缺點是嚴重依賴詞典,無法很好地處理分詞歧義和未登入詞。優點是由於這種方法簡單、速度快、且分詞效果基本可以滿足需求,因此在工業界仍然很受歡迎。
正向最大匹配法
思想:
正如方法名稱,正向表示對句子從左到右選擇詞典中最長的詞條進行匹配,獲得分詞結果。
1、統計分詞詞典,確定詞典中最長詞條的字元m;
2、從左向右取待切分語句的m個字元作為匹配欄位,查詢詞典,如果匹配成功,則作為一個切分後的詞語,否則,去掉待匹配字元的最後一個繼續查詢詞典,重複上述步驟直到切分出所有詞語。
Coding舉例:
dictA = ['南京市', '南京市長', '長江大橋', '大橋']
maxDictA = max([len(word) for word in dictA])
sentence = "南京市長江大橋"
def cutA(sentence):
result = []
sentenceLen = len(sentence)
n = 0
while n < sentenceLen:
matched = 0
for i in range(maxDictA, 0, -1):
piece = sentence[n:n+i]
if piece in dictA:
result.append(piece)
matched = 1
n = n + i
break
if not matched:
result.append(sentence[n])
n += 1
print(result)
cutA(sentence) # ['南京市長', '江', '大橋']
說明:具體應用中需要去除停用詞
逆向最大匹配法
思想:
與正向最大匹配原理相同,主要差異是:
1、對句子從右到左選擇詞典中最長的詞條進行匹配,獲得分詞結果;
2、當匹配失敗時,去掉待匹配字元的最前面的一個繼續查詢詞典。
Coding舉例:
dictB = ['南京市', '南京市長', '長江大橋', '大橋']
maxDictB = max([len(word) for word in dictA])
sentence = "南京市長江大橋"
def cutB(sentence):
result = []
sentenceLen = len(sentence)
while sentenceLen > 0:
word = ''
for i in range(maxDictB, 0, -1):
piece = sentence[sentenceLen-i:sentenceLen]
if piece in dictB:
word = piece
result.append(word)
sentenceLen -= i
break
if word is '':
sentenceLen -= 1
result.append(sentence[sentenceLen])
print(result[::-1])
cutB(sentence) # ['南京市', '長江大橋']
雙向最大匹配法
思想:
將正向最大匹配和逆向匹配得到的分詞結果進行比較,按照最大匹配原則,選擇切分總詞數最少的作為最終分詞結果。
舉例:
dictA:# [‘南京市長’, ‘江’, ‘大橋’]
dictB: # [‘南京市’, ‘長江大橋’]
最終選擇,dictB的結果。
總結:詞典簡單高效,但是詞典構建工作量巨大,對於新詞切分總慢一步,很難通過詞典覆蓋到所有詞。
二、推薦中文分詞工具
請參考另外一篇文章,連結如下: