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

中文词向量
一、语言模型到WordEmbedding
1、什么是语言模型?
为单词序列分配概率的模型就叫做语言模型。对于单词序列 python|python 自然语言处理(中文词向量)
文章图片
,计算 python|python 自然语言处理(中文词向量)
文章图片
的模型就是语言模型。
通俗来说,语言模型就是这样一个模型:对于任意的词序列,它能够计算出这个序列是一句话的概率。或者说语言模型能预测单词序列的下一个词是什么。
那么这个概率怎么计算呢?一个语言模型通常构建为字符串 s 的概率分布 P(s),这里 P(s) 试图反映的是字符串 s 作为一个句子出现的频率,对于一个由 n 个基元("基元" 可以为字、词或短语等,为了方便表述,以后我们只用 "词" 来通指)构成的句子 python|python 自然语言处理(中文词向量)
文章图片
,其概率公式可以表示为(其实就是条件概率):
python|python 自然语言处理(中文词向量)
文章图片
python|python 自然语言处理(中文词向量)
文章图片

可以看出,我们的语言模型其实是在计算 python|python 自然语言处理(中文词向量)
文章图片
,即预测下一个单词 python|python 自然语言处理(中文词向量)
文章图片
,但是 python|python 自然语言处理(中文词向量)
文章图片
又该怎么计算呢?由上面的分析我们知道,我们可以计算出 python|python 自然语言处理(中文词向量)
文章图片
python|python 自然语言处理(中文词向量)
文章图片
,则
python|python 自然语言处理(中文词向量)
文章图片

为什么不用 = 呢?因为是统计近似。
但是我们知道,语言是具有创造性的,任何特定的上下文也许在语料中从未出现过。
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 位的词独立于历史,只与自己有关,这就是朴素贝叶斯;
python|python 自然语言处理(中文词向量)
文章图片

当 n = 2,就是 2-gram(二元模型),即出现在第 i 位的词只与它前面的第 i-1 个词有关;
python|python 自然语言处理(中文词向量)
文章图片

当 n = 3,就是 3-gram(三元模型),即出现在第 i 位的词只与它前面的第 i-1、i-2 两个词有关;
python|python 自然语言处理(中文词向量)
文章图片

对 n = 2 进行解释,后面的同理如下:
python|python 自然语言处理(中文词向量)
文章图片

做汉语分析的时候,一般使用四元模型最好,评估模型的时候我们用困惑度来计算。
3、神经网络语言模型(NNLM)

【python|python 自然语言处理(中文词向量)】
二、词向量实践与应用
三、预训练的双向语言模型

    推荐阅读