共计 4546 个字符,预计需要花费 12 分钟才能阅读完成。
文章来自公众号:【机器学习炼丹术】
N-gram 语言模型
N-gram 是一种语言模型(Language model,这个前面讲),是一种概率模型。这个模型输出的是一个句子,输入的是一个概率(看完就懂这个是什么概率了)。
I love deep learning 中如果给出 l love () learning. 那么地面填入 deep 的概率就比填入 apple 的概率大。假如有这样一个句子,I love deep learning,用
$w_1$ 示意I,
用 $w_2$ 示意 love,
用 $w_3$ 示意 deep,
用 $w_4$ 示意 learn,
那么:$p(i love deep learning)=p(w_1,w_2,w_3,w_4)=p(w_1)p(w_2|w_1)p(w_3|w_2,w_1)p(w_4|w_3,w_2,w_1)$ 很好了解,就是第一个词是 I 的概率,而后乘上已知第一个词是 I 第二个词是 love 的概率……整个下来就是这个句子的概率。直观来看,如果这个句子越常见、越天然,那么这个句子的概率就会更大。
那么怎么算这个 $p(w_2|w_1)$ 的概率呢? 其实就是统计你的文本数据库中有多少个 I love 这个组合呈现,而后除以 I 的数量(大略是这样,然而具体会有不同前面说),总之就是 I love 呈现的次数越多,$p(love|I)$ 越大。
然而这个公式是有两个问题:
- 参数空间过大。假如这个句子十分的长,那么第 n 个词就要基于后面 n - 1 个词计算概率,参数是 n -1,太多了。
- 数据过于稠密。简略的说就是并不是所有的词的组合都会呈现,万一本文数据库中就刚好有某一个组合没有呈现过,那么这个组合对应的概率就是 0,这个句子的概率因为有一个因子是 0,乘起来还是 0 就不好了。
为了解决第一个问题 :
引入 马尔可夫假如:模型的以后状态仅仅依赖于后面的几个状态。
这个假如简化了模型,缩小的参数,假如仅仅依赖于后面两个状态的话,那么第 n 个词就只用基于后面的 n - 1 和 n - 2 个词,而不是从 1 到 n - 1 所有的词,参数升高。
依据这个依赖数量,n-gram 能够分为:
- Bi-gram:仅仅依赖后面一个词,例如:$p(i)p(love|i)p(deep|love)p(learning|deep)$,bi 这个英文前缀,示意两个,所以,这里其实就是“I love”、“love deep”、“deep learning”这样两单词的组合的意思;
- Tri-gram:tri 示意 3 个的意思,所以就是以来后面两个词,变成了 $p(i)p(love|i)p(deep|i,love)p(learning|deep,love)$
-
这里也能够领会到 n -gram 中的 n 是一个什么含意。当然也能够弄个 4 -gram 然而罕用的就是 2 和 3。
这里举个例子:
- <sos> i love deep learning <eos>
- <sos> deep learning I love <eos>
- <sos>I want apple <eos>
这三句话就是咱们的全副文本数据库了,咱们想要失去 $p(love|i)$ 的概率,那么就是文本中 i 呈现的次数,3 次,i love呈现了两次,那么这个概率就是 $2/3$. 这里多了一个 sos 示意句子的开始 start of sentence,eos 就是 end of sentent 句子的完结。所以这里的 i 的概率其实不是 $p(i)$, 而是 $p(i|sos)$。
-
Unigran:这是一个可能据说过,然而不怎么用的模型。就是每个单词独自思考,齐全不思考单词之间的组合的一个模型。每一个单子本身就是独立的,用下面的例子就是:$p(i)p(love)p(deep)(learning)$,这个句子与 deep learning love i 在 Unigram 模型下没有区别。这里要再提到一个概念 bag of word(BOW) 词袋模型,这个模型其实就是 Unigram 一样,不思考单词的程序,只思考单词的频率。举个例子来了解这个模型:
- I love deep learning.
- I love deep learning and machine learning.
这两句话就是咱们的所有的文本数据库,业余一点叫做语料库(corpus),就是咱们的文本数据库。而后从语料库 corpus 中,找到所有呈现的单词,而后做出一个词汇表 vocabulary,在这个例子中咱们的 vocabulary 就是:{i:0,love:1,deep:2,learning:3,and:4,machine:5}
那么,依据 BOW 模型,第一个句子用 BOW 示意就是:[1,1,1,1,0,0], 第二个句子就是:[1,1,1,2,1,1]这个就是示意对应单词呈现的频率,跟单词在句子中什么地位呈现的没有关系。(值得注意的是 BOW 当初曾经不怎么用在 NLP 中了,而是图像处理中,然而用的也比拟少,以理解为主)
这样的模型能够做什么呢?
- 词性标注:
love 能够示意名词,也能够示意动词。对数据库中所有的单词进行词性标注,而后判断 I love 的 love 是一个什么词性,就用 n -gram 模型:$p(动词 | I 的词性,love)=\frac{前一个词是代词,love 是动词的组合的数量}{后面一个词是代词,不论 love 是什么词性的组合的数量}$
- 文本类别判断之是否是垃圾邮件:
数据库中有垃圾邮件和非垃圾邮件,而后依据模型能够晓得垃圾邮件中有什么词组,比方:大甩卖、滞销这样的词汇。而后在依据这些内容,计算一个文本是否是垃圾邮件的概率。(这里讲的不粗疏,晓得能够做这个就行了)
- 文本主题的剖析。这个关键在于寻找同义词,同义词的英文是(synonyms);
- 也能够做情感剖析。常常用在电影评论下面,判断一个评论是侧面评论(Positive)还是负面评论(Negtive),还是中立的(neutral)。也能够把文本细分成了六个情感类型:愤恨(Anger),讨厌(Disgust),恐怖(Fear),喜悦(Joy),悲伤(Sadness),惊喜(Surprise)
奢侈贝叶斯
目前为止,读者应该能了解 n -gram 模型了,其中有 unigram,bi-gram 和 tri-gram。而后 unigram 又提到了 BOW 模型作为理解。那么语言模型是什么货色呢?其实语言模型就是基于 奢侈贝叶斯 (naïve Bayesian) 的一个概率模型。
先简略说一下贝叶斯公式吧,这是啥公式:$P(B|A)=\frac{P(A|B)P(B)}{P(A)}$
或者能够写成这个样子:$P(A,B)=P(A|B)P(B)=P(B|A)P(A)$
而后 贝叶斯定理 解决的问题就是:已知 $P(B|A)$ 怎么失去 $P(A|B)$,这个其实很有用。就用下面的辨认垃圾邮件作为例子,A 就是{垃圾邮件,不是垃圾邮件},B 就是邮件中的信息,想到依据信息来判断是否是垃圾邮件的概率这个比拟难,所以就变成了:$P(是垃圾邮件 | 信息)=\frac{P(信息 | 是垃圾邮件)P(是垃圾邮件)}{P(信息)}$ 用一个简略的例子,假如这个信息是这样一句话:日赚百万。咱们能够去找垃圾邮件中“日赚百万”这个句子呈现的概率,而后再依据所有语料库中垃圾邮件的比例,失去这个概率。至于分母的 $P(信息)$ 咱们能够省略,为什么呢?因为最初咱们要找到的是 $P(是垃圾邮件 | 信息)$ 和 $P(不是垃圾邮件 | 信息)$ 之间的概率,两者的分子雷同,所以能够省略。好比 1 和 1 的概率就是 50% 和 50%,那么 10 和 10 的概率也是 50% 和 50%。
所以依据这个原理,咱们把之前抉择概率高的,改成抉择打分高的。什么意思呢?之前可能是 0.3,0.7,抉择 0.7 这个类别。当初变成 3,7,抉择 7 这个类别。所做的改变就是把分母去掉就行了:$Score(B|A)=P(A|B)P(B)$
那么什么是 naive Beyesian 呢?咱们曾经讲完了,奢侈贝叶斯是一种分类算法,思维就是求解在某个条件下,各个类别呈现的概率,哪一个最大,就抉择哪个类别。在下面的例子中,求解“日赚百万”这个信息下,邮件是“垃圾邮件”还是”不是垃圾邮件“这两个类别的概率,而后概率大的哪一个就是这个文本的类别。
所以 奢侈贝叶斯分类器 的公式能够写成:$c^* = argmax_{c}{P(c|a_1,a_2,…,a_n)}= argmax_{c}{P(a_1,a_2,…,a_n|c)P(c)}$
- 其中 $c^*$ 就是最终判断的类别,而后 c 是所有类别中的一种,在下面的例子中,c 就是”是垃圾邮件”或者“不是垃圾邮件”,其中的 a 就是已知的所有信息。
- 到这里,就能够把语言模型和 n -gram 辨别开了,奢侈贝叶斯分类器就是语言模型的根底,设想一个垃圾邮件,应该是有一段话的,不会光有四个字“日赚百万”。那么 $a_1$ 就是这段话的第一个句子,而后 $a_2$ 就是第二个句子。这就是一种语言模型。当然,用整个句子的话,能够是能够,然而不好(前面会说为什么不好)。假如咱们这里的 $a_1$ 是一个词,而后 $a_2$ 是另外一个词,这样的话,就过渡到了之前讲的 n -gram 模型了。
奢侈贝叶斯是基于一个假如的:已知信息 a 之间互相条件独立 :
就是假如上面的公式是成立的:$P(a_1,a_2,…,a_n|c)=P(a_1|c)P(a_2|c)…P(a_n|c)=\prod_{i=1}^n{P(a_i|c)}$
而后把这个假如带到下面奢侈贝叶斯分类器的公式中,就能够失去:$c^*=argmax{P(c)\prod_{i=1}^n{P(a_i|c)}}$ 这个公式就是提到语言模型肯定会看到的公式。当初回到之前的一个问题,为什么句子不好。假如 a 是个句子,那么 $P(a_i|c)$ 示意什么含意?示意在你的语料库中,这个句子呈现的此时。一个句子一摸一样呈现的次数能有几次?同样的含意能够用不同的句子说进去,所以如果用句子的话,这个 $P(a_i|c)$ 大概率是 0。因而,应用词组,应用 n -gram 的办法会更加有实际意义。
做一个小结 :
在 NLP 中假如提到了语言模型,请想到 n -gram 模型。而后可能晓得什么是贝叶斯实践,以及奢侈贝叶斯分类器及它的一个已知信息条件独立的假如。
最初的最初就是,这个语言模型是一个什么级别的呢?在自然语言解决中,解决一些工作,能够用基于天真贝叶斯的语言模型,当然也能够用机器的办法。不过两者并不是齐全抵触,更多是两者的联合。
额定的概念:
-
term-document matrix: 有的读者可能会看到这个名词。这个矩阵是这样的,每一行都是一个语料库的文本,每一列示一个单词,用这个例子来解释:
- I love deep learning.
- I love deep learning and machine learning.
那么这个矩阵的行示意的是:第一个文本,第二个文本
列就是:i,love,deep, learning,and,machine
这个矩阵就是:$1,1,1,1,0,0\\1,1,1,1,1,1$
这个矩阵只是体现是否呈现,而不是统计呈现的次数。
- Named Entity Recognition,NER:这个是命名实体辨认。这个工作能够用下面讲的语言模型实现,然而当初曾经不必这么古老的办法了。这个工作的目标就是辨认语料中的人名、地名、组织机构等命名实体,比方说晓得李雷是一个名字,晓得谷歌是一家公司,晓得人民小道是一条马路的名字等等。