)
目录一、项目简介二、环境依赖三、目录结构四、模型训练代码 train.py五、Flask 后端服务 app.py六、简单前端页面 templates/index.html七、核心流程讲解1. 文本预处理流程2. 为什么选用多项式朴素贝叶斯 MultinomialNB3. 模型持久化4. Flask 接口作用八、运行步骤一、项目简介电商平台海量用户评价依靠人工筛选效率低下无法快速区分好评、差评舆情。本项目基于 Python 实现一套完整中文情感分析系统使用 jieba 完成中文分词、停用词过滤做文本预处理采用 CountVectorizer 词袋 N-Gram 提取文本特征选用MultinomialNB多项式朴素贝叶斯训练情感二分类模型Joblib 持久化保存模型、向量器、停用词Flask 搭建 Web 后端接口支持在线输入评论实时预测情感并输出置信度。整套项目涵盖数据处理→模型训练→Web 部署全流程轻量易部署适合电商舆情快速筛查。二、环境依赖bashpip install pandas jieba scikit-learn joblib flask三、目录结构plaintextsentiment_analysis/ ├── 好评.txt ├── 差评.txt ├── StopwordsCN.txt # 中文停用词表 ├── train.py # 模型训练脚本 ├── app.py # Flask预测服务 ├── templates/ │ └── index.html # 前端页面 └── models/ # 自动生成存放模型文件 ├── classifier.pkl ├── vectorizer.pkl └── stopwords.pkl四、模型训练代码 train.pypython运行import pandas as pd import jieba from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB import joblib import os # 创建模型保存文件夹 if not os.path.exists(models): os.makedirs(models) print(开始训练模型...) # 1. 读取正负评数据集 cp_content pd.read_table(差评.txt, encodingutf8) yzpj_content pd.read_table(好评.txt, encodingutf8) # 2. jieba分词处理 print(正在分词...) cp_segments [] for content in cp_content.content.values.tolist(): words jieba.lcut(content) if len(words) 1: cp_segments.append(words) yzpj_segments [] for content in yzpj_content.content.values.tolist(): words jieba.lcut(content) if len(words) 1: yzpj_segments.append(words) # 3. 加载停用词并过滤 print(正在移除停用词...) stopwords_df pd.read_csv(r./StopwordsCN.txt, encodingutf8, enginepython) stopwords stopwords_df.stopword.values.tolist() def drop_stopwords(contents, stop_words): clean_list [] for line in contents: clean_words [w for w in line if w not in stop_words] clean_list.append(clean_words) return clean_list cp_clean drop_stopwords(cp_segments, stopwords) yzpj_clean drop_stopwords(yzpj_segments, stopwords) # 4. 构造训练数据集1差评0好评 df_cp pd.DataFrame({seg: cp_clean, label: 1}) df_yz pd.DataFrame({seg: yzpj_clean, label: 0}) train_df pd.concat([df_cp, df_yz], ignore_indexTrue) # 5. 划分训练集、测试集 x_train, x_test, y_train, y_test train_test_split( train_df[seg].values, train_df[label].values, random_state0 ) # 6. 分词列表拼接为字符串适配词袋模型 train_text [ .join(item) for item in x_train] test_text [ .join(item) for item in x_test] # 7. 词袋特征提取N-Gram(1,3)捕获短语特征 print(特征提取中...) vec CountVectorizer(max_features4000, lowercaseFalse, ngram_range(1, 3)) vec.fit(train_text) x_train_vec vec.transform(train_text) x_test_vec vec.transform(test_text) # 8. 训练多项式朴素贝叶斯 print(训练朴素贝叶斯分类器...) model MultinomialNB(alpha0.1) model.fit(x_train_vec, y_train) # 9. 模型评估 from sklearn import metrics train_pred model.predict(x_train_vec) test_pred model.predict(x_test_vec) print(\n 训练集评估报告 ) print(metrics.classification_report(y_train, train_pred)) print(\n 测试集评估报告 ) print(metrics.classification_report(y_test, test_pred)) # 10. 持久化保存模型、向量器、停用词 joblib.dump(model, models/classifier.pkl) joblib.dump(vec, models/vectorizer.pkl) joblib.dump(stopwords, models/stopwords.pkl) print(\n模型训练完成已保存至models文件夹)五、Flask 后端服务 app.pypython运行from flask import Flask, render_template, request, jsonify import jieba import joblib app Flask(__name__) # 加载训练好的模型 print(加载模型文件...) classifier joblib.load(models/classifier.pkl) vectorizer joblib.load(models/vectorizer.pkl) stopwords joblib.load(models/stopwords.pkl) print(模型加载完成) # 情感预测函数 def predict_comment(text): # 分词 cut_words jieba.lcut(text) # 过滤停用词 valid_words [w for w in cut_words if w not in stopwords] if len(valid_words) 0: return 无法判定, -1, 0.5 # 向量化 input_str .join(valid_words) vec_data vectorizer.transform([input_str]) # 预测 pred_label classifier.predict(vec_data)[0] prob classifier.predict_proba(vec_data)[0] if pred_label 1: res 差评 conf prob[1] else: res 好评 conf prob[0] return res, pred_label, conf # 首页渲染页面 app.route(/) def index(): return render_template(index.html) # 预测接口 app.route(/predict, methods[POST]) def predict(): try: data request.get_json() comment data.get(comment, ).strip() if not comment: return jsonify({error: 请输入评论内容}), 400 sentiment, label, conf predict_comment(comment) return jsonify({ success: True, comment: comment, sentiment: sentiment, label: int(label), confidence: float(conf), msg: f预测结果{sentiment}置信度{conf:.2%} }) except Exception as e: return jsonify({error: f预测失败{str(e)}}), 500 if __name__ __main__: app.run(debugTrue, host0.0.0.0, port5000)六、简单前端页面 templates/index.htmlhtml预览!DOCTYPE html html langzh-CN head meta charsetUTF-8 title电商评论情感分析/title /head body h2电商评论情感预测系统/h2 textarea idtext rows6 cols50 placeholder输入商品评价.../textarea br button onclicksendPredict()开始预测/button div idresult stylemargin-top:20px;font-size:18px;/div script async function sendPredict(){ const text document.getElementById(text).value; const resDom document.getElementById(result); if(!text){ resDom.innerText 请输入评论内容; return; } const resp await fetch(/predict,{ method:POST, headers:{Content-Type:application/json}, body:JSON.stringify({comment:text}) }) const data await resp.json(); if(data.success){ resDom.innerText data.msg; }else{ resDom.innerText data.error; } } /script /body /html七、核心流程讲解1. 文本预处理流程原始评论 → jieba 分词 → 过滤停用词 → 词语拼接 → CountVectorizer 转为数字特征jieba解决中文无天然分隔符问题停用词过滤 “的、很、了” 等无情感虚词减少噪声特征N-Gram (1,3)提取单字、双词、三词组捕捉 “质量很差” 这类短语情感。2. 为什么选用多项式朴素贝叶斯 MultinomialNB适配词频离散特征CountVectorizer 输出统计词出现次数完美匹配 MultinomialNB 适用场景训练速度极快无需 GPU轻量化易部署可输出各类别概率页面能展示置信度调参简单仅需调整平滑系数alpha快速搭建基线模型。缺点算法假设所有词语相互独立忽略上下文语义关联适合快速基线追求高精度可替换逻辑回归、SVM、BERT。3. 模型持久化使用joblib保存训练完成的模型、向量器、停用词表Web 服务启动时直接加载无需重复训练大幅提升线上响应速度。4. Flask 接口作用提供前后端交互 API前端输入评论通过 POST 请求传给后端后端执行预处理 模型推理返回情感结果与置信度实现开箱即用的线上预测功能。八、运行步骤准备数据集好评.txt、差评.txt每行一条评论、中文停用词 StopwordsCN.txt执行python train.py完成训练models 文件夹生成模型文件执行python app.py启动服务浏览器访问http://127.0.0.1:5000输入任意商品评论一键预测好评 / 差评并查看置信度。