简介:围绕中文谣言检测这一自然语言处理课题的本科毕业设计配套资源,将论文研究思路与可运行工程代码一并打包,适合需要完成相关课题、复现实验或入门谣言识别的本科生与研究者。压缩包共26个文件,包含12个Python脚本、9个文本词典文件、4个JSON结构化数据集与1个Markdown说明文档,整体仅4.93MB。脚本按数据清洗、添加标签、Jieba分词、TF-IDF权重计算、逻辑回归训练、聚类分析到最终模型评估的完整流程组织,文本与JSON数据提供停用词表、分类标签、分词语料及多组标注数据,可支撑交叉验证与多模型对比。整体不仅实现基础特征工程与机器学习模型,也为谣言演化分析和实时检测等扩展设计预留了接口;该资源已有125人学习下载,可直接作为课题起步的参考实现。借助完整代码与数据,读者能快速复现论文结论并尝试深度学习改进,节省预处理与调优时间,为中文谣言检测研究提供实用工具链。
1. 中文谣言检测毕设压缩包:拿到手先定位到论文-代码-数据三条线
一个标着 "Chinese Rumor Recognition 本科毕业设计论文-中文谣言检测.zip" 的压缩包,解压开通常不是一个大项目,而是三样东西:一篇完整的毕业论文、一套能跑的 Python 代码、一份或多份标注好的中文谣言数据集。对于做类似题目的学生来说,这个包最大的价值不是代码本身,而是「论文怎么写、实验怎么设计、数据怎么标」这条完整链路。中文谣言检测这个方向,核心任务就是给定一段中文文本,判断它是不是谣言——但真正决定毕设分数高低的,是数据集的构建方式、特征和模型的选择,以及评价指标的解读。这套东西,比模型本身更值得花时间研究,也是这篇博客想带着你一起拆开的东西。想复现、想改写成自己的方案,先按下面的顺序把包拆干净。
2. 解压后的标配结构:论文、代码、数据各占多少戏份
拿到 zip 包,第一件事不是急着跑代码,而是先建立一个整体认知:这个毕设到底做了什么。我一般会按「论文 → 代码 → 数据」的顺序过一遍,每部分花二十分钟左右,合计一小时就能判断这个包值不值得深挖。顺序感很重要,因为论文决定了你对代码的预期,代码决定了你对数据质量的预期,反过来看容易陷进细节里出不来。
2.1 论文部分:先看方法论和实验设计,别急着读结论
毕业论文里,摘要和结论反映的是「做了什么事」,而真正能复用的东西藏在第三章(系统设计或方法)和第四章(实验)。对于中文谣言检测,方法章节通常围绕一条主线展开:文本表示加分类模型。文本表示常见的有 TF-IDF、Word2Vec、BERT embedding 三层递进,分类模型则从朴素贝叶斯、SVM 慢慢过渡到 TextCNN、BiLSTM、BERT。这条主线决定了下一次复现时主力模型的选型。
我拿到论文会直接翻两个地方:一个是数据集描述,确认样本量、谣言和正常言论的比例;另一个是实验对比表格,看作者和哪些 baseline 做了对比,用的什么指标。如果论文里写「准确率 99.2%」,但数据集是随机划分的,那这个数字基本要打五折再看——后面避坑章会专门讲这个问题。还有个小技巧:看实验环境描述,作者用的是 1080Ti 还是 3090,能大致推算训练时间和显存要求,方便你判断自己机器跑不跑得动。
一份合格的毕设实验部分,至少要有一张模型对比表:
| 模型 | 准确率 | 宏F1 | 训练时间 | 参数量级 |
|---|---|---|---|---|
| SVM + TF-IDF | 中等 | 中等 | 分钟级 | 小 |
| TextCNN | 较高 | 较高 | 分钟级 | 小 |
| BiLSTM | 较高 | 中等 | 小时级 | 中 |
| BERT | 最高 | 最高 | 小时级 | 大 |
这张表里的「宏F1」比准确率更能反映谣言检测的真实水平。理由很简单:谣言样本通常只占整个数据集的 20% 到 30%,如果模型把每条输入都预测为「正常言论」,准确率也能轻松超过 70%,但这显然不是我们要的结果。宏F1 把少数类(谣言)和多数类(正常言论)的 F1 分别算出来再取平均,少数类表现差会直接拉低分数,不容易被掩盖。论文的实验章节还会写评估设置,比如几折交叉验证、随机种子、训练轮数,这些信息是后面复现实验的「初始参数表」,建议单独抄到一页笔记上,比看代码里的默认值更快。
2.2 代码部分:数据预处理、模型、训练评估三条主线
代码目录通常逃不出这几个文件:preprocess.py或data_utils.py、train.py、predict.py,外加一个models/或model.py。我拿到代码后会直接看每个文件末尾有没有if __name__ == "__main__",有这个块说明是能独立跑的模块,反之就多半只是被 import 的工具函数。毕设代码里最常见的坏习惯,是把自己实现的预处理逻辑直接堆在 Jupyter Notebook 里,zip 包里找不到可以一键从头跑到尾的入口,这种情况就需要你自己把流程串起来。
一个典型的毕设目录结构长这样:
rumor_detection/ ├── data/ │ ├── raw/ # 原始爬取数据,通常是 csv 或 json │ ├── processed/ # 清洗去重后的数据 │ └── split/ # 训练/验证/测试划分结果 ├── models/ │ ├── __init__.py │ ├── textcnn.py # TextCNN 模型定义 │ └── bert_model.py # BERT 分类模型封装 ├── utils/ │ ├── preprocess.py # 清洗、分词、标签映射 │ └── metrics.py # 评估指标计算 ├── train.py # 训练入口 ├── predict.py # 推理入口 └── requirements.txt这里每个文件承担什么职责,需要对照论文的方法章节来理解。preprocess.py负责的活最多:编码转换、去 HTML 标签、去 URL、jieba 分词、停用词过滤,最后把文本映射成向量或 token ids。models/textcnn.py定义模型结构,models/bert_model.py一般是基于 transformers 的BertForSequenceClassification做一层封装,改改分类头输出维度。train.py是整个项目的发动机,我会特别留意三个细节:数据集是否在传入DataLoader前做了 shuffle、验证集是否真的独立(而不是从训练集里切出来的同一批数据)、保存 checkpoint 的路径写的是相对路径还是写死的绝对路径。这三个细节基本决定了你能不能在一台新机器上把实验复现出来。
2.3 数据集部分:样本来源、标注口径与规模
数据是毕设的灵魂。常见的中文谣言数据集来源有这几类:微博谣言(从「微博辟谣」等官方账号抓取再标注)、新闻门户的假新闻列表、或者公开数据集。公开数据集里 CED 和 THU 的中文谣言数据集出现频率比较高,但版权和下载渠道不固定,很多毕设作者选择自己爬自己标。自己标的数据有个通病:标注者只有作者一个人,标注标准前后会漂移,前面觉得模棱两可的后面判成谣言,这类噪声在随机划分时会被模型学进去。
标注口径直接决定任务难度。最常见的是二分类(真假),也有三分类(真、假、无法核实)。三分类在评估时要额外处理「无法核实」这一类,很多新手直接把它当成谣言算,混淆矩阵一下子就混了。如果你拿到的数据集标注是三分类,建议写代码时就把类名映射关系固定下来:
# 标签映射示例:原数据里可能是中文标签 label_map = { "真": 0, "假": 1, "无法核实": 2, # 三分类才需要 } # 如果做二分类,把“无法核实”剔除或归入多数类检验一个数据集质量的最快方法,是看「谣言」类别的样本量和样本本身。如果整个数据集 5 万条,谣言只有 3000 条,那模型很容易学成「沉默是健康」,把所有输入都判成正常。毕设里常见的补救做法是对谣言类做过采样(imblearn的RandomOverSampler),或者在损失函数里加类别权重。还有一种更省事的思路:把任务从二分类改成「异常检测」,用正常言论训练,看哪些输入偏离分布,但这样做要重新设计训练目标,工作量也不小。
字段方面,原始数据通常包含发布时间、来源账号、正文文本、转发数、评论数。有些数据集还带图片 URL——带图片就意味着可以往多模态方向做,这是后面进阶章的内容。文本字段里如果混入了 @ 提及和表情符号,预处理时要注意:表情符可能被 pandas 读出来变成一串乱码,也可能被当成合法字符,不同处理方式对模型效果影响很大。这里建议清洗时统一把 @ 提及和 URL 去掉,表情符保留还是去掉,最好用一小批验证集对比测试后再定。
3. 把中文谣言检测训练流程跑通:一份能复现的执行清单
这一章的目标很简单:让代码在你自己的机器上跑出第一个 loss,然后保存第一个 checkpoint。我不建议一上来就追求把论文的准确率跑满,先把链路打通,后面调参才有效率。常见的做法是先用少量样本跑通流程,再上全量数据。
3.1 环境准备与依赖安装:先锁定版本再动手
不管论文里写的是什么框架,先把 Python 环境固定住。常见组合是 Python 3.8 + torch 1.10 + transformers 4.20,如果代码里用了 jieba 分词,就加 jieba 0.42.1。环境安装之前,先看一眼requirements.txt里的版本号,不要无脑装最新版——torch 2.x 对旧代码的个别 API 有破坏性变更,transformers 4.30 以上对 BERT 模型的加载方式也有小调整。
# 创建独立虚拟环境,避免搞乱系统 Python conda create -n rumor python=3.8 conda activate rumor # 按 requirements 装核心依赖 pip install torch==1.10.0 transformers==4.20.0 pip install pandas numpy scikit-learn jieba这段命令的关键在于版本锁定。torch 1.10 和 transformers 4.20 是经过大量毕设项目验证过的稳定组合。如果机器有 NVIDIA 显卡,torch 会自动用 CUDA;没有 GPU 时 transformers 的AutoModel会自动走 CPU,只是慢一些,不影响正确性。CPU 上跑 BERT 微调,一轮 epoch 可能要半小时,建议先用小样本验证流程,再全量训练。装完依赖后可以跑一句python -c "import torch; print(torch.__version__)"确认安装无误,这种小验证能省去后面排查环境的时间。
3.2 数据加载与预处理:从原始CSV到模型输入
这里给一个从原始 CSV 到训练集的最小脚本骨架。无论论文最后用的是 TF-IDF 还是 BERT,第一步都是把文本和标签读进来,做清洗、标签映射和集合划分。这一步的产出质量直接决定训练效果,值得多花时间。
import pandas as pd from sklearn.model_selection import train_test_split # 读取原始数据,encoding 按实际文件指定,后面避坑章会展开 df = pd.read_csv("data/raw/rumor_raw.csv", encoding="utf-8") df = df[["text", "label"]].dropna() # 文本清洗:去 URL、去 @ 提及、去多余空白 df["text"] = df["text"].str.replace(r"https?://\S+", "", regex=True) df["text"] = df["text"].str.replace(r"@\S+", "", regex=True) df["text"] = df["text"].str.strip() # 标签映射:确保统一为 0/1 df["label"] = df["label"].map({"真": 0, "假": 1}).fillna(0).astype(int) # 分层划分:确保训练/测试里谣言比例一致 train, temp = train_test_split( df, test_size=0.3, random_state=42, stratify=df["label"] ) val, test = train_test_split( temp, test_size=0.5, random_state=42, stratify=temp["label"] ) print(f"训练集 {len(train)}, 验证集 {len(val)}, 测试集 {len(test)}")这个脚本的要点是stratify=df["label"]这行:它按标签比例分层抽样,避免划分出来的测试集里谣言比例和整体差太多。random_state=42固定随机种子,保证每次跑的结果可复现。清洗阶段用正则去 URL 和 @ 提及,是因为这两类内容对文本分类模型是强噪声——谣言样本里经常有大量转发链路的 @ 符号,留着它们模型会学到「转发多就是谣言」这种脆弱的相关性。
拿到训练集之后还需要构造模型输入。用 TF-IDF 就调用TfidfVectorizer,用 BERT 就要把文本转成input_ids和attention_mask。这一步最容易出的问题,是训练和验证用了同一套分词方式——听起来是废话,但毕设代码里确实见过验证集忘记调用tokenizer直接传字符串进去的写法。还有个细节:TfidfVectorizer的fit必须只在训练集上做,验证和测试集只能用transform,如果对整份数据fit_transform,验证集的信息已经渗进特征矩阵,后面测得的高分全是假的。
3.3 训练与保存:从命令行到可复用的 checkpoint
假设模型是 TextCNN,训练入口的核心结构如下:
import torch from torch.utils.data import DataLoader, TensorDataset # 假设 train_vectors 是预处理好的 numpy 数组(特征向量或 token ids) train_loader = DataLoader( TensorDataset( torch.tensor(train_vectors, dtype=torch.long), torch.tensor(train_labels, dtype=torch.long), ), batch_size=64, shuffle=True, ) model = TextCNN(num_classes=2) optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) loss_fn = torch.nn.CrossEntropyLoss() for epoch in range(10): model.train() total_loss = 0 for batch_x, batch_y in train_loader: optimizer.zero_grad() outputs = model(batch_x) loss = loss_fn(outputs, batch_y) loss.backward() optimizer.step() total_loss += loss.item() print(f"epoch {epoch}, loss {total_loss / len(train_loader):.4f}") # 保存模型权重,路径用相对路径,方便换机器 torch.save(model.state_dict(), "checkpoints/textcnn.pt")这里值得说明的参数是batch_size=64、lr=1e-3和epochs=10。TextCNN 这种浅层模型学习率可以开大一点,1e-3 是很常见的起点;epoch 数要看验证集 loss 变化,一般 5 到 15 轮内收敛。shuffle=True是必须的:如果不打乱数据,模型会按顺序看到同一类样本,梯度更新产生偏向。保存 checkpoint 用相对路径,后续换机器跑不会因为C:\Users\xxx这种写死的绝对路径报错。跑完这个脚本,你的第一个基线就出来了。
到这里,训练流程就跑通了。接下来要做的不是直接调模型,而是先回到评估指标上,看这个基线的短板在哪里,这是第四章要解决的问题。
4. 调参与评估:中文谣言检测看的不只是准确率
很多第一次接触中文谣言检测的同学,看到训练 loss 降下来就以为完事了。实际上,训练 loss、验证 loss、测试集指标这三者是三回事:训练 loss 降说明模型拟合了训练数据,验证 loss 不降说明过拟合,测试集指标才是答辩时能拿出手的东西。第四章的目标,是让你知道参数往哪个方向调,以及怎么看清楚模型到底学得好不好。
4.1 需要调的核心参数:学习率、batch size、max_len 与 dropout
中文谣言检测的模型分两类,调参重心完全不同。传统机器学习这边,TfidfVectorizer的max_features、ngram_range和 SVM 的C值最值得调。max_features设置 5000 到 20000 之间,太小会丢词义,太大引入噪声;ngram_range从(1,1)扩到(1,2)通常能带来几个点的准确率提升,因为「不实消息」「造谣」这类双词搭配比单字词更有区分力。SVM 的C值则控制在 0.1 到 10 之间,用交叉验证粗调,C太大容易过拟合到训练集的噪声上。
深度学习这边必调的参数是学习率、batch size、序列最大长度和早停轮数。BERT 微调的学习率通常取 2e-5 到 5e-5 之间,比 TextCNN 的 1e-3 小两个数量级——BERT 预训练权重已经很接近最优解,学习率太大会直接破坏模型内部表示,出现训练 loss 不降反升的怪现象。batch size 受显存约束,BERT 在 12G 显存下 max_len=128 时 batch 能到 32 左右,TextCNN 则可以开到 128。
max_len 的设定有个玄学在里面:中文一个字在 BERT 下大致对应一个 token,太长会浪费算力,太短会截断关键信息。我一般先统计训练集文本长度的 95 分位,取那个值作为 max_len,而不是凭感觉设 256。还有一个容易被忽略的小参数是dropout:模型在毕设数据量(通常几千到几万条)下特别容易过拟合,BERT 分类头的 dropout 从 0.1 提到 0.3,往往比换一个更强的模型更管用。
4.2 评价指标:宏平均、加权F1与混淆矩阵怎么看
谣言检测的评估,准确率是参考指标,核心指标是 F1,而且是宏平均(macro F1)或加权(weighted F1)。区别在于:宏平均对每个类算 F1 再取算术平均,对少数类敏感;加权平均按类样本量加权,更贴近实际分布。在数据不平衡时两者会差开几个点,论文里尽量两个都报告,这样评阅老师能直观看到你理解不平衡问题。
混淆矩阵是排查模型「在错什么」最好的工具,它比单一分数更能暴露问题。放一个 sklearn 的调用示例:
from sklearn.metrics import classification_report, confusion_matrix # y_true 为真实标签,y_pred 为模型预测结果 print(classification_report(y_true, y_pred, target_names=["正常", "谣言"])) print(confusion_matrix(y_true, y_pred)) # 查看谣言(1)被误判成正常(0)的数量这里要特别注意classification_report输出里的macro avg和weighted avg两行。如果macro avg明显低于weighted avg,说明模型在少数类(谣言)上表现拉胯,被多数类的高分掩盖了。这种时候要么加数据,要么调类别权重,而不是盲目堆模型层数。混淆矩阵里如果「正常判成谣言」的列特别高,说明模型误伤严重,这种模型上线后会把大量正常新闻打上谣言标签,比漏报更让人头疼。
4.3 基线对比:传统机器学习与深度学习模型怎么摆
毕设实验设计里最容易被导师拷问的就是「为什么不用 XX 模型」。常规的做法是摆三到四个梯度明显的基线:SVM + TF-IDF 作为传统基准,TextCNN 和 BiLSTM 作为深度学习代表,BERT 作为预训练模型代表。这样对比表格才有梯度,也能证明「不是随便选了个模型就交差」。
每个模型用同一份划分好的训练/验证/测试集跑,记录准确率、宏F1、训练时间三列。做对比时有一个血泪经验:所有模型的随机种子设成同一个值,比如 42,数据加载顺序保持一致,不然模型之间的差异会被随机性稀释,导师一问「这个提升是不是随机噪声」,答不上来就很尴尬。还有一个常见误用:基线模型实验做得太浅,SVM 只跑默认参数,BERT 却调得很精细,这种不公对比在答辩时容易被一眼看穿。传统模型也要做基本的参数搜索,哪怕只搜三组,也能说明你理解「对比实验要公平」这个原则。
5. 中文谣言检测的五个经典踩坑点:从解压到训完
这一章写的每一个坑,都是我见过不止一次的真实翻车现场。每条按「现象 → 原因 → 解决」来说,你可以直接拿来做排错清单。
5.1 zip包解压失败与中文乱码:eocd错误先换工具
现象:解压 "Chinese Rumor Recognition 本科毕业设计论文-中文谣言检测.zip" 时 Windows 自带工具或 WinRAR 报错「文件已损坏」或「压缩包格式未知」,日志里能看到类似failed to copy spatial iop zip、invalid zip archive: could not find eocd的提示。
原因:eocd(End of Central Directory)是 zip 文件尾部的核心目录记录,解压工具靠它定位所有压缩条目。文件在传输过程中被截断、用聊天软件发文件被二次压缩、或者从网盘下载时被中途断开,都容易损坏这块区域。另一个高频原因是文件名含中文和极长路径,早期压缩工具用 GBK 编码写的文件名在 UTF-8 环境下解压出来全是乱码。
解决:先重新下载一份,再换个解压工具试试——7-Zip 对损坏文件的容忍度比系统自带工具高。EOCD 损坏时用 7-Zip 打开看能否列出文件清单,能列出就先解压,解不开再找原始来源。文件名乱码则用 7-Zip 手动指定编码为 GBK 或 CP936 再解压。这类问题本质上和算法无关,但卡在这一步会浪费大量时间,建议拿到任何毕设 zip 包第一时间完整解压并检查文件数,而不是边解压边跑代码。
5.2 中文编码与分词不一致:训练和预测必须同一套
现象:pd.read_csv读出来的文本全是乱码,或者模型训练时正常,预测时输入一段新闻就报错说 token 不在词典里。
原因:数据文件可能是 UTF-8 也可能是 GBK,而脚本写死了encoding="utf-8"。另一个潜在坑是分词方式不一致:论文里写「用 jieba 分词」,但代码里训练时用了精确模式,预测时用了全模式,虽然都是 jieba,切出来的词不一样,特征空间就对不上,模型等价于废了。
解决:读取时先探测文件编码,用chardet或简单的二进制判断头字节,然后显式传入encoding参数。代码里统一一个分词入口函数,训练和预测只调用它;如果发现同一个功能写了两份实现,立刻合并。BERT 路线没有这个困扰,直接用BertTokenizer切 subword,天然避开中文分词边界争议,这也是很多人推荐 BERT 做中文文本分类的一个原因——少一类坑。
5.3 数据泄漏:随机划分是假高分的元凶
现象:训练时验证集和测试集准确率都超过 95%,宏F1 也很高,但换一批新数据预测表现断崖式下跌。
原因:最常见的是随机划分导致的文本泄漏——同一条微博的转发原文和评论,一个分在训练集一个分在测试集,模型其实「记住了」而不是「学会了」。谣言数据里很多转发文本几乎一模一样,随机划分会让测试集里出现训练集的复读机,模型只需把训练时见过的句子对号入座,就能拿高分。更隐蔽的一种泄漏发生在预处理阶段:对整份数据做了 TF-IDF 拟合再划分,验证集的信息已经渗进特征矩阵。
解决:按时间划分,用前 80% 时间的数据训练,后 20% 做测试;对文本做去重,同一文本只保留一条;TF-IDF 或 BERT tokenizer 只能 fit 训练集,验证和测试集用 transform,不能重新 fit。判断有没有泄漏,最快的方法是看测试集里有没有和训练集完全相同或近乎相同的文本,写几行代码查重即可。做实验时把「按时间划分」作为主结果,「随机划分」放在附录里做对比,评阅老师会觉得你考虑过这个问题。
5.4 类别不平衡:模型摆烂全判正常的抢救方案
现象:模型准确率 80%,但预测出来的「谣言」数量几乎为 0,所有样本都被判成正常。
原因:谣言样本占比低于 20% 时,交叉熵损失函数天然地倾向多数类。模型犯懒,全判正常也能拿高准确率,梯度更新方向被多数类主导,少数类的梯度贡献几乎被淹没。
解决:加类别权重是最快的干预手段。PyTorch 里在CrossEntropyLoss传weight参数,sklearn 的 SVM 在class_weight里设"balanced"。如果还不够,就去重采样:RandomOverSampler复制少数类样本,或SMOTE在特征空间合成新样本,但 SMOTE 对文本 TF-IDF 特征效果一般,因为它基于欧氏距离插值,文本特征空间高度稀疏,合成出来的样本可能不真实。还有一个思路是把任务从二分类改成「异常检测」,用正常言论训练一个单类模型,偏离分布的判为谣言,但这套方案的评估口径和二分类不同,要在论文里交代清楚。
5.5 显存不足与随机种子:复现实验的最后一步
现象:BERT 训练在第一个 epoch 跑到一半报CUDA out of memory,或者两次训练结果差异大到不可复现,甚至同一个脚本跑两次准确率差五个点。
原因:显存溢出通常是 max_len 设置过大或 batch size 太大,模型一次把整批数据都塞进显卡;结果差异大则是随机种子没有固定——有 CPU、GPU、Python 层三处随机源,只设一处等于没设。
解决:显存不够先减 batch size,再减 max_len,最后才考虑梯度累积。随机种子在训练脚本开头统一设置:
import torch import numpy as np import random random.seed(42) np.random.seed(42) torch.manual_seed(42) torch.cuda.manual_seed_all(42) # 训练前固定所有随机源注意torch.cuda.manual_seed_all要放在 CUDA 初始化之前调用,否则对后启动的 CUDA 上下文不生效。做完这两件事,实验的可复现性会明显提升,答辩前最后一天你会感谢这个习惯。
6. 沿着这个压缩包往上走:从文本分类到多模态与事实验证
复现只是第一步,导师真正想看到的是你能往前挪一步。如果数据和资源都还充裕,我建议按优先级尝试下面三个方向。第一个是多模态谣言检测:如果数据集里带图片 URL,把文本和图片一起建模,用 CLIP 或 ViT 提取图像特征,和文本特征拼接后分类。谣言往往图文并茂,封面图和正文语义矛盾是强信号,比纯文本分类更贴近真实场景。第二个是事实验证:把任务从「这段文本是真是假」升级成「这段话和已知事实是否一致」,引入检索增强生成(RAG)的思路,让模型先从语料库里检索相关文档,再基于证据做判断。这样一来,模型不仅输出真假,还能给出依据,论文的讨论深度会明显不同。第三个方向是做谣言的时间演化:谣言有生命周期,同一个事件在不同时间点的传播特征变化很大,按时间窗口切分数据建模,能回答「谣言在什么阶段最容易扩散」这类更有价值的问题。
验证层面,无论做哪个方向,都建议用「时间划分 + 5 折交叉验证」双轨制:时间划分用来证明模型对未来的预测能力,交叉验证用来证明参数选择的稳定性。报告指标时把 macro F1 放在准确率前面,让评阅老师第一眼看到你对不平衡问题的理解。我自己最早做毕设时,拿到一个差不多的压缩包,第一反应是直接跑,结果踩了数据泄漏的坑,答辩时被老师问得无话可说。后来养成的习惯是每次跑实验前先花十分钟看数据划分代码,再花十分钟检查随机种子和编码,这两个习惯帮我避掉了大部分翻车现场。做中文谣言检测,模型结构是最不难的部分,难的是数据意识——你愿意在数据和评估上花的时间,最后都会变成论文里的底气。希望这份踩坑笔记能帮你少走一段弯路。
本文还有配套的精品资源,点击获取