理解词语
一、词向量
词向量技术是将词转化成为稠密向量,并且对于相似的词,其对应的词向量也相近
词向量的几种典型应用:
把这些对词语理解的向量通过特定方法组合起来,就可以有对某句话的理解了;
可以在向量空间中找寻同义词,因为同义词表达的意思相近,往往在空间中距离也非常近;
词语的距离换算。
1.1 词向量的表示
主要分为one-hot representation和distribution representation
(1)离散表示(one-hot representation)
传统的基于规则或基于统计的自然语义处理方法将单词看作一个原子符号
相当于给每个词分配一个id,这就导致这种表示方式不能展示词与词之间的关系。
另外,one-hot representation将会导致特征空间非常大,在高维空间中,很多应用任务线性可分。
(2)分布式表示(distribution representation)
词转化成一种分布式表示,又称词向量。
分布 式表示将词表示成一个定长的连续的稠密向量
分布式表示优点:
词之间存在相似关系: 是词之间存在“距离”概念,这对很多自然语言处理的任务非常有帮助
包含更多信息: 词向量能够包含更多信息,并且每一维都有特定的含义。在采用one-hot特征时,可以对特征向量进行删减,词向量则不能
1.2 生成词向量
任一词的含义可以用它的周边词来表示
基于统计的方法和基于语言模型(language model)的方法
1.2.1 基于统计方法
(1)共现矩阵
通过从大量的语料文本中构建一个共现矩阵来定义word representation
通过统计一个事先指定大小的窗口内的word共现次数,以word周边的共现词的次数做为当前word的vector
(2)SVD(奇异值分解)
对原始词向量进行降维,从而得到一个稠密的连续词向量
对以上共现矩阵,进行SVD分解,得到正交矩阵U,对U进行归一化,得到了word的稠密(dense)矩阵
dense矩阵具有很多良好的性质:语义相近的词在向量空间相近,甚至可以一定程度反映word间的线性关系
1.2.2 语言模型(language model)
语言模型生成词向量是通过训练神经网络语言模型NNLM,词向量做为语言模型的附带产出。
NNLM背后的基本思想是对出现在上下文环境里的词进行预测,这种对上下文环境的预测本质上也是一种对共现统计特征的学习。
Skip-gram、CBOW、LBL、NNLM、C&W、GloVe等
二、CBOW
Continuous Bag of Words (CBOW)
CBOW(Continuous Bag-of-Word)
层次化的softmax
采用语言模型生成词向量
生成向量的效果更取决于良好的训练数据
CBOW模型是上下文已知的情况下,预测当前词出现的概率。
上下文的选取采用窗口方式,即只将当前词窗口范围内的词作为上下文。
中心词概率公式如下: P(wt|wt-k,wt-(k-1)…,wt-1,wt+1,wt+2…,wt+k)= P(wt|context)
CBOW模型去掉了最耗时的隐层
从输入层到隐层的操作:对上下文词向量进行求和 (word2vec代码对以上下文词向量的加权平均来表示context)
从隐层到输出层则利用上下文词向量和做为输入,输出的是窗口中心位置所有词出现的概率
利用softmax求中心词概率,公式表示如下:
其中,context表示上下文词向量和,V表示词表,wt表示中心词,g表示能量函数。
由上式可看出,分母计算比较密集,时间复杂度O|V|。
由上式可以看出,分母的计算复杂度与词表规模相关,当语料较大时,计算变的非常耗时。
解决这一问题是对词进行多分类/聚类,例如,5000词的语料,聚成100类,则时间复杂度由5000缩减至50
CBOW采用了一种Hierarchical softmax技术,利用哈夫曼树对词表进行分类,用一连串的二分类来近似多分类
CBOW代码学习
from tensorflow import keras
import tensorflow as tf
#作者君写了两个函数,用来做数据处理和结果可视化
from utils import process_w2v_data
from visual import show_w2v_word_embedding
#用来解决TF中存在的这个问题
tf.enable_eager_execution()
corpus = [
# numbers
"5 2 4 8 6 2 3 6 4",
"4 8 5 6 9 5 5 6",
"1 1 5 2 3 3 8",
"3 6 9 6 8 7 4 6 3",
"8 9 9 6 1 4 3 4",
"1 0 2 0 2 1 3 3 3 3 3",
"9 3 3 0 1 4 7 8",
"9 9 8 5 6 7 1 2 3 0 1 0",
# alphabets, expecting that 9 is close to letters
"a t g q e h 9 u f",
"e q y u o i p s",
"q o 9 p l k j o k k o p",
"h g y i u t t a e q",
"i k d q r e 9 e a d",
"o p d g 9 s a f g a",
"i u y g h k l a s w",
"o l u y a o g f s",
"o p i u y g d a s j d l",
"u k i l o 9 l j s",
"y g i s h k j l f r f",
"i o h n 9 9 d 9 f a 9",
]
class CBOW(keras.Model):
#初始化
def __init__(self, v_dim, emb_dim):
super().__init__()
self.v_dim = v_dim