基于理解的分词方法
其基本思想是在分词的同时进行句法、语义的分析,以此来处理歧义问题。
目前这种方法还处于实验状态
基于统计的分词方法
基本思路
构建语言模型,对句子进行单词划分,划分结果运用统计方法计算概率,获取概率最大的分词方式
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();//删掉这个词
}
}
与词性标注结合
这种方法的基本思想是在考虑分词结果的概率的同时,还要考虑词性,自然语言的词性搭配是有规律的,将分词结果的词性搭配的概率也进行比较,从而反过来调整分词,可极大的提高结果的准确性。