自然语言处理(NLP)介绍和词向量

Task 1:NLP introduction and word vectors

1 什么是NLP?

自然语言处理(natural language processing)简称NLP。
人类比猩猩更加聪明,是因为人们可以通过语言进行交互,对语言的理解和思考,展现了人类语言的复杂和高效。每个人对于语言都可以有自己的理解,因此语言不光具有信息传递的功能,还可以通过语言来影响其他人。当今社会,网络速度不断更新迭代,5G已经油然而生,相对于人类语言,我们使用NLP技术可以高速学习构建更强大的处理能力。

简单点说:NLP就是对各种文本内容进行处理
通俗一点理解就是:教计算机懂人话!

2 文本的表示方法

在所有的NLP任务中,第一个也是最重要是我们如何将单词表示为任何模型的输入。

2.1 one-hot编码

2.1.1 单词的编码

什么是one-hot编码?简单来说就是0,1编码,将词用向量的方式表达。
例子:
词库:{我们,去,爬山,今天,你们,昨天,跑步}
我们—(1,0,0,0,0,0,0,)
爬山—(0,0,1,0,0,0,0,)
昨天—(0,0,0,0,0,1,0,)
编码规则:
词向量的长度=词库中元素的数量
将要编码的词在对应的位置标1,其他位置为0

2.1.2 句子的编码

使用2.1.1中单词的one-hot的编码规则,可以对句子进行编码。可以分为两种方式,布尔型编码和计数型编码
a 布尔型编码
词库:{我们,又,去,爬山,今天,你们,昨天,跑步}
我们 今天 去 爬山 ----(1,0,1,1,0,0,0,0)
编码规则:
词向量的长度=词库中元素的数量
词典中的词在句子中出现的对应位置编码为1,未出现编码为0

b 计数型编码
词库:{我们,又,去,爬山,今天,你们,昨天,跑步}
我们 今天 去 爬山 ----(1,0,1,1,0,0,0,0)
你们 又 去 爬山 又 去 跑步----(0,2,2,1,0,1,0,1)
编码规则:
词向量的长度=词库中元素的数量
词典中的词在句子中出现的对应位置编码为出现的次数,未出现编码为0

计算向量的余弦相似度时,使用布尔型编码,无法统计重复出现的词,计数型编码解决了这个问题,有些可能是重要的,但是大部分对于语义是无用的,例如,a,an,the等。
为解决该问题,引入了tf-idf表示方法

TFw= 在某一类中词条 w 出现的次数  该类中所有的词条数目 T F_{w}=\frac{\text { 在某一类中词条 } w \text { 出现的次数 }}{\text { 该类中所有的词条数目 }}

IDF=log( 语料库的文档总数  包含词条 w 的文档数 +1),I D F=\log \left(\frac{\text { 语料库的文档总数 }}{\text { 包含词条 } w \text { 的文档数 }+1}\right),
分母之所以要加1,是为了避免分母为 0

one-hot编码的另一个缺陷

  • 无法判断单词和句子的语义相似度
  • 庞大的向量且几乎都是零,计算灾难

2.2 分布式编码

针对one-hot编码的缺陷,出现了一种向量维数相对可以接受,还能表示语义的模型——分布式编码

word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。
word2vec大致可任意分成两组——浅层模型,和深度模型
浅层模型 ——NNLM,Skipgram,Glove
深度模型——LSTM,Transformer
LSTM模型使用elm实现
Transformer使用Bert实现

2.2.1 Skipgram 语言模型

Skipgram语言模型是根据上下文,预测中间词的概率
自然语言处理(NLP)介绍和词向量
对于每个位置 t = 1,…,T,固定窗口大小m,给定中心词wj:
 likelihood =L(θ)=t=1Tmjmp(wt+jwt;θ)\text { likelihood }=L(\theta)=\prod_{t=1}^{T} \prod_{-m \leq j \leq m} p\left(w_{t+j} \mid w_{t} ; \theta\right)
注:$ \theta $ 是需要优化的参数
J(θ)=1TlogL(θ)=1Tt=1Tmjmj0logP(wt+jwt;θ)J(\theta)=-\frac{1}{T} \log L(\theta)=-\frac{1}{T} \sum_{t=1}^{T} \sum_{m \leq j \leq m \atop j \neq 0} \log P\left(w_{t+j} \mid w_{t} ; \theta\right)

注:

  • J(θ)J(\theta)为损失函数(这里是平均负对数似然);
  • 负号将极大化损失函数转化为极小化损失函数;
  • log函数方便将乘法转化为求和(优化处理)

2.2.2 CBOW语言模型

跟Skipgram语言模型相反,CBOW模型是根据中间词预测其上下文词的概率
自然语言处理(NLP)介绍和词向量

2.3 word2vec之霍夫曼树

skipgram和cbow语言模型都是使用DNN来训练,然后输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大,通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。
自然语言处理(NLP)介绍和词向量霍夫曼树的优点:
得到霍夫曼树后我们会对叶子节点进行霍夫曼编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词拥有更短的编码。

word2vec使用DNN模型的这个处理过程非常耗时,词汇表一般在百万级别以上,这意味着我们DNN的输出层需要进行softmax计算各个词的输出概率的的计算量很大。

word2vec也使用了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使用传统的DNN模型。最先优化使用的数据结构是用霍夫曼树来代替隐藏层和输出层的神经元,霍夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。 而内部节点则起到隐藏层神经元的作用。

霍夫曼树的建立过程如下:

输入:权值为(w1,w2,…wn)的n个节点

输出:对应的霍夫曼树

  • 将(w1,w2,…wn)看做是有n棵树的森林,每个树仅有一个节点。

  • 在森林中选择根节点权值最小的两棵树进行合并,得到一个新的树,这两颗树分布作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和。

  • 将之前的根节点权值最小的两棵树从森林删除,并把新树加入森林。

  • 重复步骤2)和3)直到森林里只有一棵树为止。

下面我们用一个具体的例子来说明霍夫曼树建立的过程,我们有(a,b,c,d,e,f)共6个节点,节点的权值分布是(20,4,8,6,16,3)。
首先是最小的b和f合并,得到的新树根节点权重是7.此时森林里5棵树,根节点权重分别是20,8,6,16,7。此时根节点权重最小的6,7合并,得到新子树,依次类推,最终得到下面的霍夫曼树。
自然语言处理(NLP)介绍和词向量
在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。