中文分词-前向最大匹配算法

引言

本文及下篇将讲解中文自然语言处理的第一项核心技术:中文分词技术。中文不同英文,英文句子有天生的分词效果,所以在做中文语言处理的的时候需要做分词。

在语言理解中,词是最小的能够独立活动的有意义的语言成分,将词确定下来是理解自然语言的第一步。

规则分词

基于规则的分词是一种机械自动化的分词方法,主要通过维护词典,在切分语句的时候,将语句的每一个字符串与词表中的词匹配,主要有正向最大匹配算法逆向最大匹配算法双向最大匹配算法

本文将重点讲,正向最大匹配算法

正向最大匹配算法

基本思想

假设分词词典V中的最长词组合有i个汉字字符,即长度为i,则在处理句子L时的当前字符串的前i个字作为待匹配字段S。若S∈V,则匹配成功,将S作为一个词切分出来。如果匹配失败,将S的最后一个字去掉,得到S1,继续匹配。如此进行下去,直到L的长度为0

算法描述

  1. 从左向右取待切分的句子的m个字符作为匹配字串,其中m为词典中最长词条字符数
  2. 查找词典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)

 上一篇
中文分词-逆向最大匹配算法 中文分词-逆向最大匹配算法
基本思想从处理文档的最末端开始匹配扫描,每次取最末端的i个字符,其中i是字典最长的词数,若匹配失败,则去掉最前面的第一个字,继续匹配。 python实现RMM类 """ @author: Alex @contact: 1272296763@
2019-09-14
下一篇 
矩阵变化在图形学的应用 矩阵变化在图形学的应用
前言本文重在讲线性代数中矩阵变化对图形变化的作用,将使用python来实现,这里的矩阵类Matrix是自己实现的类,也可以实现numpy的矩阵类 矩阵变化对图形变化的作用1.缩放1.1.数学原理数学原理:已知变化矩阵T为:$$T = \be
2019-09-04
  目录