1:分词技术
1.1:规则分词
基于规则的分词是一种机械分词的方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不切分。
1.1.1 正向最大匹配法
正向最大匹配法(Maximum Match Method,MM法)的基本思想:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前子串中的前i个字作为匹配字段,查找字典。如果字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理。如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为0为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。
算法描述:
1:从左向右取待切分汉语句的m个字符作为匹配字段,m为机器词典中最长词条的字符数。
2:查找机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程明知道切分出所有词为止。
例如:
现在有个词典,最长词的长度是5,词典中有“南京市长”和“长江大桥”两个词。
现对“南京市长江大桥”
正向最大匹配法结果:“南京市长”,“江”,“大桥”
示例代码:
class MM(object):
def __init__(self):
self.window_size = 3
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): # 4,0,-1
piece = text[index:size]
if piece in dic:
index = size - 1
break
index = index + 1
result.append(piece + '----')
print(result)
if __name__ == '__main__':
text = '研究生命的起源真牛皮车呀'
tokenizer = MM()
print(tokenizer.cut(text))
输出结果:
['研究生----', '命----', '的----', '起源----', '真----', '牛皮----', '车----', '呀----']
如此可看结果并不能让人很满意。
1.1.2 逆向最大匹配法
逆向最大匹配法(Reverse Maximum Match Method,RMM法)原理:基本原理与MM法相同,不同的是分词切分的方向与MM法相反。
现对“南京市长江大桥”进行逆向最大匹配法,结果:“南京市”,“长江大桥”。
这样的结果看似是对的,但是如果是 南京的市长 姓名是 "江大桥" 呢?这样分词 还是不对的。
示例代码:
class RMM(object):
def __init__(self):
self.window_size = 3