我正在从事一个文本分类项目,我想使用keras
对每个单词(令牌)的重要性进行排名。我的直觉是,我应该能够从Keras模型中对权重进行排序,以对单词进行排名。
可能我在使用argsort
或tf.math.top_k
时遇到一个简单的问题。
完整的代码来自Packt
我首先使用sklearn
使用10,000个最常用的单词来计算TF-IDF。
vectorizer = TfidfVectorizer(min_df=2, ngram_range=(1, 2), stop_words='english',
max_features=10000, strip_accents='unicode', norm='l2')
x_train_2 = vectorizer.fit_transform(x_train_preprocessed).todense()
x_test_2 = vectorizer.transform(x_test_preprocessed).todense()
我可以查看这样的单词列表:
print(vectorizer.get_feature_names()[:10])
然后我使用Keras构建并拟合模型。 Keras正在使用tensorflow后端。
# Deep Learning modules
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import Adadelta, Adam, RMSprop
from keras.utils import np_utils
# Definiting hyper parameters
np.random.seed(1337)
nb_classes = 20
batch_size = 64
nb_epochs = 20
Y_train = np_utils.to_categorical(y_train, nb_classes)
model = Sequential()
model.add(Dense(1000, input_shape=(10000,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(500))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(50))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
print(model.summary())
# Model Training
model.fit(x_train_2, Y_train, batch_size=batch_size, epochs=nb_epochs, verbose=1)
然后我可以得到这样的权重:
weight = model.weights[0]
# Returns <tf.Variable 'dense_1/kernel:0' shape=(10000, 1000) dtype=float32_ref>
由于行数(10,000)等于要素数,因此我认为我的方向正确。我需要获取可用于获取功能名称的索引列表:informative_features = vectorizer.get_feature_names()[sorted_indices]
。
我尝试使用两种不同的技术来构建列表:
tf.nn.top_k
sorted_indices = tf.nn.top_k(weight)
# Returns TopKV2(values=<tf.Tensor 'TopKV2_2:0' shape=(10000, 1) dtype=float32>, indices=<tf.Tensor 'TopKV2_2:1' shape=(10000, 1) dtype=int32>)
我尚未确定如何从此结果中获取列表。
argsort
sorted_indices = model.get_weights()[0].argsort(axis=0)
print(sorted_indices.shape)
# Returns (10000, 1000)
函数argsort
返回一个矩阵,但是我需要一个一维列表。
如何使用权重对文本特征进行排名?
答案 0 :(得分:1)
我认为不可能 第一层输出1000值 每个值都与每个特征绑定在一起,并带有一些权重值 并且同一件事继续到网络末端
如果输入直接绑定到分类层,并且经过训练,则
tfidf = Input(shape=(10000,))
output = Dense(nb_classes, activation='softmax')(tfidf)
model = Model(tfidf,output)
model.summary()
# train model ...
last_layer = model.layers[-1]
weights = last_layer.get_weights()[0]
for i in range(nb_classes):
print('class : ',i,' -> Feature : ',np.argmax(weights[:,i]) )