自然语言处理之中文分词逆向最大匹配算法(RMM算法)

       经过了一阶段的学习上课,现在已经开始开始在自然语言处理的道路上安心研究,最近看了一本叫《python自然语言处理实战核心技术与算法》,大致的溜了一遍,感觉写的很基础了,个人认为主要写的好的地方就是既有说明又有代码示例,同时还有实战练习,这对我一个初学者来说,可以说是大有裨益。
       关于与NLP的相关前置技术这里就不展示了,上面书中写的很好,那么接下来直接给大家分享一下我最近学到的一个简单的RMM算法关于中文分词技术中的(逆向最大匹配算法),该算法原理如下:
       从被处理文档的末端进行扫描,每次取最末端的n个字符,用来和词典中的字段进行匹配,如果匹配成功,则进行切词,否则,去掉匹配字段起一个字,继续匹配,直至匹配字段长度为0。但是在实际处理过程中,其实和MM算法(正向最大匹配算法)相似,RMM就是把MM算法中的文档进行倒序处理,然后根据逆序字典进行匹配处理。那么用代码是如何实现的,接下来我来展示一下书上的相关RMM算法代码,其中在我自己的理解下都备注了详细的代码解释。此代码均为书本上的,注释是我自己写的,仅此拿出来与大家交流学习。望各位指教!!!

#-*-coding:utf-8-*-

class  RMM(object):
    def __init__(self):
        #窗口大小/每次要匹配字段长度
        self.window_size=3
    def cut(self,text):
        result=[]
        index=len(text)#文本长度
        #新建一个字典,可以理解为数据库
        dic=["研究","研究生","生命","命","的","起源"]
        # 如果文本长度大于0
        while index>0:
            #如果size在范围最后i个字段中
            for size in range(index-self.window_size,index):
                #取末端i个字段/对text倒序排列处理
                piece=text[size:index]
                #如果字段在词典中把piece直接放入结果中
                if piece in dic:
                    index=size+1
                    break
            #匹配自断没在字典中,文本长度减一/去掉匹配字段前一个字
            index=index-1
            #把分词结果放到result中
            result.append(piece)
        #结果倒置
        result.reverse()
        return result
if __name__ == '__main__':
    #测试文本
    text='研究生命的起源'
    tokenizer=RMM()
    print(tokenizer.cut(text))
  

发布了7 篇原创文章 · 获赞 6 · 访问量 1541

猜你喜欢

转载自blog.csdn.net/weixin_45385271/article/details/103132294
今日推荐