1项目概述与商业背景
商业情境
某投研机构正在搭建一套「财经舆情监测系统」。每天有海量的财经新闻标题、研报摘要、社交媒体讨论涌入,分析师无法逐条阅读。机构希望先用一个自动情感分类器,把每条文本判定为对市场的看涨(positive)、看跌(negative)或中性(neutral)三类,作为后续选股、风控与投资者情绪指数的输入信号。
你被指派完成技术选型的论证。管理层的真实诉求不是「跑出最高准确率」,而是想知道:训练一个传统的小模型,和直接用大语言模型,二者在准确率、可解释性、开发成本、对标注数据的依赖之间各处于什么位置?什么场景该用哪一种? 这正是你这份报告要回答的商业问题。
课程第一讲指出,商科人才的核心竞争力正从「写代码」转向「定义业务需求、做技术选型与权衡」。因此本项目要求你把同一个任务分别用经典机器学习与大语言模型各做一遍,重点训练你的横向比较与商业判断能力,而不是调参炼丹。
你将提交什么
- 一份可运行的代码(Jupyter Notebook),完整复现下文四个必做阶段;
- 一份不少于 3000 字的实验报告(论文形式,必须使用课程提供的论文模板,含图表、方法对比总表与商业分析),并据此给出明确的技术选型建议。
2数据集说明与获取
本项目已提供现成数据集,无需任何爬虫或下载。数据是一个单文件 CSV,每条样本是一句财经文本,带有 positive / neutral / negative 三分类标签。
数据集:Financial Sentiment Analysis(单文件 CSV)
该数据由 FiQA 与 Financial PhraseBank 两个经典财经语料合并而成,约 5800 条句子,两列:Sentence(财经文本)与 Sentiment(positive / neutral / negative)。原始来源。
- 获取数据:数据下载地址。
import pandas as pd
# 数据已随作业提供,直接本地加载
df = pd.read_csv("./data.csv") # 列:Sentence, Sentiment
df.columns = ["text", "label"] # 统一改名,便于后续使用
print(df.shape)
print(df["label"].value_counts())
print(df.head())
random_state=2026),按 训练集 80% / 测试集 20% 用分层抽样(stratify)划分,保持三类比例一致。所有模型(经典分类器、fastText、大语言模型)必须在同一份测试集上评估,否则对比无意义(见第三讲「数据集划分原则」、第四讲「测试集与交叉验证」)。
3实验任务
把原始财经文本变成可用的输入
- 用正则表达式做基本清洗:统一大小写、去除多余空白、处理数字与百分号/货币符号(如把
+5%、$3.2bn归一化或保留为标记),并简要说明你的清洗规则; - 完成分词,统计语料基本特征:样本总数、三类标签分布、平均句长、高频词 Top-20(建议画一张条形图);
- 用一两句话讨论:财经文本里哪些词(如 surge、decline、loss、record high)可能是强情感信号?
提示: 英文可用 re.findall(r"[a-zA-Z]+|\d+%?", text) 或 nltk;中文用 jieba。
TF-IDF + 朴素贝叶斯 / 逻辑回归
- 用 TF-IDF(第六讲)把文本向量化,分别训练多项式朴素贝叶斯(第四讲,生成式)与逻辑回归(第五讲,判别式);
- 在测试集上报告:混淆矩阵、准确率、各类精确率/召回率/F1、宏平均与微平均 F1(第四讲),并画出混淆矩阵热力图;
- 对逻辑回归做 5 折交叉验证,并比较有无 L2 正则化 的差异,说明正则化的作用;
- 可解释性: 输出逻辑回归中权重最高的若干正面/负面词,验证是否符合财经直觉(如 surge↑、plunge↓)。
提示: 全部用 scikit-learn 即可(TfidfVectorizer、MultinomialNB、LogisticRegression、classification_report、confusion_matrix、cross_val_score)。CPU 几秒到几分钟即可跑完。
用 fastText 学习词向量并直接分类
- 把数据整理成 fastText 的监督格式(每行
__label__<标签> 文本),用fasttext.train_supervised训练分类器;它会联合学习词与子词 n-gram 的嵌入向量,再对文本平均向量做线性分类(第七讲 fastText 文本分类模型); - 在同一测试集上报告准确率与各类精确率/召回率/F1,并与阶段 2 的 TF-IDF 经典模型对比;
- 利用训练好的词向量,用余弦相似度找出与 profit / loss / risk 最相近的若干词(第六讲),并说明 fastText 如何通过子词 n-gram 缓解未登录词(OOV)问题;
- 简要讨论:相比 TF-IDF 稀疏向量,稠密词嵌入在本任务上是否带来提升?为什么?
提示: 安装 pip install fasttext(若编译困难可用 pip install fasttext-wheel)。你既可以在本语料上自行训练,也可以直接使用 fastText 或其他渠道公开发布的预训练词向量(如 fastText 官方的 cc.en.300 等),无需从零训练。语料较小时自训练嵌入质量有限,这一现象本身就值得在报告中讨论。
用提示词工程让 LLM 直接分类
- 从测试集中抽取一个小样本子集(建议 100–150 条,固定下来),调用一个大语言模型进行情感分类;
- 至少对比两种提示策略:零样本(zero-shot) 与 少样本上下文学习(few-shot ICL,提示词中给 3–5 个示例)(第一讲、第九讲);
- 设计规范的提示词,体现第一讲的四要素:任务描述、输入数据、上下文信息、提示风格(角色扮演);并展示、分析一个思维链(CoT)提示示例;
- 在同一子集上,把 LLM 的准确率/F1 与阶段 2、3 的模型对比,讨论:LLM 是否需要训练数据?调用成本与延迟如何?输出是否稳定可控?分类任务中的幻觉风险(第一讲)如何体现?
提示: 教师将在课程钉钉群提供 DeepSeek 的 API Key 供大家完成本阶段实验使用。
方法对比总表
把各阶段的代表性模型汇总成一张表,这是报告的核心。请据此给出分场景的技术选型建议:
| 方法 | 测试集准确率 | 宏平均 F1 | 是否需标注数据 | 可解释性 | 开发/调用成本 | 适用商业场景 |
|---|---|---|---|---|---|---|
| 朴素贝叶斯 + TF-IDF | — | — | 需要 | 高 | 极低 | — |
| 逻辑回归 + TF-IDF | — | — | 需要 | 高 | 低 | — |
| fastText 词嵌入 + 分类 | — | — | 需要 | 中 | 低 | — |
| LLM(zero-shot) | — | — | 不需要 | 中(可给理由) | 高(API/算力) | — |
| LLM(few-shot ICL) | — | — | 几乎不需要 | 中 | 高 | — |
4实验报告要求
报告以学术论文形式撰写,正文不少于 3000 字。建议结构如下:
| 章节 | 内容要点 | 建议字数 |
|---|---|---|
| 摘要 | 研究问题、方法、主要发现与结论(150–250 字) | ~200 |
| 1 引言与商业背景 | 财经情感分析的商业价值、本项目要回答的技术选型问题 | ~450 |
| 2 数据与预处理 | 数据来源、规模、标签分布、清洗与分词方法、探索性分析图表 | ~500 |
| 3 方法 | 用自己的话讲清 TF-IDF、朴素贝叶斯、逻辑回归、fastText 与 LLM 提示策略的原理(配关键公式),说明实验设置 | ~800 |
| 4 结果与分析 | 各模型评估指标、混淆矩阵、可解释性发现、LLM 不同提示策略的对比 | ~700 |
| 5 讨论:技术选型与商业建议 | 基于「方法对比总表」给出分场景建议;讨论可解释性、成本、标注依赖、偏见与幻觉等风险 | ~600 |
| 6 结论与反思 | 主要结论、本项目的局限、后续可改进的方向 | ~300 |
| 参考文献 | 规范引用完成作业中阅读的参考论文、书籍等文献资料 | — |
5提交要求
- 代码: 一个可运行的 Jupyter Notebook(
.ipynb),从数据加载到结果输出可一键复现,关键步骤有中文注释,运行产生的关键结果(指标表、混淆矩阵图、对比总表)。 - 期末论文: PDF 格式,使用课程提供的论文模板(Word导出PDF),含上述全部章节与图表,不少于 3000 字。
- 命名规范:
实验代码.ipynb、期末论文.pdf。 - 提交方式: 上传至杭师大慕课平台的期末作业板块。
6常见问题 FAQ
Q1:工作量大吗?
四个必做阶段中,阶段 1、2 基于 scikit-learn,普通笔记本几分钟即可跑完;fastText 与 LLM 调用也很轻量。请把更多时间留给报告的分析与思考。
Q2:某个模型准确率很低,是不是做错了?
不一定。发现并解释「为什么某方法表现差」本身就是高质量分析。
Q3:报告 3000 字写不满怎么办?
多写「分析」而非「描述」:每张图说明你看到了什么、为什么会这样、对商业决策意味着什么。