基于理解的分词方法
其基本思想是在分词的同时进行句法、语义的分析,以此来处理歧义问题。
目前这种方法还处于实验状态
基于统计的分词方法
基本思路
构建语言模型,对句子进行单词划分,划分结果运用统计方法计算概率,获取概率最大的分词方式
N元语言模型(N-gram语言模型)
设(z)为字串,(w)为划分的词串,(s)是一种划分。该分词方法是以(p(s))最大的分词结果作为结果。
由于每个词的概率都十分小,对于较长的字串,得到的每个结果的概率可能十分接近于0,计算机精度不够,会影响概率的比较,可通过比较概率的负对数来比较大小。
这种方法可发现所有的切分歧义,它的成功率很大程度取决于统计语言模型的精度和决策算法。
概率怎么得到,肯定是要有样本的,如果可以的话,以人类有史以来所有说过的话作为样本肯定是最好的,但这不可能实现。
对于(p(s)),根据条件概率公式,有(p(s)=p(w_1)p(w_2|w_1)cdots p(w_n|w_{n-1},w_{n-2},cdots w_1))
这种计算方法对算力要求太高,对训练数据要求十分大,不太可能实现,因此考虑建立模型。
马尔可夫假设
俄国数学家马尔可夫提出假设:任意一个词(w_i)出现的概率只同它前面的一个词(w_{i-1})有关,这种假设称为马尔可夫假设。
即(p(s)=p(w_1)p(w_2|w_1)cdots p(w_n|w_{n-1}))
这样求的方法就简单多了。
而当我们假设(w_i)出现的概率和它前面的(n)个词有关,就被称为(n)元语言模型
代码思路
用(DFS)不难实现,首先找到一个可行的划分,再计算概率,保存最大概率的结果,(DFS)途中可适当剪枝。
//代码框架
void _find (int cur)//找划分,cur表示当前为第几个词
{
if (cur==n+1) calc();//对当前结果计算概率并保存
for (int i=cur;i<=n;++i)
if (check(cur,i)){//如果从cur到i形成一个词
add(cur,i);//将该词添加到当前划分
_find(i+1);
del();//删掉这个词
}
}
与词性标注结合
这种方法的基本思想是在考虑分词结果的概率的同时,还要考虑词性,自然语言的词性搭配是有规律的,将分词结果的词性搭配的概率也进行比较,从而反过来调整分词,可极大的提高结果的准确性。