自然语言处理之NGram模型

Native Bayes

我们首先考虑在原始的数学模型中,我们怎么分析一句话的语义信息呢?我们来举个例子

澳门赌场日赚百万

这是垃圾短信的其中一句话,如果我们想训练一个模型来识别所有的垃圾短信,会是怎么样的抽象呢?

由条件独立性假设:

p(澳门赌场日赚百万∣J)=p(澳,门,赌,场,日,赚,百,万∣J)=p(澳∣J)p(门∣J)p(赌∣J)p(场∣J)p(日∣J)p(赚∣J)p(百∣J)p(万∣J)

上面每一项条件概率都可以通过在训练数据的垃圾短信中统计每个字出现的次数得到,因为我们仅仅考虑了字的出现次数和分类的关系,但是语序的特征却完全丢失啦。

也就是会出现如下奇怪的现象。

小王欠小吕1000元=小吕欠小王1000元

我们当然不愿意了。难道就没有考虑语序的方法吗?当然有,这就是我们要讲的N-Gram模型要解决的。

N-Gram

我们可以举一个例子来说明n-gram的基本思想,我们提到李嘉诚,肯定首先想到的首富,而不是穷鬼,提到怕上火首先想到的是王老吉而不是可口可乐,而N-Gram就是这样的思想。常用的有 Bi-gram (N=2) 和 Tri-gram (N=3)。

说到这里我们就可以举个例子来讲讲N-Gram是如何使用的。一个老生常谈的例子就是我们有一个句子序列$S=(w_1,w_2,...,w_n)$。

$$p(s)=p(w_1,w_2,...,w_n)=p(w_1)p(w_2|w_1),.. \ tag{1.1}$$

我们能做这个$p(s)$的数据吗?可能会遇到几个问题。

  • 参数空间太大
  • 数据稀疏严重

为了解决第一个问题,我们引入马尔科夫假设(Markov Assumption)一个词的出现仅与它之前的若干个词有关。也就是有限的看几个邻居。

如何计算其中的每一项条件概率?当然是使用极大似然估计,其实就是统计频数。

$$P(w_n|w_{n-1})=\frac{C(w_{n-1},w_{n})}{C(w_{n-1})} \tag{1.2}$$

$$P(w_n|w_{n-1}w_{n-2})=\frac{C(w_{n-2},w_{n-1},w_{n})}{C(w_{n-1},w_{n-2})}\tag{1.3}$$

以Bi-gram为例,我们有这样一个由三句话组成的语料库:

<s> I am Sam <e>
<s> Sam I am <e>
<e> I do not like egg and meat <e>

$$P(am | I)=\frac{2}{3}$$

因为" I" 出现了3次,而"I am" 出现两次.这样就能计算出现过的词的所有的概率。

N-Gram 的用途

N-Gram这一顿操作猛如虎,然后咋用呢,感觉没啥用呀?

词性标注

例如『爱』这个词即能作为动词,也能作为名词,如果我们出现一句语料为『我爱中国』

我们就是可以使用上面这个方法来给『爱』这个字标注词性。

$$p(词性|我的词性,爱)=\frac{前面是名词的爱作为词性_i的出现次数}{前面是名词的爱"的出现次数}\tag{1.4}$$

从而选择概率较大的。

垃圾短信标注

就如文章开头列举的例子,判断某些敏感词在垃圾短信中出现的次数和词序,决定是否为垃圾短信。

分词

例如,X 表示有待分词的句子,$Y_i$表示其中一种的分词方案。

X="我爱深度学习"

$$Y_1={"我","爱深","度学习"}$$

$$Y_2={"我爱","深","度学","习"}$$

$$Y_3={"我","爱","深度学习"}$$

$$p(Y_1)=p(我)p(爱深|我)p(度学习∣爱深)$$

$$p(Y_2)=p(我爱)p(深∣我爱)p(度学∣深)p(习∣度学)$$

$$p(Y_3)=p(我)p(爱∣我)p(深度学习∣爱)$$

从而选择出现概率最好的分词方法。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×