MM、RMM、Bi_MM

写在前面的话

本文参考《Python自然语言处理实战 核心技术与算法》,一本不可多得的自然语言处理入门书籍。

MM、RMM、Bi_MM都是基于规则分词的算法,通过匹配所持有的字典,进行分词。分词结果取决于字典的完整程度和匹配方式。根据SunM.S 和Benjamin K.T(1995)的研究表明,中文中90.0%左右的句子,MM和RMM分词结果重合且完全正确,9.0% 的句子两种方法分词结果不一样,但其中必有一个是正确的,另外1.0%两种方法切分虽重合但却是错误的结果,或者切分不重合都是错的。

MM(Maximum Match Method)最大匹配

算法思想:MM也称正向最大匹配,以字典中词的最大长度为匹配窗口大小,例如 dic = [‘南京’, ‘南京市’, ‘南京市长’, ‘长江’, ‘长江大桥’, ‘大桥’, '桥],字典中词的最大长度为4,则匹配窗口最大长度为4,即从处理文本的前4个字符串作为匹配字段。若首次匹配成功,则匹配窗口向后滑动4个字符位置,继续匹配。若匹配不成功,则缩小匹配字符串大小一位,继续匹配,匹配成功,从下位开始继续向后,不成功,继续减小所匹配字符串的长度。

算法实现:参考书中算法(基于python3)

class MM(object):
	"""maximum Match Method for NLP"""
	def __init__(self, window_size=3):
		super(MM, self).__init__()
		self.window_size = window_size
		
	def cut(self, text):
		result = []
		index = 0
		text_length = len(text)
		dic = ['研究', '研究生', '生命', '命', '的', '起源']
		while text_length>index:
			for size in range(self.window_size+index, index, -1):
		
jupyter notebook基于规则的中文分词def get_words(path): ''' 处理词典文件 path:词典所在路径 ''' file = open(path, encoding="utf-8").read() words = file.split(' ') words_list = [] max_len = 0 for word_i in words: word = word_i.split('/')[0] if len(word)>max_len: max_len = len(word) words_list.append(word) return words_list, max_len def rmm(text, words, max_len): ''' 逆向最长匹配算法 text是待切分文本 words是词典提出来的包含所有的词的列表 max_len是词典中最长词的长度 ''' cut_list = [] text_length = len(text) while text_length > 0: j = 0 for i in range(max_len, 0, -1): if text_length - i < 0: continue new_word = text[text_length - i:text_length] if new_word in words: cut_list.append(new_word) text_length -= i j += 1 break if j == 0: text_length -= 1 cut_list.reverse() return cut_list # 完成正向最长匹配算法 def fmm(text, words, max_len): ''' 最长正向匹配算法 text是待切分文本 words是词典提出来的包含所有的词的列表 max_len是词典中最长词的长度 ''' cut_list = [] ''' 任务1:在此处实现最正向最长匹配 ''' return cut_list def bi_mm(text,words,max_len): ''' 双向最长 text是待切分文本 words是词典提出来的包含所有的词的列表 max_len是词典中最长词的长度 ''' cut_list_fmm = fmm(text, words, max_len) cut_list_rmm = rmm(text, words, max_len) ''' 任务2:在此处实现双向匹配 1.单词更少 2.单词数相同,选单字数更少的 3.词数和单字数相同,返回你像匹配结果 ''' # 词典存放路径 path = './datasets/mini.txt' ## 需要更改词典路径 # 进行分词 txt = '项目的研究商品和服务研究生命起源当下雨天地面积水结婚的和尚未结婚的欢迎新老师生前来就餐' ##在输入文本中添加自己的学号和姓名 words, max_len = get_words(path) fmm_list = fmm(txt, words, max_len) rmm_list = rmm(txt, words, max_len) bi_mm_list = bi_mm(txt, words, max_len) # 查看分词结果 print("原文本:{}\n正向最大匹配分词结果:{}\n逆向最大匹配分词结果:{}\n双向最大匹配分词结果:{}\n".format(txt,fmm_list,rmm_list,bi_mm_list)) ''' 任务3:实现对上述文本的词性标注 ''' import jieba ''' 任务4:使用jieba分词的三种模式实现对上述文本的分词 ''' 请完成任务1,2,3,4
最新发布
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值