NLP之逆向最大匹配演算法(BMM)

逆水舟行發表於2017-10-25

演算法概述

BMM是一個基於詞典的分詞演算法,與之相似的還有正向最大匹配演算法(FMM)和雙向匹配演算法(BM)。
演算法的大致過程為:
1、輸入最大詞長maxWordLength,字典wordDict,待分句子。
2、從待分句子的末尾開始向前擷取長度為maxWordLength的子句,進行分詞。
3、對一個子句的分詞過程為,首先判斷子句是否在字典中,若在,則儲存這個子句,並從原句中刪除這個子句,轉到2。
若不在,則判斷子句長度是否為1,若為1,則將單字儲存,從原句中刪除單字,轉到2。若不為1,則將子句中最右邊的一個字刪除,形成新的子句,轉到3。

程式碼實現

"""逆向最大匹配演算法"""
def BMM(wordDict, maxWordLength, sentence):
    """
        @:param:
        wordDict:分詞字典
        maxWordLength:最大詞長
        sentence:待分句子,不要有標點符號
        @:return:
        result:分詞結果,是句子分詞的逆序
    """
    result = []
    while len(sentence) != 0:
        #最大詞長大於待分句子時,重置最大詞長
        if len(sentence) < maxWordLength:
            maxWordLength = len(sentence)
        #待分子句
        segWord = sentence[len(sentence)-maxWordLength:len(sentence)]
        while not(segWord in wordDict):
            #while 迴圈結束有兩種情況,1是segWord存在於字典中,
            #2是,segWord為單字。
            #防止初始segWord長度為1,出錯
            if len(segWord) > 1:
                segWord = segWord[1:]
            else:
                #result.append(segWord)
                #sentence = sentence[:len(sentence)-1]
                break

        #第二個迴圈結束,則將分詞結果儲存到result
        #並從原句中刪除已分詞
        result.append(segWord)
        sentence = sentence[:len(sentence)-len(segWord)]
    return result

執行結果

def main():
    maxWordLength, sougoDict = readDict("sougoDict.txt")

    sentence1 = "今天天氣怎麼樣"
    result1 = BMM(sougoDict, maxWordLength, sentence1)
    printResult(result1)

    sentence2 = "最高買價和最低買價分別是多少"
    result2 = BMM(sougoDict, maxWordLength, sentence2)
    printResult(result2)

    sentence3 = "亂七八糟的字絎輿硎闓庹"
    result3 = BMM(sougoDict, maxWordLength, sentence3)
    printResult(result3)

執行結果
BMM執行結果,輸出很簡陋

說明
這個程式碼只是一個基礎版本,沒有經過完整測試,僅供參考,如有什麼問題,還望多多指教。

分詞詞典
分詞詞典是從參考文章《千萬級巨型漢語詞庫分享》中擷取出的一小部分,共有30萬常用詞,需說明的是字典不是最新的。
下載連結

參考文章
中文分詞入門之最大匹配法
千萬級巨型漢語詞庫分享

相關文章