...

Callwoola

大雄'blog

Home 主页 Blog 博客 Tag标签 GitHub开源 about me关于我


中文分词技术 常用算法

我们讨论的分词算法可分为三大类:

基于词典分词

逐词遍历法将词典中的所有词按由长到短的顺序在文章中逐字搜索, 直至文章结束。也就是说,不管文章有多短,词典有多大, 都要将词典遍历一遍。这种方法效率比较低, 大一点的系统一般都不使用。

基于字典、词库匹配的分词方法(机械分词法):

这种方法按照一定策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配, 若在词典中找到某个字符串,则匹配成功。识别出一个词,根据扫描方向的不同分为正向匹配和逆向匹配。 根据不同长度优先匹配的情况,分为最大(最长)匹配和最小(最短)匹配。根据与词性标注过程是否相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的方法如下:

最大正向匹配法 (MM, Maximum Matching Method)

通常简称为MM法。其基本思想为: 假定分词词典中的最长词有i个汉字字符, 则用被处理文档的当前字串中的前i个字作为匹配字段, 查找字典。若字典中存在这样的一个i字词,则匹配成功, 匹配字段被作为一个词切分出来。

如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉, 对剩下的字串重新进行匹配处理…… 如此进行下去,直到匹配成功, 即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。

其算法描述如下:

algorithm:


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
        # 找到并不抛出 字符串 ,只是让cur累加
        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

逆向最大匹配法 (Reverse Maximum Matching Method)

通常简称为RMM法。RMM法的基本原理与MM法相同 ,不同的是分词切分的方向与MM法相反,而且使用的分词辞典也不同。

逆向最大匹配法从被处理文档的末端开始匹配扫描,每次取最末端的2i个字符(i字字串)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应地,

它使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。

由于汉语中偏正结构较多(汉字特性),若从后向前匹配,可以适当提高精确度。

所以,逆向最大匹配法比正向最大匹配法的误差要小。统计结果表明 ,

例如切分字段“硕士研究生产”,正向最大匹配法的结果会是“硕士研究生 / 产”, 而逆向最大匹配法利用逆向扫描,可得到正确的分词结果“硕士 / 研究 / 生产”。

algorithm:

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

RMM, MM 合并使用

当然,最大匹配算法是一种基于分词词典的机械分词法,不能根据文档上下文的语义特征来切分词语, 对词典的依赖性较大,所以在实际使用时,难免会造成一些分词错误,为了提高系统分词的准确度,

可以采用正向最大匹配法和逆向最大匹配法相结合的分词方案(见“双向匹配法”)

最少切分法

使每一句中切出的词数最小。

双向匹配法

将正向最大匹配法与逆向最大匹配法组合。先根据标点对文档进行粗切分,把文档分解成若干个句子,然后再对这些句子用正向最大匹配法和逆向最大匹配法进行扫描切分。如果两种分词方法得到的匹配结果相同,则认为分词正确,否则,按最小集处理。

全切分、基于词的频度统计(无字典分词)

隐马尔可夫模型(Hidden Markov Model,HMM)

基于统计分词(无字典分词) 基于机器学习

该方法主要基于句法、语法分析,并结合语义分析, 通过对上下文内容所提供信息的分析对词进行定界, 它通常包括三个部分:

  • 文档信息:
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 发表日期: 2017-10-3111:15:32+0800
  • 更多内容:
  • Feed订阅:
相关内容:

disqus评论区:

0