如何用已训练的朴素贝叶斯模型对新句子进行情感分析并输出结果
实现自定义句子情感推理的操作步骤
第一步:补全训练代码的持久化逻辑
你当前的训练流程只保存了训练好的朴素贝叶斯模型,遗漏了训练阶段拟合完成的TfidfVectorizer向量化器,如果跳过这步直接推理,会因为词表不匹配、特征维度和模型训练时不一致,导致无法运行或者结果完全失真。需要在原有训练代码的最后追加一行,把向量化器也持久化保存:
# 原有代码已保存模型 joblib.dump(text_classifier, 'model.pkl') # 新增:保存训练完成的向量化器,推理时必须复用这个对象,不能重新初始化 joblib.dump(vectorizer, 'vectorizer.pkl')
保存完重新跑一次训练流程,生成两个持久化文件:model.pkl(训练好的分类器)、vectorizer.pkl(训练好的特征转换器)。
第二步:编写推理流程代码
推理阶段的核心要求是所有处理逻辑和训练阶段保持完全一致,不能随意改动预处理规则、不能重新拟合特征转换器,完整可运行的代码如下:
import re import joblib # 1. 加载训练阶段保存的模型和向量化器 text_classifier = joblib.load('model.pkl') vectorizer = joblib.load('vectorizer.pkl') # 2. 复刻训练阶段的文本预处理逻辑,逐行对齐不能改动 def preprocess_raw_text(raw_input): # 移除特殊字符 processed = re.sub(r'\W', ' ', str(raw_input)) # 移除孤立的单字符 processed = re.sub(r'\s+[a-zA-Z]\s+', ' ', processed) # 移除开头位置的孤立单字符 processed = re.sub(r'\^[a-zA-Z]\s+', ' ', processed) # 多空格替换为单个空格 processed = re.sub(r'\s+', ' ', processed, flags=re.I) # 移除字符串开头的b前缀 processed = re.sub(r'^b\s+', '', processed) # 统一转小写 processed = processed.lower() return processed # 3. 自定义需要预测的句子 new_sentence = "I am very happy today" # 4. 预处理输入句子 cleaned_text = preprocess_raw_text(new_sentence) # 重点:这里用transform复用训练时的词表规则,绝对不能用fit_transform feature_matrix = vectorizer.transform([cleaned_text]).toarray() # 5. 调用模型预测,得到数值化标签 predicted_label = text_classifier.predict(feature_matrix)[0] # 6. 标签映射:根据你自己数据集的标签定义调整对应关系 # 常见公开推特情感数据集约定:0=Negative(消极),1=Positive(积极) label_catalog = { 0: "Negative", 1: "Positive" } predicted_sentiment = label_catalog[predicted_label] # 7. 按要求格式输出结果 print(f'sentence = "{new_sentence}"') print(f'sentiment = {predicted_sentiment}')
关键避坑提醒
- 推理阶段如果重新对输入文本做
fit_transform,会生成和模型训练时维度完全不同的特征,轻则直接报错,重则输出毫无参考价值的错误结果 - 预处理逻辑哪怕少了一步正则替换,都会导致输入文本的特征分布和训练样本出现偏差,拉低预测准确率
- 标签映射关系要和数据集的实际定义对齐,部分数据集的标签约定和通用规则相反,映射搞反会输出完全颠倒的情感结果
内容的提问来源于stack exchange,提问作者ByUnal
相关产品推荐
相关产品推荐

