python 自然语言处理(中文词向量)

                                                中文词向量

 

一、语言模型到WordEmbedding

    1、什么是语言模型?

        为单词序列分配概率的模型就叫做语言模型。对于单词序列 w_{1}, w_{2}, w_{3}, ... w_{n-1}, w_{n} ,计算 P(w_{1}, w_{2}, w_{3}, ... w_{n-1}, w_{n}) 的模型就是语言模型。

        通俗来说,语言模型就是这样一个模型:对于任意的词序列,它能够计算出这个序列是一句话的概率。或者说语言模型能预测单词序列的下一个词是什么。

        那么这个概率怎么计算呢?一个语言模型通常构建为字符串 s 的概率分布 P(s),这里 P(s) 试图反映的是字符串 s 作为一个句子出现的频率,对于一个由 n 个基元("基元" 可以为字、词或短语等,为了方便表述,以后我们只用 "词" 来通指)构成的句子 s = w_{1} w_{2} w_{3} ... w_{n-1} w_{n} ,其概率公式可以表示为(其实就是条件概率):

            P(s) = P(w_{1})P(w_{2} | w_{1})P(w_{3} | w_{2}w_{1})P(w_{4} | w_{3}w_{2}w_{1}) ... P(w_{n-1} | w_{n-2} ... w_{1})P(w_{n} | w_{n-1} ... w_{1})= \prod_{i=1}^{n}P(w_{i} | w_{i-1} ... w_{1})

        可以看出,我们的语言模型其实是在计算 P(w_{n} | w_{1}^{n-1}) ,即预测下一个单词 w_{n},但是 P(w_{n} | w_{1}^{n-1}) 又该怎么计算呢?由上面的分析我们知道,我们可以计算出 count(w_{1}, w_{2}, w_{3} ... w_{n-1}, w_{n}) 和 count(w_{1}, w_{2}, w_{3} ... w_{n-2}, w_{n-1}),则 

            P(w_{n} | w_{1}^{n-1}) \approx\frac{count(w_{1}, w_{2}, w_{3} ... w_{n-1}, w_{n})}{count(w_{1}, w_{2}, w_{3} ... w_{n-2}, w_{n-1})} 。

            为什么不用 = 呢?因为是统计近似。

        但是我们知道,语言是具有创造性的,任何特定的上下文也许在语料中从未出现过。

    2、n-gram Language Models(n 阶马尔柯夫链语言模型)

        举个简单的例子,比如一句话 “欢迎来到北京”,我们简单的进行一下词的切分,把这句话切分成 "欢迎" "来到" "北京" 三个基元,那么产生 "来到" 北京这个词的概率取决于前面 "欢迎" 和 后面 "北京" 两个词的概率,这也符合我们正常的交流场景,也就是一句话是有前后文的关系的,但是这就存在一个问题,随着历史基元的增多(句子变得很长),比如一个句子被切分成了 k 个基元,词汇表里有 n 个词汇,那么每一个基元处都有 n 个选择,所有一个句子有 k 的 n 次方个路径(非常庞大),假定 n 取 3000,然后取 k 为 3,那么这个参数就是 3 的 3000 次方,这个计算量会非常的大,而且我们经常用的一个句子大约是 22 个词汇,这计算量就更大了(指数爆炸),所以我们希望这个公式可以计算,那么我们就需要稍作修改,减少历史基元的个数,只看前 n-1 个,其他的不看了,只看当前位置前面的一个词,这样就是我们日常使用的 n 元语法了。

        (1)什么是 n-gram 模型?

                n-gram 是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为 n 的滑动窗口操作,形成了长度是 n 的字节片段序列。

                每一个字节片段称为一个 gram,对所有 gram 的出现频率进行统计,并且按照事先设定好的阙值进行过滤,形成关键 gram 列表,也就是这个文本的向量特征空间,列表中的每一种 gram 就是一个特征向量维度。

                该模型基于这样一种假设,第 n 个词的出现只与前面 n-1 个词相关,而与其他任何词都不相关,整句话的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计 n 个词同时出现的次数得到。

                当 n = 1,就是1-gram(一元模型),也就是出现于第 i 位的词独立于历史,只与自己有关,这就是朴素贝叶斯;

                    P(w_{1}, w_{2}, w_{3}, ... w_{n-1}, w_{n})= \prod_{i=1}^{n}P(w_{i})=\frac{C(w_{i}))}{\sum _{\forall k}C(w_{k})} = \frac{C(w_{i})}{N}

                当 n = 2,就是 2-gram(二元模型),即出现在第 i 位的词只与它前面的第 i-1 个词有关;

                    P(w_{1}, w_{2}, w_{3}, ... w_{n-1}, w_{n})= \prod_{i=1}^{n}P(w_{i} | w_{i-1})=\frac{C(w_{i-1}, w_{i}))}{\sum _{\forall k}C(w_{i-1}, w_{k})} = \frac{C(w_{i-1}, w_{i})}{C(w_{i-1})}

                当 n = 3,就是 3-gram(三元模型),即出现在第 i 位的词只与它前面的第 i-1、i-2 两个词有关;

                    P(w_{1}, w_{2}, w_{3}, ... w_{n-1}, w_{n})= \prod_{i=1}^{n}P(w_{i} | w_{i-2}w_{i-1})= \frac{C(w_{i-2}, w_{i-1},w_{i})}{\sum _{\forall k}C(w_{i-2}, w_{i-1}, w_{k})} = \frac{C(w_{i-2}, w_{i-1, w_{i}})}{C(w_{i-2}, w_{i-1})}                                              

                对 n = 2 进行解释,后面的同理如下:

                    P(w_{i} | w_{i-1}) = P(w_{i-1}, w_{i}) / P(w_{i-1}) = \frac{count(w_{i-1}, w_{i}) }{count(N)} \div \frac{count(w_{i-1}) }{count(N)}= \frac{count(w_{i-1}, w_{i}) }{count(w_{i-1})}

                做汉语分析的时候,一般使用四元模型最好,评估模型的时候我们用困惑度来计算。

    3、神经网络语言模型(NNLM)

    

 

二、词向量实践与应用

三、预训练的双向语言模型

你可能感兴趣的:(python,自然语言处理(实战))