经过了一阶段的学习上课,现在已经开始开始在自然语言处理的道路上安心研究,最近看了一本叫《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))