首页 > 解决方案 > Keras 词嵌入的 tfidf 加权平均值

问题描述

我不知道这是怎么可能的,但我想计算句子中单词嵌入的加权平均值,比如 tfidf 分数。

是否正是这样,但只有权重:

在 Keras 中平均一个句子的词向量 - 预训练词嵌入

import keras
from keras.layers import Embedding
from keras.models import Sequential
import numpy as np
# Set parameters
vocab_size=1000
max_length=10
# Generate random embedding matrix for sake of illustration
embedding_matrix = np.random.rand(vocab_size,300)

model = Sequential()
model.add(Embedding(vocab_size, 300, weights=[embedding_matrix], 
input_length=max_length, trainable=False))
# Average the output of the Embedding layer over the word dimension
model.add(keras.layers.Lambda(lambda x: keras.backend.mean(x, axis=1)))

model.summary()

如何使用自定义层或 lambda 层获得属于特定单词的正确权重?您需要以某种方式访问​​嵌入层以获取索引,然后查找适当的权重。

还是有一种我看不到的简单方法?

标签: tensorflowkeras

解决方案


embeddings = model.layers[0].get_weights()[0] # get embedding layer, shape (vocab, embedding_dim) 

或者,如果您定义图层对象:

embedding_layer = Embedding(vocab_size, 300, weights=[embedding_matrix], input_length=max_length, trainable=False)
embeddings = emebdding_layer.get_weights()[0]

从这里,您可以直接通过使用未处理的词袋或整数输入查询它们的位置来直接处理各个权重。

如果您愿意,您还可以通过字符串 words 来查看实际的词向量,尽管这对于简单地累积每个句子的所有词向量不是必需的:

# `word_to_index` is a mapping (i.e. dict) from words to their index that you need to provide (from your original input data which should be ints)
word_embeddings = {w:embeddings[idx] for w, idx in word_to_index.items()}

print(word_embeddings['chair'])  # gives you the word vector

推荐阅读