tensorflow - 张量流嵌入中单词之间的距离
问题描述
我想使用 TensorFlow Hub 上的模型之一来查看单词之间的距离(特别是这个https://tfhub.dev/google/nnlm-en-dim128/1)。但是我找不到一个很好的例子来说明如何找到两个词或两组词之间的距离......这是否可以通过这样的嵌入来实现?
我 100% 不是数据科学家,所以这可能是完全缺乏理解,如果这是一个愚蠢的问题,我深表歉意。
理想情况下,我想看看一个单词与两组不同单词的距离。
解决方案
我认为两个嵌入向量之间距离的最常见度量是余弦相似度。
我们可以使用以下公式计算余弦相似度:
我们可以将其转换为 tensorflow 代码,如下所示:
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))
就个人而言,我看不出除了可以忽略不计的差异之外,我碰巧知道第一个配方,所以我倾向于坚持使用它,但我当然没有声称它是最好的,也不声称知道哪个是最快的!:-)
推荐阅读
- matlab - 我的程序中的while循环没有填满第二行
- c# - 如果用户取消自动更新,应用安装程序的自动更新将停止工作
- python - 使用居中的 .rolling() 后,将 Pandas DataFrame 列中的 NaN 值替换为第一个计算的总和
- ios - 是否可以使用蓝牙麦克风录制语音并在设备扬声器上播放?
- java - 从 html 字符串中删除给定标签而不替换
- php - Laravel 在 whereIn 子句中的限制
- javascript - 使用 Jquery 从 HTML 表中获取数据(或其他方式,如果可能)
- excel - 如何检查一个日期是否比另一个大?
- angular - 如何为 FormControl 值定义接口?
- dart - 如何以编程方式为整个应用程序更改 Scaffold 小部件的背景颜色