【自然语言处理】分词方法汇总

一、关于分词

    原则

  • 颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”、“公安局 长”、“公安局长”都算对,但是要用于语义分析,则“公安局长”的分词结果最好
  • 切分结果中非词典词越少越好,单字字典词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字字典词”指的是可以独立运用的单字,如“的”、“了”、“和”、“你”、“我”、“他”。例如:“技术和服务”,可以分为“技术 和服 务”以及“技术 和 服务”,但“务”字无法独立成词(即词典中没有),但“和”字可以单独成词(词典中要包含),因此“技术 和服 务”有1个非词典词,而“技术 和 服务”有0个非词典词,因此选用后者
  • 总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。

二、分词算法

1、基于词典的方法

  1. 正向最大匹配法

给定一个词的最大长度,以该长度进行切分,看看切出来的词是否在词典中出现,如果出现的话,该词就是切词的结果,否则缩短词的长度。

2. 逆向最大匹配法

同正向一样,只不过是从后往前进行。

3、双向最大匹配

先进行一次正向最大匹配,得到正向的分词结果,然后在进行一次反向最大匹配,得到反向的分词结果

返回长度最小的结果

2、基于HMM的分词

    关于HMM

    这是一个预测问题,预测隐藏序列。 状态序列集合为 {S, B, M, E}, 观测序列就是待切分的句子,要求就是预测这个句子的每个单词的状态,最后根据状态进行切词。

  • 首先要获取 状态转移矩阵 和 发射矩阵, 这个可以根据训练集统计得到,也就是 每个状态之间转移的概率和每个状态产生该词概率,以及最初的状态(就是每个状态在句首的概率)
  • 然后就可以用Vertibi算法进行预测了

    从最初状态开始,求这四个状态分别可以产生 第一个字符串的概率,并记录每个状态下的概率

    判断第二个字符,首先由上一个时间状态下的状态 转移到当前时间状态, 并且取当前时间下每个状态能得到当前位置字符概率最大的那个,然后在记录一下上一个状态

    一直到最后...

   最后根据 状态序列进行分词

3、基于N-gram的分词(2-gram)

 2-gram语言模型是对于一个句子‘ABCD‘,他的概率为:P(ABCD) = P(A|S) * P(B|A) * P(C|B) * P(D|C)

    对句子中每一个位置的进行如下操作:

     遍历所有以该位置为结尾的词(词的长度有限制),找到该词之后在往前找到前一个词,这两个词就形成了一个切分结果,然后求所有的切分结果中概率最大值 

 

源码:https://github.com/liuhuanyong/WordSegment

posted @ 2018-11-19 15:42  zhaop  阅读(1460)  评论(0编辑  收藏  举报