我想使用TensorFlow Hub上的一种模型来查看单词之间的距离(特别是这个https://tfhub.dev/google/nnlm-en-dim128/1)。但是我找不到如何找到两个单词或两组单词之间的距离的好例子……通过这样的嵌入,这是否可能实现?
我不是100%的数据科学家,因此,如果这是一个愚蠢的问题,可能完全缺乏理解,因此深表歉意。
理想情况下,我想比较单个单词与两组不同单词之间的距离。
答案 0 :(得分:0)
我认为两个嵌入式矢量之间最常见的距离度量是cosine similarity。
我们可以使用以下公式计算余弦相似度:
我们可以将其转换为张量流代码,如下所示:
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))
就个人而言,我看不到差异可以忽略不计,我只是知道了第一个表述,所以我倾向于坚持下去,但我当然不主张它的最佳表现。不要声称知道哪个最快! :-)