tf计算余弦相似度

词向量被广泛应用在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))

猜你喜欢

转载自www.cnblogs.com/wxshi/p/9262383.html
今日推荐