如何使用已保存的Keras模型实现基于概率的情感分类?
如何用训练好的情感分类模型预测单句文本的正负概率?
嘿,我来帮你搞定这个问题!你已经把模型训练完成并保存了,接下来只需要把输入的单句文本转换成模型能识别的格式,就能轻松得到情感正负概率了。我一步步给你拆解操作:
1. 加载已保存的模型和Word2Vec模型
首先得把你之前训练好的Keras模型和Word2Vec模型加载回来,假设你之前用model.save('sentiment_model.h5')和word_model.save('word2vec_model.model')保存了它们,代码如下:
from tensorflow.keras.models import load_model import gensim # 加载Keras情感模型 model = load_model('sentiment_model.h5') # 加载Word2Vec模型(如果后续需要处理未知词可以保留,也可根据情况跳过) word_model = gensim.models.Word2Vec.load('word2vec_model.model')
2. 预处理输入文本
模型只能接受固定长度的索引序列作为输入,所以你需要把单句文本转换成和训练数据格式一致的序列:
- 分词方式要和训练时完全一致:比如你训练时用的是空格分词、jieba分词还是其他工具,这里必须保持相同
- 转换为词汇索引:用你训练时构建的
word_to_idx字典(把每个词映射到对应索引的字典),把分词后的每个词转换成索引;遇到不在字典里的词,可以用预设的未知词索引(比如0)代替 - 统一序列长度:用
pad_sequences把序列填充或截断到训练时的最大长度
给你一个预处理函数的示例:
from tensorflow.keras.preprocessing.sequence import pad_sequences def preprocess_single_sentence(sentence, word_to_idx, max_seq_len): # 替换成你训练时用的分词逻辑,比如jieba分词就改成jieba.lcut(sentence) words = sentence.split() # 转换为索引,未知词用0表示(根据你自己的未知词设置调整) seq = [word_to_idx.get(word, 0) for word in words] # 填充/截断到训练时的固定长度,padding和truncating方式要和训练时一致 padded_seq = pad_sequences([seq], maxlen=max_seq_len, padding='post', truncating='post') return padded_seq
3. 预测情感概率
预处理好文本后,直接用模型的predict方法就能得到结果。因为你的模型最后一层是sigmoid激活,输出的是正类的概率,负类概率就是1 - 正类概率:
# 替换成你实际的输入句子、词汇字典和训练时的最大序列长度 input_sentence = "今天的工作真让人头疼,心情糟透了" max_seq_len = 100 # 假设你训练时设置的最大序列长度是100 processed_input = preprocess_single_sentence(input_sentence, word_to_idx, max_seq_len) # 获取预测概率 positive_prob = model.predict(processed_input)[0][0] negative_prob = 1 - positive_prob print(f"该文本的正情感概率: {positive_prob:.4f}") print(f"该文本的负情感概率: {negative_prob:.4f}")
关键注意事项
- 一定要保证预处理逻辑和训练时完全一致:分词方式、词汇字典、序列长度、填充/截断方式,任何一点不一致都会导致预测结果不准
- 如果训练时你对文本做了其他预处理(比如小写转换、去除标点),预测时也要对输入句子做同样的处理
内容的提问来源于stack exchange,提问作者Nico Sid
相关产品推荐
相关产品推荐

