一、关于分词
原则:
- 颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”、“公安局 长”、“公安局长”都算对,但是要用于语义分析,则“公安局长”的分词结果最好
- 切分结果中非词典词越少越好,单字字典词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字字典词”指的是可以独立运用的单字,如“的”、“了”、“和”、“你”、“我”、“他”。例如:“技术和服务”,可以分为“技术 和服 务”以及“技术 和 服务”,但“务”字无法独立成词(即词典中没有),但“和”字可以单独成词(词典中要包含),因此“技术 和服 务”有1个非词典词,而“技术 和 服务”有0个非词典词,因此选用后者
- 总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。
二、分词算法
1、基于词典的方法
- 正向最大匹配法
给定一个词的最大长度,以该长度进行切分,看看切出来的词是否在词典中出现,如果出现的话,该词就是切词的结果,否则缩短词的长度。
2. 逆向最大匹配法
同正向一样,只不过是从后往前进行。
3、双向最大匹配
先进行一次正向最大匹配,得到正向的分词结果,然后在进行一次反向最大匹配,得到反向的分词结果
返回长度最小的结果
2、基于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)
对句子中每一个位置的进行如下操作:
遍历所有以该位置为结尾的词(词的长度有限制),找到该词之后在往前找到前一个词,这两个词就形成了一个切分结果,然后求所有的切分结果中概率最大值