自然语言的分词方法之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();//删掉这个词
		}
}

与词性标注结合

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

上一篇:n-gram


下一篇:使用Fasttext与卷积进行情感分析