赞
踩
向量对于机器学习非常重要,大量的算法都需要基于向量来完成。对于机器来说,字符是没有含义的,只是有区别。只使用字符无法去刻画字与字、词与词、文本与文本之间的关系,文本转化为向量可以更好地刻画文本之间的关系,向量化后,可以启用大量的机器学习算法,具有很高的价值。文本是由词和字组成的,想将文本转化为向量,首先要能够把词和字转化为向量。所有向量应该有同一维度n,我们可以称这个n维空间是一个语义空间。
我 [ 0.780290020.770109740.074791240.4106988 ] 爱 [ 0.140921940.636909710.737747120.42768218 ] 北京 [ 0.957805680.519037890.766158550.6399924 ] 天安门 [ 0.738613830.496943730.132135380.41237077 ]我[0.780290020.770109740.074791240.4106988]爱[0.140921940.636909710.737747120.42768218]北京[0.957805680.519037890.766158550.6399924]天安门[0.738613830.496943730.132135380.41237077]我[0.780290020.770109740.074791240.4106988]爱[0.140921940.636909710.737747120.42768218]北京[0.957805680.519037890.766158550.6399924]天安门[0.738613830.496943730.132135380.41237077]
首先统计一个字表或词表,选出n个字或词:
今天 [ 1 , 0 , 0 , 0 , 0 ] 天气 [ 0 , 1 , 0 , 0 , 0 ] 真 [ 0 , 0 , 1 , 0 , 0 ] 不错 [ 0 , 0 , 0 , 1 , 0 ] 。 [ 0 , 0 , 0 , 0 , 1 ]
今天[1,0,0,0,0]天气[0,1,0,0,0]真[0,0,1,0,0]不错[0,0,0,1,0]。[0,0,0,0,1]今天[1,0,0,0,0]天气[0,1,0,0,0]真[0,0,1,0,0]不错[0,0,0,1,0]。[0,0,0,0,1]
将向量相加,组成句子:
今天不错 [ 1 , 0 , 0 , 1 , 0 ] 今天真不错 [ 1 , 0 , 1 , 1 , 0 ]
今天不错[1,0,0,1,0]今天真不错[1,0,1,1,0]今天不错[1,0,0,1,0]今天真不错[1,0,1,1,0]
在对文本向量化时,也可以考虑词频:
不错 [ 0 , 0 , 0 , 1 , 0 ] 不错不错 [ 0 , 0 , 0 , 2 , 0 ]
不错[0,0,0,1,0]不错不错[0,0,0,2,0]不错[0,0,0,1,0]不错不错[0,0,0,2,0]
有时也可以不事先准备词表,临时构建,如做文本比对任务,成对输入,把相同字的所在列设置为1,此时维度可随时变化:
例 1 : 你好吗心情 A : 你好吗 [ 1 , 1 , 1 , 0 , 0 ] B : 你心情好吗 [ 1 , 1 , 1 , 1 , 1 ] 例 2 :我不知道谁呀 A : 我不知道 [ 1 , 1 , 1 , 1 , 0 , 0 ] B : 谁知道呀 [ 0 , 0 , 1 , 1 , 1 , 1 ]
例1:你好吗心情A:你好吗[1,1,1,0,0]B:你心情好吗[1,1,1,1,1]例2:我不知道谁呀A:我不知道[1,1,1,1,0,0]B:谁知道呀[0,0,1,1,1,1]例1:你好吗心情A:你好吗[1,1,1,0,0]B:你心情好吗[1,1,1,1,1]例2:我不知道谁呀A:我不知道[1,1,1,1,0,0]B:谁知道呀[0,0,1,1,1,1]
我们希望得到一种词向量有以下性质
word2vec-词向量,本质上是一样的,都是以向量代表字符,一般说Word Embedding是指随机初始化的词向量或字向量Word2Vec一般指一种训练Word Embedding的方法,使得其向量具有一定的性质(向量相似度反映语义相似度)。
这是Bengio et al在《A Neural Probabilistic Language Model》提出的训练方式,做出假设:每段文本中的某一个词,由它前面n个词决定。例如:
今天 天气 不错 我们 出去 玩
今天 -> 天气
今天 天气 -> 不错
今天 天气 不错 -> 我们
今天 天气 不错 我们 -> 出去
论文中的网络层的公式为: y = b + W ∗ x + U ∗ t a n h ( d + H x ) y=b+W*x+U*tanh(d+Hx) y=b+W∗x+U∗tanh(d+Hx)
做出假设:如果两个词在文本中出现时,它的前后出现的词相似,则这两个词语义相似。如:
基于前述思想,我们尝试用窗口中的词(或者说周围词)来表示(预测)中间词,这个称为CBOW模型。如:
窗口:你 想 明白 了 吗
输入:你 想 了 吗
输出:明白
对于CBOW的网络层有如下的计算方式:
class CBOW(nn.Module):
def __init__(self, vocab_size, embedding_size, window_length):
super(CBOW, self).__init__()
self.word_vectors = nn.Embedding(vocab_size, embedding_size)
self.pooling = nn.AvgPool1d(window_length)
self.projection_layer = nn.Linear(embedding_size, vocab_size)
def forward(self, context):
context_embedding = self.word_vectors(context) #batch_size * max_length * embedding size 1*4*4
#transpose: batch_size * embedding size * max_length -> pool: batch_size * embedding_size * 1 -> squeeze:batch_size * embeddig_size
context_embedding = self.pooling(context_embedding.transpose(1, 2)).squeeze()
#batch_size * embeddig_size -> batch_size * vocab_size
pred = self.projection_layer(context_embedding)
return pred
由embedding层和pooling层,最后经过线性层实现的,所以相比语言模型,CBOW的训练的参数相对较少,训练速度更快,而且CBOW更依赖Embedding层,所以训练出来的词向量更好一点。
或用中间词来表示周围词,这个称为SkipGram模型,窗口:你想明白了吗
(输入,输出): (明白 , 你) (明白 , 想) (明白 , 了) (明白 , 吗)
(明白,你)(明白,想)(明白,了)(明白,吗)(明白,你)(明白,想)(明白,了)(明白,吗)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。