
简介一套面向电商买家评论情感分析场景的Python完整项目适合毕业设计、期末大作业和课程设计等场景也适合有Python基础、希望快速上手完整项目的新手。项目从评论数据采集、文本预处理、情感极性标注到特征工程、模型训练与可视化展示均有代码注释可作为高质量模板直接复现或按需扩展。压缩包总大小54.12MB共1380个文件主体包括478个py源码脚本、237个csv数据集与179个txt说明文档并辅以html可视化页面、ipynb分析笔记、pth模型权重等目录结构清晰便于按模块阅读运行。目前已有246人浏览学习。作者手打的98分项目在数据规模、注释完整性和可运行性上打磨细致内含商家评论明细与正负面标注数据能帮助理解情感分析完整落地链路也为答辩展示和二次开发提供了扎实基础。1. 电商评论情感分析数据、模型、源码为什么缺一个都会翻车每到结课周总能看到有人拿着“基于python的电商买家评论数据情感分析源码模型数据集代码注释高分大作业”这类压缩包东拼西凑最后在答辩前夜发现模型没保存、注释全是流水账、数据一跑就乱码。真正把分数拉开差距的不是模型多新、准确率多高而是整套交付能不能让评审一口气复现注释能不能回答“为什么这样处理”。这类项目的本质是一条完整的文本分类链路把电商平台导出的自由评论文本清洗成结构化特征训练情感分类模型再对每条新评论预测出正向、中性或负向最后用混淆矩阵和分类报告支撑结论。它适合NLP、数据挖掘、软件工程类课程设计也适合想快速搭建一个可复现文本分类baseline的从业者。下面按我自己交付这类项目的顺序把预处理、建模、打包、避坑全部过一遍。2. 从评论文本到特征向量预处理、分词与TF-IDF的落地细节情感分析模型不直接读中文评论文本必须先变成数值特征。这一步往往要占掉整个项目一半的工作量而且后面换任何模型都绕不开它。常见的数据集字段其实很固定但每次拿到新数据仍要先做结构检查再谈清洗和向量化。2.1 先把数据长什么样搞清楚字段、缺失与重复拿到数据集的第一步不是跑模型而是把DataFrame的结构打印出来看一遍。电商评论通常包含user_id用户、item_id商品、rating评分、content评论文本、create_time时间这几列但不同来源的字段名可能有差异比如content可能叫commentrating可能叫score。盲目按列名取数很容易在预处理阶段就踩空。import pandas as pd df pd.read_csv(data/raw/reviews.csv, encodingutf-8-sig) print(df.head()) print(df.info()) print(df.isna().sum()) # content或rating为空的数据无法用于训练直接丢弃比fillna更安全 df df.dropna(subset[content, rating]) # 同一个人对同一段内容重复出现往往是刷单或被平台折叠的重复评论 print(df.duplicated(subset[user_id, content]).sum()) df df.drop_duplicates(subset[user_id, content])这里有两个值得说明的参数。encodingutf-8-sig是为了兼容Windows Excel导出的UTF-8文件它会在文件开头带一个BOM头如果直接用utf-8读第一列的列名会多出一个看不见的\ufeff字符后续做特征时会很难排查。duplicated(subset[user_id, content])按用户和内容两个字段去判断重复比按整行判断更合理——同一用户可能在不同时间对同一商品重复评价但完全相同的文本重复出现基本是异常数据。缺失字段的处理不要用df.fillna()糊弄。“没有评论”和“空字符串评论”在分词后都会变成空特征混进训练集只会增加噪音。评分是标签来源缺失了连监督信号都没有直接丢。这里顺便说一句美团情感分析、影视情感分析这类任务的数据字段和电商评论大同小异差别主要在清洗正则和平台用词结构检查这一步流程完全通用。2.2 清洗与中文分词哪些词绝不能进停用词表清洗规则要按评论文本的噪声类型来定电商评论里的典型噪声是链接、用户名、HTML标签和无意义的数字。链接和用户名的形式千变万化留着会让TF-IDF的特征空间虚胖数字看起来无害但“7天无理由”里的“7”一旦被单独切出来就会变成一个没有情感判别力的高频特征而评分列已经单独存过数字了正文数字基本可以安全去掉。import re import jieba # 自建停用词只去掉语气词和句法虚词绝不动“不”“太” STOPWORDS {的, 了, 是, 我, 你, 在, 也, 就, 都} def clean_text(text): text re.sub(rhttps?://\S, , text) # 去链接 text re.sub(r\S, , text) # 去用户名 text re.sub(r[^], , text) # 去HTML标签 text re.sub(r\d, , text) # 去数字评分列已经单独存在 return text def cut(text): words [ w for w in jieba.lcut(clean_text(text)) if w.strip() and w not in STOPWORDS ] return .join(words) df[cutted] df[content].apply(cut) print(df[cutted].head())jieba.lcut返回词列表cut函数把它拼成空格分隔的字符串供后续TfidfVectorizer直接使用。这里最关键的取舍是不要拿网上随便找的停用词表直接过滤。常见中文停用词表里几乎都包含“不”和“太”一旦过滤掉“不太好吃”就会变成“好吃”“很不满意”会变成“满意”情感方向直接反转。电商评论区的情感表达又恰恰集中在“不形容词”“太形容词”这类组合上我一般宁愿在分词阶段多留一些虚词靠后面的ngram参数去处理否定语义。另一个值得落地的习惯是用用户词典而不是逐词add_word。项目里的自定义词往往有成百上千个比如“双十一”“七天无理由”“护手霜”“物流”“客服”一行行写在代码里既难看又难维护。常见做法是单独维护一个data/userdict.txt每行一个词# data/userdict.txt 一行一个自定义词 双十一 七天无理由 护手霜 客服 # 加载方式 jieba.load_userdict(data/userdict.txt)jieba.load_userdict比add_word更适合交付场景因为词典文件本身就属于数据集的一部分评审判读项目时一眼就能看出你对领域词做了处理。如果做的是美团外卖评论分析就往词典里加“骑手”“红包”“商家”如果是影视评论分析就加“剧情”“演技”“特效”。同样是情感分析领域词典决定了分词质量的上限。2.3 TF-IDF向量化三个参数决定特征质感分词结束后的字符串还不能直接喂给模型。最朴素也最可靠的文本特征化方式是TF-IDF它对短文本的判别效果远好于单纯统计词频因为“好评”“店家”这类高频弱判别词会被IDF部分自动压低权重。from sklearn.feature_extraction.text import TfidfVectorizer tfidf TfidfVectorizer( max_features5000, # 词表上限防止低频噪音膨胀 ngram_range(1, 2), # 一元二元保留“不太好吃”这种词序 min_df3, # 少于3个文档出现的词直接丢弃 max_df0.8, # 超过80%文档都出现的词多为公共词 sublinear_tfTrue # 1log(tf)防止长评论自动获得更高权重 ) X tfidf.fit_transform(df[cutted]) print(X.shape) # 检查词表内容确认没有混入乱码和碎片 names tfidf.get_feature_names_out() print(len(names)) print(names[:20])这里有几个参数是按电商短文本场景调的解释清楚就是答辩时的加分点。max_features5000是给特征空间设上限电商评论的词表膨胀很快不设上限会掺入大量只出现一次的词这些词对分类没有判别力还会拖慢训练。ngram_range(1,2)是“不太好吃”能不能被正确判负的关键只用一元词时“不”和“好吃”被拆开“不”在IDF里权重很低模型很容易学歪加入二元组后“不太好吃”作为完整单元保留下来否定信息才进入特征。min_df和max_df是一对反向约束。min_df3会丢掉出现次数少于3个文档的词比如错别字和临时拼贴的碎片但如果调太高低频的品牌名或商品名也会被清掉反而损失判别信息。max_df0.8则把超过80%文档都出现的词视为公共词丢弃这类词通常集中在“好评”“店家”“东西”上对区分正负情感几乎没有贡献。最后用get_feature_names_out()打印词表前20个词确认没有出现乱码或异常词条再进入下一步这个小动作能省下后面大量排查时间。3. 模型训练与评估朴素贝叶斯和逻辑回归怎么选、怎么调特征矩阵X和标签y准备好之后训练代码其实很短难的是标签体系定义和评估方式选择。很多人一上来就想去调BERT但电商评论大多是一句到两句话的短文本先用朴素贝叶斯和逻辑回归跑出baseline比直接上深度模型更稳也更容易解释。3.1 二分类还是三分类标签映射先于模型开跑前必须确认课程要求的是二分类还是三分类。三分类更接近真实电商场景因为“一般般”“还行”这类中性评论大量存在硬塞进正类会污染正样本塞进负类又会把边界样本弄乱。二分类实现简单、准确率高但答辩时很容易被问“中性评论去哪了”。我默认按三分类设计如果课程要求二分类只需要去掉中性样本或把3分并到负类。def rating_to_label(rating): if rating 4: return 2 # 正向 elif rating 3: return 1 # 中性 else: return 0 # 负向 df[label] df[rating].map(rating_to_label) df[desc] df[label].map({0: 负, 1: 中性, 2: 正}) print(df[label].value_counts())标签映射用2/1/0而不是字符串“正/中/负”是为了直接满足sklearn对标签类型的要求同时保留三分类的顺序关系。desc列专门留着可视化用不参与训练。评分和情感的对应关系这道坎要想清楚平台评分天生带有情感倾向4分以上给正向、2分以下给负向、3分归中性是业界最常见映射但如果你拿到的数据集本身没有评分只有标注好的情感字段就直接用标注列当作y。标签映射后先看一眼value_counts()如果三类数量差异很大后面的class_weight和stratify都需要跟着调整。视频人物情感分析、影视评论分析这类任务虽然文本场景不同但标签体系的取舍逻辑完全一致是先定清楚你想预测几个状态再开始写模型代码。3.2 第一个baseline分层划分与朴素贝叶斯文本分类的第一个baseline我推荐多项式朴素贝叶斯。它在词袋特征上训练极快对短文本的效果出人意料地好而且当特征之间近似独立时它的概率推断很干净。电商评论文本恰好符合这个近似评论里表达情感的词往往集中出现独立性假设虽然不严格成立但比长文本场景下温和得多。from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report # stratifyy 保证训练集和测试集的类别比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, stratifyy, random_state42 ) model MultinomialNB(alpha1.0) model.fit(X_train, y_train) print(classification_report(y_test, model.predict(X_test)))test_size0.2意味着如果数据集有一万条样本测试集会保留两千条左右足够评估三分类效果。stratifyy是这里最不能省的一个参数它按类别比例做分层采样否则当负样本只占10%时随机切分可能让负样本全部掉进测试集模型完全没见过负类也能跑出假高分。random_state42固定随机种子保证任何人重跑代码得到完全一样的结果这是交付物可复现的依据也是评审最看重的细节之一。MultinomialNB(alpha1.0)里的alpha是拉普拉斯平滑系数它防止某个词在训练集中没见过就概率为0。alpha越小模型对稀有词越敏感alpha越大概率估计越平滑。短文本任务里alpha1.0是稳妥起点不容易出现过拟合。评估要看classification_report里的macro avg f1而不是只看accuracy——当类别不均衡时accuracy会骗人这一点在后文避坑章节还会展开。3.3 引入逻辑回归与类别权重保存模型朴素贝叶斯跑通后我会再对比一个逻辑回归模型。逻辑回归的优势是权重可解释每个词对应一个权重系数输出结果便于分析和答辩展示同时它自带class_weightbalanced参数可以直接缓解类别不均衡问题。C值是正则化强度的倒数C越小正则越强C越大模型越倾向拟合训练集细节。from sklearn.linear_model import LogisticRegression lr LogisticRegression( C1.0, solverliblinear, max_iter1000, class_weightbalanced, random_state42 ) lr.fit(X_train, y_train) print(classification_report(y_test, lr.predict(X_test))) import joblib joblib.dump(lr, models/lr.joblib) joblib.dump(tfidf, models/tfidf.joblib)solverliblinear对新版scikit-learn来说是个稳定选择它适合小规模数据集对二分类和多分类都能正确处理。max_iter1000是给迭代次数留足余量逻辑回归在线性求解时如果迭代不够会直接报警告但不中断训练容易让人忽略收敛问题。class_weightbalanced会自动按类别频率反比给样本加权比如负样本只有正样本的十分之一它的权重就约等于正样本的十倍。我最想提醒的是joblib.dump要同时保存tfidf向量器和分类器。网上不少源码里只保存了分类器predict阶段重新在预测数据上fit_transform词表被重建维度对不上模型直接报错。正确的加载和使用方式是loaded_tfidf joblib.load(models/tfidf.joblib) loaded_clf joblib.load(models/lr.joblib) new_text 穿了两天就开胶 vec loaded_tfidf.transform([ .join(jieba.lcut(clean_text(new_text)))]) print(loaded_clf.predict(vec))注意这里用的是transform而不是fit_transform因为预测阶段不能重新学习词表必须沿用训练时的词表和IDF权重。这一行写错整个模型就白训了。提示不要在测试集上反复调参。想调C或alpha时先从训练集里再切出一小块验证集或者用GridSearchCV交叉验证测试集只能碰一次否则你调出来的“高分”在真实场景里会缩水。模型对比到这个阶段可以直接放进报告里朴素贝叶斯训练快、参数少适合快速验证逻辑回归权重可解释、能处理类别不均衡适合作为最终交付模型。两者的共同前提是特征要干净这一步做扎实后面换什么模型都不会伤筋动骨。4. 交付“高分大作业”的组织方式源码模块、注释与一键复现“源码模型数据集代码注释”这四个交付物在评审眼里的优先级比很多学生以为的更高。代码能不能一口气跑通决定了对方愿不愿意继续看你的报告注释能不能说明白决策原因决定了对方怎么评价你的工程素养。一个能运行的稀疏代码文件好过一个F1高0.03但解压后跑不起来的完美模型。4.1 交付目录怎么组织源码、模型、数据各归其位我一般会把交付目录按职责拆成五块而不是把所有东西塞进一个main.py里。网上那些免费python源码合集里的课程设计最常见的问题就是单文件一锅炖数据读取、清洗、训练、画图全挤在几百行里看着热闹评审想问“这一步为什么这么做”时你根本找不到位置。project/ ├── README.md # 项目说明与运行步骤 ├── requirements.txt # 依赖锁定文件 ├── data/ │ ├── raw/ # 原始CSV不进行任何预处理 │ ├── userdict.txt # 自定义分词词典 │ └── processed/ # 清洗后的特征缓存 ├── models/ # 保存的tfidf.joblib和分类器joblib ├── src/ │ ├── preprocess.py # 数据读取、清洗、分词、向量化 │ ├── train.py # 训练与评估 │ ├── predict.py # 加载模型做单条预测 │ └── visualize.py # 混淆矩阵、类别分布图 └── output/ # 所有输出图片和指标文件data/raw保留原始文件不动这既是溯源需要也是防止误操作把原始数据改坏。data/processed用来缓存清洗后的特征训练脚本每次运行前先检查缓存是否存在存在就直接从pkl加载避免每次重跑分词这种耗时的重复劳动。models目录同时存放tfidf和分类器两个joblib文件这一点在3.3已经强调过少存一个预测脚本就废了。src目录按职责拆成四个模块每个模块对应一个处理阶段。preprocess负责从CSV到特征矩阵train负责训练和输出指标predict负责加载模型对新评论打标签visualize负责把混淆矩阵和类别分布画成图片。main.py入口只做流程编排不做具体实现。这种结构的好处是评审判读代码时能顺着调用链快速定位每一段逻辑你自己后续想换模型也只需要改train.py。4.2 该注释什么代码注释的三层边界代码注释不是写得越多越好。代码本身说明“做了什么”注释应该回答“为什么这么做”和“什么情况下会出错”。我看到太多作业代码里满屏是“读取CSV”“打印结果”这种注释这些是典型的无效注释因为代码已经写得很清楚了。# 不推荐重复代码本身表达的信息 # 读取CSV df pd.read_csv(reviews.csv) # 推荐说明不可见的背景与决策原因 # Windows Excel 导出的CSV默认带BOM直接utf-8读会让列名多出\ufeff这里显式兼容 df pd.read_csv(reviews.csv, encodingutf-8-sig)注释的第一层是目的注释解释这段代码在整个流程中承担什么角色第二层是取舍注释说明为什么在两个可行方案里选择了当前这个比如“这里删数字因为评分列已单独存在正文数字对情感判别无贡献”第三层是报警注释把容易踩的坑直接标出来比如“千万不要把‘不’加进停用词表”。三个层次的注释覆盖了评审最想看的工程判断。函数级注释则写成docstring说明输入参数、返回内容和关键决策。这样无论是老师还是三天后的自己都能在不读全部代码的情况下理解函数行为。def load_data(path: str) - pd.DataFrame: 读取原始评论文本CSV。 为什么用utf-8-sig 课程数据大概率在Windows Excel里保存过文件开头带BOM 直接utf-8读取会让第一列列名多出一个\\ufeff后续难以排查。 参数 path: CSV文件路径。 返回 pd.DataFrame原始字段不做任何修改。 return pd.read_csv(path, encodingutf-8-sig)docstring里的“为什么”是注释的灵魂。原始CSV不做字段修改这个决定是为了把数据清洗职责单独留在preprocess里方便复核标签映射是否正确。写注释时想着“三天后的自己还在看这份代码”就不会写出流水账注释了。4.3 一键run可复现才有“高分”可言评审拿到压缩包后的第一动作通常是解压、看README、按运行命令跑一遍。如果这个流程超过两个命令或者要手动安装一堆依赖才能跑到出图耐心就会消耗殆尽。可复现不是加分项而是底线。# src/main.py from preprocess import build_features from train import train_model from visualize import plot_confusion_matrix if __name__ __main__: build_features(data/raw/reviews.csv, data/processed/features.pkl) train_model(data/processed/features.pkl, models/lr.joblib) plot_confusion_matrix(output/confusion_matrix.png)入口脚本把整个流程编排成三步先构建特征再训练模型最后输出图表。build_features内部会读取reviews.csv、加载userdict.txt、执行清洗分词和TF-IDF并把特征矩阵保存到processed缓存目录。train_model加载特征后划分数据集、训练逻辑回归、打印分类报告并保存joblib。最后一步把混淆矩阵画到output目录保证提交后能看到可视化产物。运行命令只需要两行写在README最前面pip install -r requirements.txt python src/main.pyrequirements.txt不要手写具体版本号直接在你跑通的机器上用pip freeze requirements.txt生成这样能把当前环境的真实依赖版本锁住。README里再写一句“建议使用Python 3.8及以上版本运行”就够了。跑通的标志是output目录里出现了混淆矩阵图和分类报告整个流程无报错结束。5. 避坑指南电商评论情感分析最常见的5个翻车现场这一章写的是我见过最多、也最能解释“为什么我的代码看起来没问题但结果不对”的场景。每一条都按现象、原因、解决来拆建议提交前逐条对照检查一次。5.1 乱码与BOM头读进来看不见数据现象是pd.read_csv后打印head看到的全是“锟斤拷”或“”, 或者是直接报UnicodeDecodeError: utf-8 codec cant decode byte。原因几乎都出在文件编码上课程数据在Windows上保存时用了GBK或ANSI而read_csv默认按utf-8解析还有一种情况是Excel保存成“UTF-8带BOM”导致第一列列名带上了隐藏字符\ufeff。解决方式是先探测再读取不要猜编码。用chardet读文件前一万个字节做推断import chardet with open(data/raw/reviews.csv, rb) as f: encoding chardet.detect(f.read(10000))[encoding] print(encoding) df pd.read_csv(data/raw/reviews.csv, encodingencoding)如果探测结果是GB2312或GBK用gb18030读取比gbk更稳它能兼容更多生僻字。如果探测结果是utf-8-sig或UTF-8-SIG就按utf-8-sig读取。数据读进来之后打印前五行和全部列名确认没有乱码再往下走。这个检查只花一分钟却能避免在错误数据上做完整套特征工程。5.2 全猜多数类准确率漂亮但作业很水现象是分类报告里正向类的f1很高负向类和中性类recall接近0但整体accuracy反而有0.8以上。原因是三分类样本严重不均衡比如正向样本占80%模型只要全部猜成正准确率就有0.8但这个模型对负向评论没有任何判别能力。解决方式分三步。第一步打印df[label].value_counts()确认类别分布第二步在切分时用stratifyy第三步在逻辑回归里加class_weightbalanced。评估时以classification_report的macro avg f1为准不要只看accuracy。如果负样本实在少得可怜可以考虑把负向和中性合并成“非正向”把三分类降级为二分类这也比训练一个全猜多数类的模型有意义。5.3 “不太好吃”被判成正面否定词与分词现象是单条预测结果和直觉相反比如“不太好吃”被判成正向。原因有两个一是jieba默认词典把“不太好吃”切成“不太/好吃”“好吃”在特征里权重高掩盖了前面的否定二是清洗时误把“不”或“太”放进了停用词表否定信息在特征阶段就被清掉了。解决方式是先检查切分结果再调整特征方案。执行print(jieba.lcut(不太好吃))看分词是否合理如果切分不对优先用用户词典合并情感单元jieba.add_word(不太) jieba.add_word(很不) print(jieba.lcut(不太好吃))更系统的做法是在TfidfVectorizer里把ngram_range设成(1,2)让“不太好吃”这类否定组合以二元词组的形态进入特征。清洗阶段无论如何不要把“不”“太”“很”这些副词写进停用词表它们是中文情感表达的核心载体重不是噪声。5.4 重复评论造成数据泄漏线上高分线下翻车现象是训练和测试都在同一批数据上评估时F1很好看但拿一批新评论去预测效果明显变差。原因是电商评论里存在大量重复文本尤其是刷单和系统默认好评同一条“宝贝很好物流很快”可能出现几百次。如果按行随机切分训练集和测试集同一句话会同时出现在两边相当于模型在测试时偷看了训练答案。解决方式是先按文本内容去重再按商品维度分组切分避免同一商品的相似评论跨集合泄漏from sklearn.model_selection import GroupShuffleSplit df_clean df.drop_duplicates(subset[content]) gss GroupShuffleSplit(n_splits1, test_size0.2, random_state42) train_idx, test_idx next(gss.split(X, y, groupsdf_clean[item_id])) X_train, X_test X[train_idx], X[test_idx] y_train, y_test y[train_idx], y[test_idx]这里的关键是groupsdf_clean[item_id]它让同一个商品的全部评论只能落在训练集或测试集其中一边从根源上堵住数据泄漏。对于评论情感分析这类弱时间敏感任务按商品分组切分是比随机切分更诚实也更贴近真实上线的评估方式。5.5 环境依赖不一致换台机器就打不开模型现象是作业压缩包在自己电脑上跑得好好的换一台机器解压后报ModuleNotFoundError或ValueError: cannot load pickle file。原因是sklearn、pandas、jieba的版本在对方机器上不一致而joblib保存的模型文件对版本差异很敏感跨版本加载经常直接报错。解决方式是训练跑通后立刻锁定依赖pip freeze requirements.txt这份文件记录了当前环境所有包的真实版本对方机器执行pip install -r requirements.txt后能最大程度还原环境。同时README里写明开发用的Python大版本比如Python 3.10。另外交付物不要只给一个训练好的joblib模型把训练脚本和预测脚本一起带上万一模型文件跨版本加载失败对方还能重新训练这比死磕一个模型文件靠谱得多。6. 交付前最后两小时可解释性、可视化与轻量升级6.1 用混淆矩阵和分类报告替代单一准确率模型跑完先别急着写报告。把混淆矩阵画出来保存到output目录这是报告里最有说服力的一张图。准确率只能告诉你“整体对了多少”混淆矩阵能告诉你“错在哪里”正类被误判成中性还是中性被误判成负向这两类错误的对策完全不一样。import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix cm confusion_matrix(y_test, y_pred) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabels[负, 中性, 正], yticklabels[负, 中性, 正]) plt.xlabel(预测标签) plt.ylabel(真实标签) plt.savefig(output/confusion_matrix.png, dpi150)annotTrue在格子里显示具体数量fmtd表示数字格式类别标签用中文会让报告更直观。混淆矩阵图配合classification_report里的macro avg f1比单独摆一个accuracy更有解释力也更能经受答辩追问。6.2 从TF-IDF到预训练模型的轻量升级路径如果还有两天空闲想冲更高的效果不需要推翻现有架构。保留数据清洗、标签映射、训练评估这几段代码只把TfidfVectorizer换成句向量编码器后面所有流程都能复用。低显存环境下不要直接加载几十GB的大模型优先选择小体积的多语言句向量模型它把整句评论文本编码成一个向量天然包含词序信息也不再需要ngram和停用词处理。from sentence_transformers import SentenceTransformer encoder SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) X encoder.encode(df[cutted].tolist(), show_progress_barFalse)代价是第一次运行需要下载模型文件离线环境不适用所以要预先下载并缓存。对普通课程设计而言TF-IDF加逻辑回归已经足以拿到不错的分数预训练模型只是锦上添花。如果对多模态情感分析方向感兴趣电商评论也只是文本这条路的起点视频人物情感分析这类任务还需要额外处理帧级特征复杂度完全不同等把文本链路吃透再扩展不迟。6.3 提交前完整走一遍最后一步是把交付目录打包解压到一个全新目录完全按README从零跑一遍确保不需要任何手工干预就能生成output里的图和指标。我见过太多明明模型没问题的项目最后栽在演示前一刻跑不出图。现在我的交付习惯是所有项目一律“清空output重跑一次通过”并把混淆矩阵和分类报告截图直接放进报告附录。先把这条守住了再谈换模型、调超参。希望帮到你。本文还有配套的精品资源点击获取