张量流嵌入中单词之间的距离

时间:2019-06-15 19:55:39

标签: tensorflow

我想使用TensorFlow Hub上的一种模型来查看单词之间的距离(特别是这个https://tfhub.dev/google/nnlm-en-dim128/1)。但是我找不到如何找到两个单词或两组单词之间的距离的好例子……通过这样的嵌入,这是否可能实现?

我不是100%的数据科学家,因此,如果这是一个愚蠢的问题,可能完全缺乏理解,因此深表歉意。

理想情况下,我想比较单个单词与两组不同单词之间的距离。

1 个答案:

答案 0 :(得分:0)

我认为两个嵌入式矢量之间最常见的距离度量是cosine similarity

我们可以使用以下公式计算余弦相似度:

img of cosine distance formula from wikipedia page

我们可以将其转换为张量流代码,如下所示:

def cosine_similarity(a, b):
  mag_a = tf.sqrt(tf.reduce_sum(tf.multiply(a, a)))
  mag_b = tf.sqrt(tf.reduce_sum(tf.multiply(b, b)))
  return tf.reduce_sum(tf.multiply(a, b)) / (mag_a * mag_b)

所以我们有一个完整的示例,如下所示:

import tensorflow as tf
import tensorflow_hub as hub

embed = hub.Module("https://tfhub.dev/google/nnlm-en-dim128/1")
embeddings = embed(["cat is on the mat", "tiger sat on the mat"])

def cosine_similarity(a, b):
  mag_a = tf.sqrt(tf.reduce_sum(tf.multiply(a, a)))
  mag_b = tf.sqrt(tf.reduce_sum(tf.multiply(b, b)))
  return tf.reduce_sum(tf.multiply(a, b)) / (mag_a * mag_b)

a = embeddings[0]
b = embeddings[1]

cos_similarity = cosine_similarity(a, b)

with tf.Session() as sess:
  sess.run(tf.initialize_all_tables())
  sess.run(tf.global_variables_initializer())

  print (sess.run(cos_similarity))

输出0.78157

请注意,有些人主张对公式使用重排,以得出相同的结果(+/-微小的“四舍五入误差”),并且可能会或可能不会略有更好的优化。

此替代公式的计算公式为:

def cosine_similarity(a, b):
  norm_a = tf.nn.l2_normalize(a,0)        
  norm_b = tf.nn.l2_normalize(b,0)
  return tf.reduce_sum(tf.multiply(norm_a,norm_b))

就个人而言,我看不到差异可以忽略不计,我只是知道了第一个表述,所以我倾向于坚持下去,但我当然不主张它的最佳表现。不要声称知道哪个最快! :-)