中文分词之正向最大匹配算法

中文分词目前可以分为“规则分词”,“统计分词”,“混合分词(规则+统计)”这三个主要流派。这次介绍下基于规则的分词,其是一种机械的分词方法,主要通过维护词典,在切分语句时,将语句的每个字符串与词表中的词逐一进行匹配,找到则切分,否则不予切分。

正向最大匹配算法:这里需要知道两点,一个是分词词典(也即是已经分词过的词典),另一个是需要被分词的文档。假定分词词典中的最长词有 i 个汉子字符串,则用被处理文档的当前字符串中的前 i 个字作为匹配字段,查找字典。若此时分词词典中存在这样一个字符串,则匹配成功,而此时被匹配的字段切分出来。如果匹配失败,将匹配字段中的最后一个字去掉,对此时剩下的字串重新与分词词典进行匹配,如此下去直到匹配成功。也即是切分出一个词或剩余字串的长度为零为止,这个时候才是匹配了一轮,接着进行下一个 i 字字串的匹配,方法同上,直到文档被扫描完为止。

正向最大匹配算法的原理比较简单,也没有用到机器学习和概率论,统计的一些知识,下面贴出代码:

# 定义逆向最大匹配类
class IMM(object):

    # 初始化得到给定的字典中的所有词和长度最大的词
    def __init__(self, dic_path):
        self.dictionary = set()
        self.maximum = 0
        #读取词典
        with open(dic_path, 'r', encoding='utf8') as f:
            for line in f:
                # strip():只能删除开头或是结尾的字符,不能删除中间部分的字符
                line = line.strip()
                print('line:',line)
                if not line:
                    continue
                self.dictionary.add(line)
                if len(line)>=self.maximum:
                    self.maximum = len(line)

            print('self.dictionary:',self.dictionary,'\n','self.maximum:',self.maximum) 

    # 该方法可切分新得到的词组    
    def cut(self, text):
        result = []
        index = len(text)
        print('index:',index)
        while index > 0:
            word = None
            for size in range(self.maximum, 0, -1):
                if index - size < 0:
                    continue
                print('index - size=>',index - size,':',index)
                piece = text[(index - size):index]
                print('piece:',piece)
                # 判断该词是否在词典中
                if piece in self.dictionary:
                    word = piece
                    result.append(word)
                    index -= size
                    break
            if word is None:
                index -= 1
        return result[::-1]

def main():
    text = "南京市长江大桥"
    # 词典的地址
    tokenizer = IMM(r'./imm_dic.utf8')
    print(tokenizer.cut(text))

main()

运行结果:

line: 南京市
line: 南京市长
line: 长江大桥
line: 人名解放军
line: 大桥
self.dictionary: {'人名解放军', '长江大桥', '大桥', '南京市长', '南京市'} 
 self.maximum: 5
index: 7
index - size=> 2 : 7
piece: 市长江大桥
index - size=> 3 : 7
piece: 长江大桥
index - size=> 0 : 3
piece: 南京市
['南京市', '长江大桥']

而且这里的分词词典是自己定义好的,作为简单的demo学习一下。

参考:《pytho自然语言处理实战 核心技术与算法》

猜你喜欢

转载自blog.csdn.net/lilong117194/article/details/81113171