• 最大匹配算法


    最大匹配法

    起源

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

     

    正向最大匹配法

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

    #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
    

      

    逆向最大匹配法

    逆向即从右往左进行匹配

    #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
    

      

    双向最大匹配法

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

    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
    

      

    多思考也是一种努力,做出正确的分析和选择,因为我们的时间和精力都有限,所以把时间花在更有价值的地方。
  • 相关阅读:
    博客的开端,找对象不再new
    OpenGL编程 基础篇(六)OpenGL中几种光照参数
    OpenGL编程 基础篇(五)世界窗口和视口
    百练2952:循环数
    百练2811:熄灯问题
    百练2812:恼人的青蛙
    百练3177:判决素数个数
    百练1248:Safecracker
    OpenGL编程 基础篇(四)与鼠标的交互
    OpenGL编程 基础篇(三)用点集绘制函数
  • 原文地址:https://www.cnblogs.com/LiuXinyu12378/p/11434064.html
Copyright © 2020-2023  润新知