自然语言处理中,用one-hot编码只能表示单词的索引,但是单词和单词之间的关系却没有办法表现出来,将单词处理为密集词向量,就可以用余弦距离表示两个单词的相似程度。
one-hot编码
假如全世界只有5个单词,a cat watch the TV。那么我们可以把每个单词用一个五维向量表示:
a=[1,0,0,0,0]|
cat=[0,1,0,0,0]
watch=[0,0,1,0,0]
the=[0,0,0,1,0]
TV=[0,0,0,0,1]
同理,所有的单词都可以用一个足够大的向量表示,这个向量只有一个元素为1表示,其他为0。
但是这样表示单词仅仅只能表示一个索引,却丧失了单词之间的关系,比如:cat和kitty,persons和people,它们在语义上应该很接近,但是用one-hot编码,就会完全丧失语义上的相关性。
Word2Vec
Word2Vec的本质是用单词周围的单词表示它自己。
通过计数或者统计的方法,将单词转化为密集词向量。(此处和密集相对立的是稀疏,如one-hot)
基于计数的Word2Vec:
通过统计一个单词周围单词出现的次数来定义它。
还是a cat watch the TV,假如词汇一共有6个,a是第1个,cat是3个,watch第4,the第6,TV第7。
那么根据这句话,cat=[1,0,0,1,0,1,1],TV=[1,0,1,1,0,1,0]
通过计数大量的语句中的单词,就可以得到每一个单词的词向量。
这种方法训练很快,可以轻松应用到百万级的词汇表上,但是它对新单词的表示会比较差。
基于统计的方法:
主要有两种模型:skip-gram和continuous bag of word(CBOW)
skip-gram:
主要思想:用一个中心词预测多个背景词。
用合适大小的window将句子划分成多个片段,例如window=5,“the man who is fat sits on the chair.”
假设取中心词为“who”,那么,该片段为“the man who is fat”,这句话出现的概率为: P ( w 1 , w 2 , w 4 , w 5 ∣ w 3 ) P(w_1,w_2,w_4,w_5|w_3) P(w1,w2,w4,w5∣w3)
简化,假设这些单词相互条件独立:
P ( w 1 , w 2 , w 4 , w 5 ∣ w 3 ) = P ( w 1 ∣ w 3 ) ∗ P ( w 2 ∣ w 3 ) ∗ P ( w 4 ∣ w 3 ) ∗ P ( w 5 ∣ w 3 ) P(w_1,w_2,w_4,w_5|w_3)=P