ML-For-Beginners 课后实战:用 TextBlob 复现 Emily Dickinson 诗歌情感分析并与 Azure 文本分析对照
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
本篇文章围绕 ML-For-Beginners 项目第 6 章《NLP》第 3 课"翻译与情感分析"的课后作业(Poetic License,丹麦语翻译版位于 translations/da/6-NLP/3-Translation-Sentiment/assignment.md)展开。作业要求你使用本课介绍的 TextBlob 情感分析技术,重新分析一个包含 500 多首 Emily Dickinson 诗歌的数据集,并将你的本地分析结果与 Azure 文本分析服务给出的"更成熟"的情感判定进行对比。读完本文,你将掌握 TextBlob 的极性(polarity)与主观性(subjectivity)机制、如何批量分析整本书/整个诗集的情感倾向,以及如何批判性地理解词表式情感分析在诗歌这类高度隐喻化文本中的局限。
作业背景:从"诗意许可"到情感分析对照实验
本课作业的丹麦语标题为 "Poetisk frihed"(Poetic license,诗意许可),其核心任务如下:
在 Kaggle 上的这个 notebook 中,你可以找到 500 多首此前已用 Azure 文本分析(Azure text analytics)做过情感分析的 Emily Dickinson 诗歌。使用本课介绍的技术对该数据集进行分析。一首诗给出的情感结果是否与更成熟的 Azure 服务给出的结论一致?为什么一致或为什么不一致?有什么让你感到惊讶的地方吗?
这个任务有三个要点:
- 数据集:Kaggle 上一份由 Jen Looper 整理的 Emily Dickinson 诗歌词频数据集,含 500+ 首诗,每首都预先标注了 Azure 文本分析的情感结论;
- 对照对象:一端是本地运行的 TextBlob(基于词法词典的情感打分),另一端是 Azure 文本分析(大规模机器学习服务);
- 交付物:一份 notebook,对作者(Emily Dickinson)的输出样例做出扎实的分析。
为什么做这个对照:TextBlob 与 Azure 是两种完全不同的"情感理解"
要回答"两种结果是否一致",必须先理解两者在原理上的本质差异。这正是本课正文(6-NLP/3-Translation-Sentiment/README.md)铺垫的知识主线。
词表式方法:数"正面词"和"负面词"
本课指出,一种"非 ML"的情感分析方法,是先人工整理出一批正面词和负面词,然后对一段新文本统计正面、负面、中性词汇的总量来判定整体情感。TextBlob 的情感分析正是这种思路的工程化实现——它内部使用基于标注词表的分类器,为句子中的每个词计算情感权重。
这种方法的弱点在本课中用一个带讽刺意味的例句讲得很清楚:
Great, that was a wonderful waste of time, I'm glad we are lost on this dark road
这句实际是负面的讽刺,但简单算法会把great、wonderful、glad记为正面,把waste、lost、dark记为负面,整体结果被相互矛盾的词"拉来拉去",很容易被误导。
ML 方法:从带标签的语料中学习模式
与之相对,ML 式的情感分析会收集大量"人既给了分数、又写了文字意见"的语料(如推文、电影评论、餐厅点评),让模型学习哪些词与模式更常出现在正面样本或负面样本中。模型并不"理解"内容,它只学到"某些词和模式更可能出现在某一侧"。
Azure 文本分析属于后一种路线的企业级实现,它在超大规模语料上训练,并能理解上下文、否定、讽刺等更复杂的语言现象——这正是本课在"Review & Self Study"中推荐读者进一步研究 Azure Text Analysis 的原因。因此,作业让你对比 TextBlob 与 Azure,本质上是在对比"词表模式匹配"与"大规模学习型模型"在诗歌文本上的表现差异。
复习核心概念:polarity 与 subjectivity
本课定义了两个 TextBlob 情感分析的核心输出指标,作业中的对比也必须围绕它们展开:
- polarity(极性):取值范围 -1 到 1,-1 表示最负面,1 表示最正面;
- subjectivity(主观性):取值范围 0 到 1,0 表示纯客观,1 表示纯主观。
课程中给出的示例程序(同样出现在丹麦语翻译版 translations/da/6-NLP/3-Translation-Sentiment/README.md)展示了如何对《傲慢与偏见》的句子求情感:
from textblob import TextBlob quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" sentiment1 = TextBlob(quote1).sentiment sentiment2 = TextBlob(quote2).sentiment print(quote1 + " has a sentiment of " + str(sentiment1)) print(quote2 + " has a sentiment of " + str(sentiment2))输出示例:
It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8)注意第一句的极性只有约 0.21(轻度正面),第二句达到 0.7(明显正面)且主观性 0.8 很高——可见 TextBlob 的情感得分完全取决于句中词的词表权重,与"读者感受到的文学意味"没有直接关系。
动手实验:用 TextBlob 分析 Emily Dickinson 数据集
作业的实操环节,就是把你刚刚在《傲慢与偏见》上练过的方法,搬到 Emily Dickinson 诗歌上。为了便于复现,仓库中提供了完整参考实现 6-NLP/3-Translation-Sentiment/solution/notebook.ipynb,其核心流程可直接借鉴:
第 1 步:加载并清洗文本
from textblob import TextBlob # 你应下载诗集文本,清洗后在此导入 with open("pride.txt", encoding="utf8") as f: file_contents = f.read()对 Emily Dickinson 数据集做同样处理:把诗歌文本读入为字符串。注意数据集来自 Kaggle notebook(Emily Dickinson Word Frequency),格式可能是 CSV 或逐首诗歌的条目,你需要根据实际字段把每首诗提取成可分析的文本块。
第 2 步:创建 TextBlob 并初始化收集列表
book_pride = TextBlob(file_contents) positive_sentiment_sentences = [] negative_sentiment_sentences = []TextBlob 会把整段文本自动切分为句子(blob.sentences),并逐句给出sentiment.polarity与sentiment.subjectivity。
第 3 步:按极性绝对值筛选句子
for sentence in book_pride.sentences: if sentence.sentiment.polarity == 1: positive_sentiment_sentences.append(sentence) if sentence.sentiment.polarity == -1: negative_sentiment_sentences.append(sentence)这里采用了本课"Challenge"中定义的判定规则:极性恰好等于 1 视为绝对正面,恰好等于 -1 视为绝对负面。对诗歌数据集,你可以把"句子"替换为"整首诗",即对每首诗求整体极性,再与数据集中 Azure 标注的情感标签逐条比对。
第 4 步:分别输出两个列表及数量
print("The " + str(len(positive_sentiment_sentences)) + " most positive sentences:") for sentence in positive_sentiment_sentences: print("+ " + str(sentence.replace("\n", "").replace(" ", " "))) print("The " + str(len(negative_sentiment_sentences)) + " most negative sentences:") for sentence in negative_sentiment_sentences: print("- " + str(sentence.replace("\n", "").replace(" ", " ")))输出阶段做了两个清洗:把换行符\n替换为空,把行首连续空格替换为单个空格,便于阅读。参考实现中该脚本直接读取本地pride.txt(来自 Project Gutenberg 的《傲慢与偏见》全文),作业场景下你只需把数据源换成 Emily Dickinson 诗歌集。
作业的核心论证:结果一致吗?为什么?
完成批量分析后,作业要求你回答三个递进的问题,这也是评判"优秀"(Exemplary)等级的关键:
1. TextBlob 的结果与 Azure 一致吗?
预期会出现大量不一致。原因可以分两层论述:
- 原理层面:TextBlob 是词表驱动的(课程明确说明
TextBlob在后台嵌入 ML,用于名词短语提取等任务,但情感分析依赖标注词表),它不会"理解"整句语义;而 Azure 文本分析是在海量语料上训练的学习型服务,能建模上下文与否定关系。两者对同一首诗打分,机制就决定了差异。 - 文本层面:诗歌比散文更依赖隐喻、意象、倒装与反讽,词面情感(如出现 "rose"、"death"、"light")与作者真实情感未必一致。Emily Dickinson 的诗尤其以"在欢乐词面下讨论死亡与孤独"著称。
2. 哪里会让你惊讶?
典型的"惊讶点"包括:
- 一首表面上描写阳光、玫瑰的诗,TextBlob 给出正极性,而 Azure 依据上下文判定为悲伤;
- 大量"中性"诗歌——TextBlob 的极性趋近 0,因为诗歌用词常常不在情感词典的命中范围内;
- 讽刺或反讽的诗句被 TextBlob 判为正面,正如课程中 "Well, that film was awesome" 的语调实验所示。
3. 如何形成"扎实的分析"?
对照评分标准(见下节),优秀的作业应做到:明确列出抽样诗作、逐首给出 TextBlob 的(polarity, subjectivity)与 Azure 标注的对照表、分析每处差异的具体原因(词表局限?否定词?隐喻?),并对"哪些情况下两者会一致"给出你的推断——例如直白的悼亡诗可能两者都判为负面,而反讽诗最容易产生分歧。
评分标准:什么样的 notebook 算完成
作业自带的评分表(Rubric)是衡量交付物的直接依据:
| 标准 | 优秀(Exemplary) | 合格(Adequate) | 需改进(Needs Improvement) |
|---|---|---|---|
| 交付物 | 提交一份 notebook,并对作者(Emily Dickinson)的样例输出给出扎实的分析 | notebook 不完整,或未执行分析 | 未提交 notebook |
翻译版原文见 translations/da/6-NLP/3-Translation-Sentiment/assignment.md。可见"优秀"的硬性要求有两条:必须是 notebook 形式(可复现的代码 + 输出),以及必须落到对诗人具体作品的分析结论上——只贴代码不解释差异,只能算"合格"。
延伸思考:从本课到企业级情感分析
课程正文在 "Review & Self Study" 中提醒:情感提取有很多方式,想想哪些商业应用会用到这项技术,也想想它可能在哪里出错。结合本次作业,值得延伸的结论有:
- 词表法的适用边界:适合口语化、用词直白的文本(评论、推文),在诗歌、法律文书等高度隐喻或中性措辞的文本上可靠性下降;
- 学习型模型的价值:Azure 这类企业级服务把"上下文、否定、讽刺"纳入了建模,但依然不是万无一失的——这正是作业要你在 Emily Dickinson 数据上亲自验证的;
- 可验证性:本次作业的参考实现(solution/notebook.ipynb)同时验证了"遍历全文、按绝对极性收集句子、分别计数输出"的完整链路,你可把它作为自己 notebook 的结构模板。
最终,这道作业训练的不是"跑通代码",而是建立对情感分析结果的批判性判断力:当两个系统给出不同答案时,你能指出是词表、上下文、还是隐喻造成了分歧——这正是从事 NLP 工程最需要的能力。
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考