ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

微博情感分析实战:10万标注数据与LSTM分类完整链路

微博情感分析实战:10万标注数据与LSTM分类完整链路 简介这套Python微博文本情感分析资源聚焦社交媒体文本的舆论倾向识别适合NLP入门、课程设计及毕业设计使用。压缩包共4个文件、约9.76MB包含Python主脚本、十万条带标注的微博数据集、中文停用词表与LSTM网络结构示意图csv数据可用于模型训练和效果验证py脚本完整实现流程txt停用词表辅助中文预处理png帮助理解深度模型结构。资源覆盖经典分析链路通过jieba分词与去停用词完成文本清洗再使用TF-IDF、Word2Vec构造文本特征最后基于朴素贝叶斯、SVM等算法训练并评估情感分类器。脚本中数据划分与交叉验证设计清楚便于替换数据和调整超参数。目前已有197人学习下载兼顾代码、数据与图示适合在真实微博语料上快速复现情感极性判别也为进一步扩展情感分析应用提供了可修改的基线。1. 微博情感分析10 万条标注数据背后的完整技术链路做舆情监控、写课程设计、跑毕设实验只要沾上中文社交媒体文本微博几乎是绕不开的试验场。这份 Python 微博文本情感分析资源给的不是一个孤零零的模型文件而是一整套配套链路10 万条标注好的微博数据weibo_senti_100k.csv、一份中文停用词表、一张 LSTM 训练过程截图外加一个能直接运行的主脚本。它的价值在于数据和代码是绑定的你不用自己爬数据、洗数据、标标签拿到就能复现从 jieba 分词、去停用词、TF-IDF 特征构建到朴素贝叶斯、SVM、LSTM 分类的完整流程。适合刚接触 NLP 的 Python 开发者也适合做课程设计或毕设时需要完整代码链路的同学。这篇文章会把脚本结构拆开讲把参数设置的逻辑和微博文本特有的坑一并交代清楚。2. 资源包拆解四个文件分别解决什么问题2.1 weibo_senti_100k.csv10 万条数据的字段与分布这份 CSV 是整个项目的燃料。按文件命名推断数据量在 10 万条左右这个规模对文本情感分析来说不算大但足够支撑朴素贝叶斯、SVM 这类经典模型做出有统计意义的结论。字段格式通常是 label 和 review 两列label 表示情感倾向二分类0 负面 / 1 正面review 是微博正文。用 pandas 读进来后第一件事应该是检查类别分布和文本样例。import pandas as pd df pd.read_csv(weibo_senti_100k.csv, encodingutf-8) print(数据规模:, df.shape) print(标签分布:) print(df[label].value_counts()) print(前三条文本:) for i in range(3): print(f[{df[label][i]}] {df[review][i][:60]})读进来之后先看数据规模、标签分布和前几条样本这是所有后续操作的地基。标签分布尤其关键——如果正负样本比例不是 1:1 左右后面训练出来的准确率就没有参考价值。常见做法是检查后发现类别不平衡时用df[label].value_counts()看一下具体比例再决定是欠采样还是过采样。微博文本里大量口语化表达比如哈哈哈哈绝绝子这些词在标签分布里往往是噪声后面预处理环节要单独处理。2.2 stopword.txt停用词表的覆盖边界停用词表是文本预处理的关键辅助文件内容是常见的、对情感判断没有帮助的功能词。微博场景下像的了是在就这类高频虚词确实需要过滤但这份词的边界必须把好关。我打开这份 stopword.txt 后的第一反应是检查里面有没有不太很这类程度副词和否定词。# 检查停用词表内容 with open(stopword.txt, r, encodingutf-8) as f: stopwords [line.strip() for line in f] print(停用词数量:, len(stopwords)) print(前20个:, stopwords[:20]) # 重点排查情感相关词是否被误收录 danger_words [不, 太, 很, 非常, 但是, 但, 却] print(危险词命中:, [w for w in danger_words if w in stopwords])跑这个检查能帮你判断这份停用词表靠不靠谱。中文情感表达里不好和不一旦被切掉好的情感极性就被完全扭曲了。如果danger_words命中列表里有不太这类词说明过滤策略要调整。这里的经验是停用词过滤发生在分词之后但绝不能把否定词和程度副词一刀切掉否则模型会丢失关键的情感转折信号。2.3 微博情感分析.py主脚本的模块化执行流程主脚本是整个项目的核心运行起来基本是按数据读取 → 分词 → 去停用词 → 特征提取 → 模型训练 → 评估这条标准流水线走的。脚本的文件名是中文在 Windows 下直接运行没问题但在 Linux 服务器上要注意编码和文件名兼容性。# 安装依赖 pip install jieba pandas scikit-learn # 运行脚本 python 微博情感分析.py脚本执行后的预期输出是一组评估指标准确率、F1-score可能还有混淆矩阵。从资源包里的 Lstm2.png 来看脚本或者配套代码里还包含 LSTM 模型的训练流程。LSTM 部分依赖 TensorFlow 或 Keras 框架运行时会比传统机器学习模型慢不少我用 GPU 训练也要等几分钟到十几分钟。如果你只是为了完成课程设计跑通朴素贝叶斯和 SVM 就够了如果是为了对比深度学习效果再跑 LSTM。3. 文本预处理与特征提取情感分类的第一道分水岭3.1 jieba 分词模式选择与自定义词典中文文本分词是预处理的第一步jieba 是使用率最高的工具。jieba 支持精确模式、全模式和搜索引擎模式精确模式是最常用的选择它会按照词典做最合理的切分。微博文本里大量网络用语和专有名词默认词典经常切分错误比如哈哈哈哈会被切成哈哈和哈哈绝绝子可能被切成一堆单字。import jieba text 这家店的奶茶真的绝绝子下次还要来 words jieba.lcut(text) # 精确模式分词 print(默认分词:, words) # 添加自定义词典把网络新词作为一个整体 jieba.add_word(绝绝子) jieba.add_word(yyds) words jieba.lcut(text) print(加词后分词:, words) # 也可以加载自定义词典文件格式为词 词频 词性 # jieba.load_userdict(weibo_dict.txt)jieba.lcut()返回一个分词后的列表是精确模式下的标准接口。jieba.add_word()可以动态添加单个词jieba.load_userdict()则适合批量添加。词典文件的格式是词 词频 词性词频可以不写jieba 会自动处理。实际项目中我会把微博高频网络词整理成一个 dict 文件比如yyds绝绝子无语子集美每次分词前加载。词典里的词频设置会影响分词优先级一般设一个比较大的值如 10000让自定义词优先被选中。分词完成后需要过滤空白字符、单字和停用词。单字过滤要谨慎中文里美丑这种单字形容词恰恰是情感极性最强的词。我只过滤纯标点和空白字符单字交给停用词表去判断。3.2 停用词过滤顺序决定结果停用词过滤的常规操作是加载停用词表然后对分词结果做集合判断。顺序问题经常被忽略一定是先分词、再过滤如果反过来文本变成一堆碎片分词质量会断崖式下降。另外过滤时要保留否定词和程度副词这是很多入门项目翻车的地方。import re def clean_and_filter(words, stopwords): # 1. 去掉纯标点和空白 words [w.strip() for w in words if w.strip() and not re.match(r^[\s\W]$, w)] # 2. 去掉停用词但保留否定词和程度词 critical_words {不, 太, 很, 非常, 挺, 更, 最, 但, 但是} filtered [] for w in words: if w in stopwords and w not in critical_words: continue filtered.append(w) return filtered # 使用示例 stopwords set(open(stopword.txt, r, encodingutf-8).read().splitlines()) words jieba.lcut(这个电影太不好看了) print(clean_and_filter(words, stopwords))依赖一个全局停用词集合做过滤速度很快。关键在第 2 步的判断条件critical_words集合里的词即使出现在停用词表里也强制保留。这段代码输出[这个, 电影, 太, 不, 好看]保留了太和不后面 TF-IDF 特征里这两个词就是判断负向情感的重要信号。如果按默认停用词表把不过滤掉这条文本就变成正向的好看了情感极性直接反转。3.3 特征表示词袋、TF-IDF 与 Word2Vec 的取舍分词和过滤之后文本需要转换成数值矩阵。词袋模型Bag of Words只统计词频简单但忽略了词的区分度TF-IDF 在词频基础上加入了逆文档频率让绝绝子这类只在少数文本里出现的词获得更高权重实际使用中 TF-IDF 基本是默认选项。Word2Vec 能捕捉语义关系但训练需要更多数据和算力10 万条微博文本勉强够用。from sklearn.feature_extraction.text import TfidfVectorizer # 假设 texts 是预处理后的文本列表每条以空格连接的分词结果 texts [ .join(clean_and_filter(jieba.lcut(t), stopwords)) for t in df[review]] vectorizer TfidfVectorizer( max_features50000, # 特征数量上限防止维度爆炸 ngram_range(1, 2), # 支持单个词和相邻词组合 min_df2, # 至少在2条文本中出现 max_df0.8, # 在超过80%的文本出现则忽略 sublinear_tfTrue # 对词频做log平滑 ) X vectorizer.fit_transform(texts) print(特征矩阵形状:, X.shape)max_features50000防止特征维度过高导致内存爆炸和训练过慢10 万条文本处理后特征数量通常远大于这个值截断是必要的。min_df2过滤掉只出现一次的词这类词往往是拼写错误或极端个案对泛化没有帮助。max_df0.8把高频虚词排除掉比如微博转发这类几乎每条都出现的词情感区分度极低。ngram_range(1, 2)让不好和很好看这种两个词的组合也能成为特征对情感分析效果显著。Word2Vec 在这个资源里不是必需步骤但如果想提升效果可以用 gensim 在微博语料上训练一个轻量词向量模型再对每条文本的词向量取平均作为特征输入给分类器。缺点是词向量均值会稀释掉关键词的权重实际效果不一定比 TF-IDF 好。我的建议是课程设计用 TF-IDF 就够了深度学习路线才需要用到 Embedding 层配合 LSTM。4. 模型训练与分类器构建从朴素贝叶斯到 LSTM4.1 数据集划分与交叉验证特征矩阵构建完成后接下来的标准操作是划分训练集和测试集比例一般取 8:2 或 7:3。划分时必须加random_state固定随机种子否则每次运行结果不一致后面调参时根本看不出来是参数改好了还是随机性起作用。交叉验证用于更稳定地评估模型泛化能力常见做法是用cross_val_score做 5 折交叉验证。from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import classification_report # 数据划分固定随机种子保证可复现 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) print(f训练集: {X_train.shape}, 测试集: {X_test.shape})stratifyy让训练集和测试集里的正负样本比例保持一致这在二分类评估中很重要。如果不加这个参数随机划分可能导致测试集里负样本特别多准确率虚高或虚低。random_state42是习惯性写法任何固定数字都可以关键是固定下来。后续每次调整特征、模型参数都沿用同一个划分对比才有意义。4.2 朴素贝叶斯与 SVM小数据量下的文本分类主力朴素贝叶斯是文本分类的经典基线模型基于词独立性假设推导后验概率训练快、适合高维稀疏数据。MultinomialNB 适合 TF-IDF 特征核心超参数是平滑系数alpha。SVM 在小规模数据集上表现突出配合线性核函数处理文本分类效果很好。我一般会先跑朴素贝叶斯拿一个基线分数再用 SVM 提高上限。from sklearn.naive_bayes import MultinomialNB from sklearn.linear_model import LogisticRegression from sklearn.svm import LinearSVC from sklearn.pipeline import make_pipeline # 朴素贝叶斯基线 nb MultinomialNB(alpha0.1) nb.fit(X_train, y_train) print(朴素贝叶斯测试集准确率:, nb.score(X_test, y_test)) # 线性SVM文本分类场景下比RBF核更高效 svm LinearSVC(C1.0, max_iter2000) svm.fit(X_train, y_train) print(LinearSVC测试集准确率:, svm.score(X_test, y_test))alpha0.1是平滑系数默认值是 1.0但对微博这种噪声大的短文本调小到 0.1 可以降低平滑对概率估计的干扰我实测能让准确率提升 1% 左右。LinearSVC的C是正则化强度值越大拟合越紧微博文本 1.0 够用了max_iter2000防止小数据集上迭代不收敛导致报警告。如果测试集准确率超过 90%先别高兴去查一下训练集准确率。如果训练集是 99%、测试集是 90%说明过拟合偏重需要降特征维度或调小C。4.3 LSTM序列模型在情感分析上的配置思路资源包里的 Lstm2.png 展示的正是 LSTM 训练过程的可视化结果。LSTM 的优势在于能捕捉词序信息不喜欢和喜欢不在某些上下文中含义不同但传统词袋模型无法区分。代价是训练时间和数据量要求更高。代码结构上先用 Tokenizer 把文本序列化成整数索引再经过 Embedding 层做词向量映射最后进入 LSTM 层。from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Dense from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences import numpy as np # 文本序列化 tokenizer Tokenizer(num_words30000) tokenizer.fit_on_texts(texts) sequences tokenizer.texts_to_sequences(texts) # 统一序列长度取中位数偏上的值 max_len 80 X_seq pad_sequences(sequences, maxlenmax_len) # 构建LSTM模型 model Sequential() model.add(Embedding(30000, 128, input_lengthmax_len)) model.add(LSTM(64, dropout0.2, recurrent_dropout0.2)) model.add(Dense(1, activationsigmoid)) model.compile(optimizeradam, lossbinary_crossentropy, metrics[accuracy]) print(model.summary())num_words30000只保留语料中词频最高的 3 万个词低于这个阈值的词被忽略控制 Embedding 层参数量。max_len80是序列长度微博一般不会超过 140 字80 足够覆盖绝大多数内容超过部分截断、不足部分补零。Embedding层的两个参数词表大小和向量维度128 维是文本分类的常用配置再大收益有限但参数量剧增。LSTM(64)隐层单元数 64 适合中小数据集太大容易过拟合。LSTM 训练过程会明显比 sklearn 类模型耗时我用 CPU 跑 10 万条数据一个 epoch 就要好几分钟。训练时观察 loss 曲线如果训练集 loss 持续下降但验证集 loss 不掉就调大 dropout 或减小 LSTM 隐层尺寸。Lstm2.png 里如果看到的是 loss 曲线下降后趋于平稳说明训练配置基本是健康的。5. 避坑指南微博情感分析里的 6 个典型翻车现场5.1 测试集准确率 95%实际一预测就崩现象模型在测试集上准确率高达 95%但拿 20 条新微博做预测情感判断逻辑完全混乱今天好开心被判成负面。原因特征提取时用了整个数据集的统计信息最典型的是 TF-IDF 的fit_transform在全量数据上执行然后再划分训练集测试集。这样测试集的 TF-IDF 权重已经偷看了测试集文本的分布属于数据泄漏。解决把特征提取和模型封装进 Pipeline先划分再提取特征。from sklearn.pipeline import Pipeline pipeline Pipeline([ (tfidf, TfidfVectorizer(max_features50000, ngram_range(1, 2))), (clf, LinearSVC(C1.0)) ]) # 划分后再fit特征transform只在训练集上学习 X_train, X_test, y_train, y_test train_test_split( df[review], df[label], test_size0.2, random_state42, stratifydf[label] ) pipeline.fit(X_train, y_train) print(Pipeline准确率:, pipeline.score(X_test, y_test))Pipeline 会确保fit阶段只在训练集上计算词频和 IDF 权重测试集变换时完全复用这些统计量。从那以后我每次做文本分类都用 Pipeline 包一层不会再犯全量 fit 再划分的错误。检查方式很简单看你的代码里train_test_split是在TfidfVectorizer.fit_transform之前还是之后之前就对了。5.2 网络新词被切成碎渣yyds变yyd和s现象分词结果出现大量语义碎块绝绝子被切成绝绝和子yyds被切成单字母导致 TF-IDF 特征里出现一堆没有情感含义的噪声词。原因jieba 默认词典是通用领域词典对社交媒体上的网络新词、拼音缩写几乎没有覆盖率。这些新词恰恰是微博情感表达的密集区。解决维护一个微博专用自定义词典。我在网上整理了一份几百词的词典覆盖近年来的高频网络用语分词前加载进去。不需要精确词频jieba 会自适应。import jieba # 准备 weibo_dict.txt格式每行一个词 # yyds # 绝绝子 # 无语子 # 集美们 jieba.load_userdict(weibo_dict.txt) words jieba.lcut(这也太绝绝子了吧集美们冲) print(words)自定义词典文件是纯文本格式每行放一个词行内可加空格分隔的词频和词性。加载后分词结果会是[这也, 太, 绝绝子, 了, 吧, 集美们, 冲]。注意词典里词的格式要和文本中的写法完全一致大小写、繁体简体都会影响匹配。这个坑的隐蔽之处在于分词错误不会报错只会默默降低后续特征质量所以必须抽样检查分词结果。5.3 停用词表把关不严不被过滤导致情感极性反转现象模型的 F1-score 在负向文本上明显偏低检查误判样本发现大量负面文本被预测为正面比如这个手机不好用预测成好评。原因停用词表收录了不分词后过滤阶段把不删掉特征里就只剩手机好用模型自然判定为正面。解决过滤时设置白名单否定词和程度副词坚决保留。具体名单可以参考 3.2 节的critical_words集合至少得包含不没无别以及程度副词太很最超等。def filter_stopwords_with_whitelist(words, stopwords): whitelist {不, 没, 无, 别, 太, 很, 最, 超, 挺, 但, 但是} return [w for w in words if w not in stopwords or w in whitelist] # 造一个包含不的停用词表复现场景 bad_stopwords {的, 了, 是, 不} words [手机, 不, 好用] print(filter_stopwords_with_whitelist(words, bad_stopwords)) # 输出: [手机, 不, 好用]把不排除在过滤范围之外才能保住情感转折信号。这里要注意一个延伸问题分词阶段不好用可能被切成不好和用也可能被整个切出来无论哪种切法只要不不被过滤特征矩阵里就会存在否定信号模型就能学到这条规律。做完这步之后去测试集里搜索包含不的样本查一下它们的预测结果这是最直接的验证手段。5.4 训练时内存溢出或训练中断现象脚本运行到fit_transform或model.fit时报错MemoryError或者 Jupyter Notebook 内核直接崩溃。原因10 万条文本做词袋或 TF-IDF如果max_features不设上限特征维度可能达到几十万甚至百万级稀疏矩阵密度虽低但中间计算过程的临时矩阵会把内存撑爆。LSTM 训练时序列化后的整数矩阵在 batch 较大的情况下同样消耗大量内存。解决限制特征数量、减小序列长度、调小 batch_size。如果用的是 sklearn对 TF-IDF 设置max_features50000基本够用对 LSTM把max_len从 140 降到 80batch_size从 256 降到 64。# 折中配置在内存和效果之间找平衡 vectorizer TfidfVectorizer(max_features50000, min_df2) # 或者使用HashingVectorizer不存储词表内存占用更低 # from sklearn.feature_extraction.text import HashingVectorizer # vectorizer HashingVectorizer(n_features2**18, alternate_signFalse)HashingVectorizer 是更激进的内存优化方案用哈希技巧把文本映射到固定维度的稀疏矩阵缺点是无法反推特征对应的原始词适合只关注准确率、不需要可解释性的场景。如果你真的要处理更大规模的微博数据建议分块处理文本每次读 2 万条做特征提取再拼接脚本不会因为一次性加载全部数据而崩溃。5.5 文本清洗不到位URL 和 用户干扰特征现象特征重要性靠前的词是httpcom转发这类词模型从中根本学不到情感信息准确率被拖低。原因微博文本自带大量 URL 链接、用户名、话题标签#xxx#和表情符号。这些内容在分词时被切成奇形怪状的碎片进入特征矩阵后成为噪声。解决在分词前做一轮正则清洗把 URL、用户、话题标签替换为占位符或直接删除。import re def clean_weibo_text(text): text re.sub(rhttp\S, , text) # 删除URL text re.sub(r\w, , text) # 删除用户 text re.sub(r#\S?#, , text) # 删除话题标签 text re.sub(r\[.*?\], , text) # 删除表情符号如[哈哈] return text.strip() # 示例 sample 今天心情超好[哈哈] http://t.cn/A6x8 微博用户 print(clean_weibo_text(sample))清洗后文本变成今天心情超好干净了很多。注意表情符号的删除要小心微博自带表情可以保留也可以删除取决于你的场景——如果是电商评价分析[生气]这类表情是强烈的情感信号建议保留如果是通用微博情感分析表情的噪声大于价值。这种连续标点是情感强度的信号我的习惯是保留感叹号和问号但把连续多个压缩成一个让好和好在特征上有区别但不至于出现几万个不同标点组合。5.6 二分类模型处理不了中性表达现象模型对今天天气不错路过看一下这类文本强行预测正面或负面准确率看似还可以但业务上需要区分中性时完全没法用。原因weibo_senti_100k 是正负二分类标注但微博真实文本里有大量中性表达。二分类模型只能二选一没有第三类可选准确率指标掩盖了这个短板。解决评估时引入阈值判断。用predict_proba拿到正类概率定义 0.4 到 0.6 之间为中性或者训练三分类模型。对于课程设计更省事的做法是单独收集中性标注数据扩充标签维度。实际项目中我通常保留二分类模型但输出概率值而非硬标签让业务方自己定阈值。这个坑的教训是不要迷信准确率先看你的应用场景需要几个类别再去匹配数据集。6. 落地验证把训练好的模型接到新的微博数据上6.1 概率阈值调整与批量预测模型训练完成后真正的考验是拿到一批新的、没见过的微博文本上。sklearn 里的predict()返回的是硬标签直接拿来做预测会丢失概率信息。用predict_proba()可以拿到每条文本被判为正类的概率根据业务含义调整阈值。比如做舆情监控时宁可把边界样本判为负也不轻易判正就把阈值调高到 0.6。批量预测的代码结构如下。import jieba import numpy as np def predict_sentiment(texts, pipeline, stopwords, threshold0.5): cleaned [clean_weibo_text(t) for t in texts] processed [] for t in cleaned: words jieba.lcut(t) words filter_stopwords_with_whitelist(words, stopwords) processed.append( .join(words)) proba pipeline.predict_proba(processed)[:, 1] preds (proba threshold).astype(int) return preds, proba # 使用示例 new_texts [ 这家火锅真的绝了服务态度也好, 等的我火大一个小时都不上菜, 一般般吧没什么特别的感觉 ] preds, proba predict_sentiment(new_texts, pipeline, stopwords) for t, p, pred in zip(new_texts, proba, preds): print(f{t} - 正面概率{p:.2f}, 判定{正面 if pred else 负面})filter_stopwords_with_whitelist复用了前面定义的过滤函数确保线上预测和离线训练走完全相同的预处理链路。阈值 0.5 是默认值业务上根据不同场景可以左右偏移。第三条文本一般般吧如果被判成负面不要急着调模型它本身更接近中性二分类模型没有第三类可选只能硬着头皮二选一。6.2 混淆矩阵与错误样本复盘训练完模型后只打印一个 accuracy 是不够的必须用混淆矩阵看错误分布。错误集中在哪一类、是哪一类文本被误判决定了下一步怎么优化。from sklearn.metrics import confusion_matrix, classification_report import matplotlib.pyplot as plt import seaborn as sns y_pred pipeline.predict(X_test) cm confusion_matrix(y_test, y_pred) plt.figure(figsize(5, 4)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabels[负面, 正面], yticklabels[负面, 正面]) plt.xlabel(预测) plt.ylabel(真实) plt.show() print(classification_report(y_test, y_pred))如果报表里 negative 一栏的 F1-score 明显低于 positive说明模型对负向文本的识别偏弱常见原因就是停用词表过滤了否定词或者负向样本数量不足。把误判样本打印出来逐条看比调参有用得多。我从这个习惯里得到过非常直接的收获误判样本里大量是反讽表达比如太棒了等了两个小时终于吃上了这种文本人看都知道是负面模型却判正面——讽刺是情感分析现阶段解决不了的经典难题别指望换个模型就能解决如实告诉业务方这个边界就行。6.3 一份来自实战的验证习惯复盘这个项目时我最大的体会是情感分析项目的成败往往不在模型选型而在预处理链路的一致性。训练时怎么清洗、怎么分词、怎么过滤预测新数据时必须一字不差地走同一套流程。任何一步不一致线上效果都会崩盘。所以我现在拿到文本情感分析工程第一件事是封装一个统一的preprocess()函数训练和预测都调用它绝不复制粘贴两段代码。第二件事是每次训练完都留出 500 条测试集之外的数据做最终验证确保测试集指标没有水分。这套流程不复杂但能省去大量训练时 90 分、上线后 60 分的尴尬调试时间。希望这些踩过的坑和验证习惯能帮你在自己的微博情感分析项目上少走几步弯路。本文还有配套的精品资源点击获取
返回列表