引言
本文及下篇将讲解中文自然语言处理的第一项核心技术:中文分词技术。中文不同英文,英文句子有天生的分词效果,所以在做中文语言处理的的时候需要做分词。
在语言理解中,词是最小的能够独立活动的有意义的语言成分,将词确定下来是理解自然语言的第一步。
规则分词
基于规则的分词是一种机械自动化的分词方法,主要通过维护词典,在切分语句的时候,将语句的每一个字符串与词表中的词匹配,主要有正向最大匹配算法,逆向最大匹配算法和双向最大匹配算法
本文将重点讲,正向最大匹配算法
正向最大匹配算法
基本思想
假设分词词典V中的最长词组合有i个汉字字符,即长度为i,则在处理句子L时的当前字符串的前i个字作为待匹配字段S。若S∈V,则匹配成功,将S作为一个词切分出来。如果匹配失败,将S的最后一个字去掉,得到S1,继续匹配。如此进行下去,直到L的长度为0
算法描述
- 从左向右取待切分的句子的m个字符作为匹配字串,其中m为词典中最长词条字符数
- 查找词典V并匹配,若匹配成功,将这个匹配字串作为一个词切分出来。不成功将匹配最后一个字去掉,剩下的字符串作为新的匹配字串,进行再次匹配,重复以上过程,直到扫描完
python实现
实现MM分词类,主要函数cut(注意这里的有个私有变量_simple_num是为后面的双向最大匹配做准备的)
"""
@author: Alex
@contact: 1272296763@qq.com or jakinmili@gmail.com
@file: max_Match.py
@time: 2019/9/14 19:02
"""
class MM:
def __init__(self, window_size=3):
self.window_size = window_size # 窗口大小
self._simple_num = 0 # 分词后单字数量
def cut(self, text):
# 分词后的结果list
result = []
index = 0
# 前向最大匹配算法核心
dict = [
"研究", "研究生", "生命", "命", "的", "起源"
]
piece=''
while len(text) > index:
for size in range(self.window_size+index,index,-1):
piece = text[index:size]
if piece in dict:
if size - index == 1:
self._simple_num += 1
index = size-1
result.append(piece)
break
index = index+1
return result
运行:
text = '研究生命的起源'
tokenizer = MM()
result = tokenizer.cut(text)
print(result)