词向量被广泛应用在NLP的任务中, 在端到端的实验中,我们需要先定义一个embedding矩阵,
首先我们先定义embedding矩阵
embedding = tf.Variable(
tf.random_uniform([vocab_size,embedding_size],-1.0,1.0),name='embedding')
接下来就是一些计算词向量的方法 ,假设已经有了词向量矩阵,那么我们如故计算向量之间的余弦相似度呢?
我们需要现对词向量矩阵进行归一化,假设有一个向量\(a=(x_1,x_2,x_3)\),求模
的公式就为\(\sqrt{x_1^2+x_2^2+x_3^2} \quad\),对应的代码如下
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keepdims=True))
需要注意的是reduce_sum
方法里面的参数,keepdims
的含义为retains reduced dimensions with length 1,即保持减少的那一个维度(axis)的值为1
x = tf.constant([[1, 1, 1], [1, 1, 1]])
tf.reduce_sum(x) # 6
tf.reduce_sum(x, 0) # [2, 2, 2]
tf.reduce_sum(x, 1) # [3, 3]
tf.reduce_sum(x, 1, keepdims=True) # [[3], [3]]
tf.reduce_sum(x, [0, 1]) # 6
再接下来就是求\(cos\theta\)
normalized_embeddings = embedding / norm
#对验证集中的数据进行归一化
valid_embeddings = tf.nn.embedding_lookup(
normalized_embeddings, valid_x)
#计算相似性
similarity = tf.matmul(valid_embeddings, tf.transpose(normalized_embeddings))