1. 程式人生 > >python自然語言處理(NLP)1------中文分詞1,基於規則的中文分詞方法

python自然語言處理(NLP)1------中文分詞1,基於規則的中文分詞方法

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的結果。

總結:詞典簡單高效,但是詞典構建工作量巨大,對於新詞切分總慢一步,很難通過詞典覆蓋到所有詞。

二、推薦中文分詞工具

請參考另外一篇文章,連結如下:

三、參考連結