如何在Keras单词嵌入层中查找相似单词

如何在Keras单词嵌入层中查找相似单词,keras,word-embedding,Keras,Word Embedding,从斯坦福大学的CS244N课程中,我知道Gensim提供了一种奇妙的方法来处理嵌入数据:最相似 我试图在Keras嵌入层中找到一些等价物,但我做不到。不可能从Keras开箱即用?或者它上面有包装器吗?一个简单的实现是: def最相似(emb_层,pos_word_idxs,neg_word_idxs=[],top_n=10): 权重=emb_层。权重[0] 平均值=[] 对于pos_word_idxs中的idx: mean.append(weights.value()[idx,:]) 对于neg

从斯坦福大学的CS244N课程中,我知道Gensim提供了一种奇妙的方法来处理嵌入数据:最相似


我试图在Keras嵌入层中找到一些等价物,但我做不到。不可能从Keras开箱即用?或者它上面有包装器吗?

一个简单的实现是:

def最相似(emb_层,pos_word_idxs,neg_word_idxs=[],top_n=10):
权重=emb_层。权重[0]
平均值=[]
对于pos_word_idxs中的idx:
mean.append(weights.value()[idx,:])
对于neg_word_idx中的idx:
mean.append(weights.value()[idx,:]*-1)
平均值=tf。减少平均值(平均值,0)
dists=tf.tensordot(权重,平均值,1)
best=tf.math.top\k(地区,顶级)
#用作pos或neg的掩码字
掩码=[]
对于集合中的v(pos_word_idxs+neg_word_idxs):
mask.append(tf.cast(tf.equal(best.index,v),tf.int8))
掩码=tf.less(tf.reduce_sum(掩码,0),1)
返回tf.boolean\u掩码(best.index,掩码),tf.boolean\u掩码(best.values,掩码)
当然你需要知道单词的索引。我假设您有一个
word2idx
映射,所以您可以这样得到它们:
[word2idx[w]表示pos\u words中的w]

要使用它:

#假设第一层是嵌入层,并且您对使用idx 10的word感兴趣
idxs,VAL=最相似(模型层[0],[10])
使用tf.Session()作为sess:
init=tf.global_variables_initializer()
sess.run(初始化)
idxs=sess.run(idxs)
VAL=sess.run(VAL)
该功能的一些潜在改进:

  • 确保它返回
    top\n
    单词(在掩码之后,它返回的单词更少)
  • gensim
    使用标准化嵌入(L2_标准)