基于规则的分词算法(MM RMM算法)及python代码实现

一、理论描述

  中文分词指的是将一个汉字序列切分成一个一个单独的词。现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。其中,基于字符串匹配的分词方法是按照一定的策略将待分析的汉字串与机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,基于字符串匹配的分词方法可以分为正向最大匹配算法(Maximum Matching,下面简称MM)和逆向最大匹配算法(Reverse Maximum Matching,下面简称RMM)。
  本分词系统只是一个简单的演示程序,简单地根据语料库的信息,利用“正向最大匹配”、“逆向最大匹配算法”将一小段文字进行分词。

二、算法描述

➢  正向最大匹配算法(MM):按照人得而自然阅读顺序从左往右对一段话甚至文章进行词库匹配切分。
设MaxLen为最大词长,D为分词词典
(1)从待切分语料中按正向取长度为MaxLen的字符串str,令Len =MaxLen;
(2)将str与D中的词语互相匹配;
(3)if匹配成功,将指针向前移Len个汉字,并返回到(1);
(4)if 不成功:
    if( Len>1):
      Len = Len-1;
      从待切分语料中取长度为Len的字符串str,并返回(2);
    else:
      得到单个汉字,指针向前移一个汉字,并返回(1)

➢  逆向最大匹配算法(RMM):主要原理与正向最大匹配算法一致,只是切分方向相反,从文章的尾部开始匹配。

三、python 代码实现

MM算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def mm_cut(self, sentence='', max_len=6):
"""
使用正向最大匹配法划分词语
:param sentence: str 待划分句子
:param max_len: int 最大词长 默认为6
:return: str-list 已分词的字符串列表
"""
sentence = sentence.decode('utf-8')
cur = 0 # 表示分词的位置
sen_len = sentence.__len__() # 句子的长度
word_list = [] # 划分的结果
while cur < sen_len:
l = None
for l in range(max_len, 0, -1):
if sentence[cur: cur+l] in self.word_set:
break
word_list.append(sentence[cur: cur+l])
cur += l
return word_list

RMM算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def rmm_cut(self, sentence='', max_len=6):
"""
使用逆向最大匹配法划分词语
:param sentence: str 待划分句子
:param max_len: int 最大词长 默认为6
:return: str-list 已分词的字符串列表
"""
sentence = sentence.decode('utf-8')
sen_len = sentence.__len__() # 句子的长度
cur = sen_len # 表示分词的位置
word_list = [] # 划分的结果
while cur > 0:
l = None
if max_len > cur:
max_len = cur
for l in range(max_len, 0, -1):
if sentence[cur-l: cur] in self.word_set:
break
word_list.insert(0, sentence[cur-l: cur])
cur -= l
return word_list

软件示意图
软件示意图

源码下载

Have a nice day!