NLP词嵌入
一、词嵌入背景
- 在做一些自然语言处理的相关问题时,我们可能不由的会产生一个疑惑,好好的一句话或者一个字或词是怎么被计算机处理的呢?因为,毕竟文字和单词等等都是人类智慧的一种抽象结晶,那当然计算机无法直接对文字进行处理,这个时候就需要我们先对文字或者单词做一些操作,可以尝试着把它们转换成数值形式或者说是数学可以表示的形式,然后让计算机能够看懂并理解 what it is! 故,我们给出词嵌入的概念。
- 词嵌入(Word Embedding)是一种将文本中的词转换成向量的方法,为了使用标准机器学习算法来对它们进行分析,就需要把这些被转换成数字的向量以数字形式作为输入。通俗来讲,是指能让一个词语摆脱其抽象的人类属性,让其转变成一种从数学上就可以理解的方法。
- 下面我们来介绍几种词嵌入的实现方法:
二、词嵌入方法介绍
1.词的独热表示
(1)one-hot编码转换
-
假设我们现在有一条句子"I really miss you"作为样本,这一样本(语句)中共有4个单词,而且每一个单词都是不同的,是独一无二的。
-
因此我们结合one-hot编码的思想,可以将这4个单词分别表示为
I = [ 1 , 0 , 0 , 0 ] I \ \ \ \ \ \ \ \ \ = [1, 0, 0, 0] I =[1,0,0,0]
r e a l l y = [ 0 , 1 , 0 , 0 ] really \ = [0, 1, 0, 0] really =[0,1,0,0]
m i s s = [ 0 , 0 , 1 , 0 ] miss \ \ \ = [0, 0, 1, 0] miss =[0,0,1,0]
y o u = [ 0 , 0 , 0 , 1 ] you \ \ \ \ \ \ = [0, 0, 0, 1] you =[0,0,0,1]
那么这条语句是不是就可以表示成一个4x4的二维矩阵了呢?
形如: [ [ 1 , 0 , 0 , 0 ] [ 0 , 1 , 0 , 0 ] [ 0 , 0 , 1 , 0 ] [ 0 , 0 , 0 , 1 ] ] [[1, 0, 0, 0][0, 1, 0, 0][0, 0 ,1, 0][0, 0, 0, 1]] [[1,0,0,0][0,1,0,0][0,0,1,0][0,0,0,1]] -
如果更一般化的话,我们可以结合one-hot编码的思想把一个语句转换成一个MxN的矩阵,其中M为句子中的单词个数,N为句子中单词的种类(因为每出现一个新的单词意味着要多一种存储形式)。
-
one-hot编码转换的缺点
1.其实仔细观察就会发现我们的得到的矩阵其实是一个相当稀疏的稀疏矩阵,因为one-hot对每个单词的编码只有一位是1,其余的位全部都是0,所以这是一种极大的内存浪费。
2.一旦我们单词的种类变多了,像我们的中文语料库中的常用汉字都有个三五千的,英文常用单词更是有两万左右,所以我们得到的矩阵尺寸太大啦!!!
(2)Bag of Word模型(BOW)
- 词袋模型(Bag-of-words model,BOW),BOW模型假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,不依赖于其它单词是否出现。
- 将句子向量化,维数和字典大小一致,第 i 维上的数值代表ID为 i 的词语在这个句子里出现的频次
-
{
"
I
"
:
1
,
"
r
e
a
l
l
y
"
:
2
,
"
m
i
s
s
"
:
3
,
"
y
o
u
"
:
4
}
\{"I": 1,\ "really": 2,\ "miss": 3,\ "you": 4\}
{"I":1, "really":2, "miss":3, "you":4}
I = [ 1 , 0 , 0 , 0 ] I \ \ \ \ \ \ \ \ \ = [1, 0, 0, 0] I =[1,0,0,0]
r e a l l y = [ 0 , 1 , 0 , 0 ] really \ = [0, 1, 0, 0] really =[0,1,0,0]
m i s s = [ 0 , 0 , 1 , 0 ] miss \ \ \ = [0, 0, 1, 0] miss =[0,0,1,0]
y o u = [ 0 , 0 , 0 , 1 ] you \ \ \ \ \ \ = [0, 0, 0, 1] you =[0,0,0,1]
I r e a l l y m i s s y o u = [ 1 , 1 , 1 , 1 ] I\ really\ miss\ you = [1, 1, 1, 1] I really miss you=[1,1,1,1]
I r e a l l y r e a l l y r e a l l y m i s s y o u = [ 1 , 3 , 1 , 1 ] I\ really\ really\ really\ miss\ you = [1, 3, 1, 1] I really really really miss you=[1,3,1,1] - 缺点
1.不能保留语义:不能保留词语在句子中的位置信息,“你爱我” 和 “我爱你” 在这种方式下的向量化结果依然没有区别。“我喜欢北京” 和 “我不喜欢北京” 这两个文本语义截然相反,利用这个模型得到的结果却能认为它们是相似(向量距离近)的文本。
2.维数高和稀疏性:当语料增加时,那么维数也会不可避免的增大,一个文本里不出现的词语就会增多,导致矩阵稀疏
2.词的分布式表示
- 传统的独热表示仅仅将词符号化,不包含任何语义信息。那我们要如何将语义融入到词表示中?“分布假说”为这一设想提供了理论基础:上下文相似的词,其语义也相似。其进一步的阐述和明确:词的语义由其上下文决定。
(1)Word2Vec模型
- Word2Vec模型中,主要有Skip-Gram和CBOW两种模型。
Skip-Gram模型
- Skip-Gram是给定input word来预测上下文
CBOW模型
- 在Skip-Gram模型中,我们从目标单词预测上下文单词。CBOW模型则是给定上下文,来预测input word
上述两个模型后续会出博客来具体介绍的,现先不做过多解释。
比较Skip-Gram与CBOW
- 在给定一批数据中,对于给定单词的上下文,CBOW接受的信息多于Skip-Gram。与Skip-Gram相比,CBOW模型在给定时间可以访问更多信息(输入),从而允许CBOW在某些条件下执行得更好。与Skip-Gram相比,CBOW损失快速下降。
- Skip-Gram在语义任务中表现更好,而CBOW在句法任务中的表现更好。与CBOW相比,Skip-Gram更适用于大型数据集,我们的任务只涉及相对较小的数十万字,CBOW可能表现更好。因为Skip-Gram,单词之间分开,更多关注单词之间的细微差别,CBOW根据语义,会认为近义词之间没有差别,对给定上下文的所有单词进行平均。
(2)GloVe词向量模型
- 尽管Word2Vector在学习词与词间的关系上有了大进步,但是它仍有很明显的缺点:只能利用一定窗长的上下文环境,即利用局部信息,没法利用整个语料库的全局信息。鉴于此,斯坦福的GloVe诞生了,它的全称是global vector,很明显它是要改进Word2Vector,成功利用语料库的全局信息。
后续会出博客来具体介绍的,现先不做过多解释。