Keras文本分类模型如何提取对分类结果影响最大的词语
Embedding+GlobalMaxPool1D文本分类模型关键特征提取方案
你当前使用的模型结构自带溯源属性,不需要复杂改造就可以快速定位关键影响词,也可以用通用可解释工具实现短语级特征提取,以下是两种可直接落地的方案:
方案一:基于模型结构原生特性溯源(优先推荐,无额外依赖)
GlobalMaxPool1D的运算逻辑是对Embedding输出的每个维度,在整个句子的序列长度上取最大值,每个最大值都对应句子中某一个具体位置的词,后续全连接层的分类预测完全基于这部分最大值运算,所以可以直接通过权重关联定位关键词:
- 第一步:提取训练好的模型各层权重
import numpy as np # 假设你训练时的tokenizer已保留,可以用tokenizer.index_word把id转成实际文本 emb_weights = model.get_layer('embedding').get_weights()[0] # 第一个10神经元的全连接层权重 dense1_w = model.get_layer('dense').get_weights()[0] # 最后输出层的权重 dense2_w = model.get_layer('dense_1').get_weights()[0] # 计算每个embedding维度对最终输出的总贡献权重 dim_contrib = dense1_w @ dense2_w
- 第二步:对单条输入样本做特征定位
# 输入x是已经转成id、padding后的单条样本,形状为(1, maxlen) # 先拿到该样本的embedding层输出 emb_output = model.get_layer('embedding')(x)[0].numpy() # 形状为(maxlen, embedding_dim=50) # 定位每个embedding维度最大值对应的词位置 pos_list = np.argmax(emb_output, axis=0) # 计算每个位置的词的总贡献分 word_score = {} for dim_idx in range(embedding_dim): word_id = x[0][pos_list[dim_idx]] if word_id == 0: # 跳过padding占位符 continue word = tokenizer.index_word.get(word_id, '<UNK>') # 累加该维度的贡献权重到对应词 word_score[word] = word_score.get(word, 0) + dim_contrib[dim_idx][0]
- 第三步:排序得到关键特征
将word_score按值的绝对值从大到小排序,前N个就是对当前样本分类结果影响最大的词。如果要统计全局不同分类对应的核心特征,只需要批量统计所有分类正确的样本的高分词,取高频出现的即可。
方案二:用LIME实现短语级特征提取(通用方案,无需适配模型结构)
如果需要直接获取短语级特征,不需要针对模型结构做定制开发,可以用LIME文本解释器:
from lime.lime_text import LimeTextExplainer # 首先构造预测函数:输入是字符串列表,输出是模型预测的二分类概率,形状为(n_samples, 2) def predict_proba(text_list): # 这里用你训练时的tokenizer把text_list转成id、padding到maxlen seq = tokenizer.texts_to_sequences(text_list) padded_seq = tf.keras.preprocessing.sequence.pad_sequences(seq, maxlen=maxlen) pred = model.predict(padded_seq, verbose=0) # 输出负类、正类的概率,形状对齐LIME要求 return np.hstack([1-pred, pred]) # 初始化解释器 explainer = LimeTextExplainer(class_names=['负类', '正类']) # 对单条文本做解释,输出前10个影响最大的特征 exp = explainer.explain_instance( text="待解释的原始文本字符串", classifier_fn=predict_proba, num_features=10 ) # 拿到特征和对应贡献分,正分代表提升正类概率,负分代表降低正类概率 key_features = exp.as_list()
优化建议
- 提取短语特征时,可以将相邻的高分词合并,或者提前用n-gram做文本分割后再计算贡献
- 统计全局核心特征时,只纳入分类正确的样本,避免错误样本的特征干扰结果
内容的提问来源于stack exchange,提问作者Clock Slave
相关产品推荐
相关产品推荐

