自然语言的分词方法之N-gram语言模型

也许更好的阅读体验

基于理解的分词方法

其基本思想是在分词的同时进行句法、语义的分析,以此来处理歧义问题。

目前这种方法还处于实验状态

基于统计的分词方法

基本思路

构建语言模型,对句子进行单词划分,划分结果运用统计方法计算概率,获取概率最大的分词方式

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();//删掉这个词
		}
}

与词性标注结合

这种方法的基本思想是在考虑分词结果的概率的同时,还要考虑词性,自然语言的词性搭配是有规律的,将分词结果的词性搭配的概率也进行比较,从而反过来调整分词,可极大的提高结果的准确性。

原文地址:https://www.cnblogs.com/Morning-Glory/p/15433135.html