NLP最大匹配法

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP最大匹配法相关的知识,希望对你有一定的参考价值。

学习目标

  1. 知道正向最大匹配法
  2. 知道逆向最大匹配法
  3. 知道双向最大匹配法

1. 起源

最大匹配法是最简单的分词方法,他完全使用词典进行分词,如果词典好,则分词的效果好

2. 正向最大匹配法

正向,即从左往右进行匹配

#Maximum Match Method 最大匹配法

class  MM:
    def __init__(self):
        self.window_size = 4

    def cut(self,text):
        result = []
        index = 0
        text_lenght = len(text)
		#研究生命的起源
        dic = ["研究","研究生","生命"]
        while text_lenght >index:
            #range(3,0,-1)
            for size in range(min(self.window_size+index,text_lenght),index,-1):
                piece = text[index:size]
                print("size:", size,piece)
                if piece in dic:
                    index = size-1
                    break
            index = index+1  #第一次结束index = 3
            result.append(piece)
        print(result)
        return result

3. 逆向最大匹配法

逆向即从右往左进行匹配

#RMM:Reverse Maxmium Match method 逆向最大匹配

class RMM:
    def __init__(self):
        self.window_size = 3

    def cut(self,text):
        result = []
        index = len(text)
        #研究生命的起源
        dic = ["研究","研究生","生命"]
        while index>0:
            for size in range(max((index-self.window_size),0),index):
                piece = text[size:index]
                print("size:", size,piece)
                if piece in dic:
                    index = size+1
                    print("index:", index)
                    break
                print("index:",index)
            index = index - 1
            result.append(piece)
        result.reverse()
        print(result)
        return result

4. 双向最大匹配法

同时根据正向和逆向的结果,进行匹配

class MCut():
    def __init__(self):
        self.mm = MM()
        self.rmm = RMM()
    
    def cut(self,sentence):
        """
        1. 词语数量不相同,选择分词后词语数量少的
        2. 如果词语数量相同,返回单字数量少的
        """
        mm_ret = self.mm.cut(sentence)
        rmm_ret = self.rmm.cut(sentence)
        if len(mm_ret)==len(rmm_ret):
            mm_ret_signle_len = len([i for i in mm_ret if len(i)==1])
            rmm_ret_signle_len = len([i for i in rmm_ret if len(i)==1])
            return mm_ret if rmm_ret_signle_len>mm_ret_signle_len else rmm_ret
        else:
            return mm_ret if len(mm_ret)<len(rmm_ret) else rmm_ret

以上是关于NLP最大匹配法的主要内容,如果未能解决你的问题,请参考以下文章

nlp正向最大匹配算法逆向最大匹配算法双向最大匹配算法代码实现

seg:NLP之前向最大匹配分词

NLP | 基于字符匹配的中文分词

中文分词入门之最大匹配法扩展:MMSeg

规则分词法|自然语言

NLP预备:jieba 中文分词入门(上)