欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

中文分词技术--规则分词

程序员文章站 2024-02-22 11:26:28
...

规则分词一般有正向最大匹配法,逆向最大匹配法和双向最大匹配法

       

  • 正向最大分词法(Maximum Match Method,MM法)

基本思想:假定分词词典中最长词有i个字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。若字典中存在这样一个词,则匹配成功,匹配字段被作为一个词被切分出来。如果字典中找不到这样一个词,则匹配失败,将匹配字段的最后一个字去掉,对剩下的字串重复上述步骤,如此直到匹配成功。这样就完成一轮匹配,继续选取下一个i字词,进行匹配。

例:

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):
                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))

       

  •  逆向最大匹配法(Reverse Maximum Match Method, RMM法)

其基本原理与MM法相同,不同的是分词的切分方向与MM法相反。逆向最大匹配法从被处理文档的末端开始扫描匹配,每次去最末端的i个字符作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应的,其使用的字典为逆序字典,其中的每个词条都按照逆序方式存放。在实际处理时,先将文档进行逆序处理,生成逆序文档,然后根据词典进行切分。由于汉语的偏正结构较多,所以从后向前匹配可以提高精确度,误差更小。

例:

class RMM(object):
    def __init__(self):
        self.window_size = 3
    def cut(self,text):
        result=[]
        index = len(text)
        dic = ['在','事故','中','失踪','的','士兵','已经','死亡']
        while index > 0:
            for size in range(index-self.window_size,index):
                piece = text[size:index]
                if piece in dic:
                    index = size+1
                    break
            index = index-1
            result.append(piece+'----')
        result.reverse()
        print(result)
if  __name__  == '__main__':
    text ='在事故中失踪的士兵已经死亡'
    tokenizer = RMM()
print(tokenizer.cut(text))
  • 双向最大匹配法(Bi-directction Matching method

它将正向最大匹配法的结果和逆向最大匹配法的结果作比较,按照最大匹配原则,选取词数切分最少的作为结果,规则如下:

(1)如果正反向分词结果次数不同,测选取分词数量较少的那个

(2)如果分词词数相同:1)分词结果相同,则说明没有歧义,返回任意一个结果    2)分词结果不同,返回其中单字较少的那个。

总结:基于规则的分词较为简单高效,但是词典的维护很麻烦,如今网络新词出现很快,很难覆盖所有的词。