ML-For-Beginners NLP 实战:用 TextBlob 对艾米莉·狄金森诗歌做情感分析并与 Azure 文本分析对照(Poetic License 作业全解)
【免费下载链接】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-Translation-Sentiment)的课后作业「Poetic license(诗意的自由)」展开:你将学习如何用TextBlob对艾米莉·狄金森(Emily Dickinson)的 500 余首诗歌进行情感极性分析,并将TextBlob给出的"建议情感"与 Azure 文本分析(Azure Text Analytics)这一更成熟的服务判定进行对照与批判性讨论。读完本文,你将掌握基于词袋特征的文本情感打分方法、句级极性的批量统计脚本,以及评估 NLP 情感模型时"为什么结果会出错"的分析框架。
作业背景:给诗歌做"情感体检"
作业原文(德语版见 translations/de/6-NLP/3-Translation-Sentiment/assignment.md,英文版见 6-NLP/3-Translation-Sentiment/assignment.md)描述了一个非常典型的对比实验场景:
在一个由 jenlooper 发布、收录了 500 余首艾米莉·狄金森诗歌的数据集中,每首诗此前已用 Azure 文本分析完成了情感标注(sentiment analysis)。请使用本课(README)中介绍的技术——即
TextBlob的情感分析——对这一数据集进行分析,并回答:
TextBlob给出的"建议情感"是否与更成熟的 Azure 服务判定一致?为什么一致或不一致?- 有没有让你感到意外的结果?
作业名称 "Poetic license"(诗意的自由/诗学特许)本身就是提示:诗歌是情感表达最浓缩、最"不走寻常路"的文体,恰恰是词面情感与真实情感最容易脱节的场景——这正是检验情感分析算法鲁棒性的绝佳试金石。
该作业位于 NLP 课程的第三课(6-NLP),前序课程已经讲解了如何用TextBlob构建基础 Bot(如名词短语抽取),本课则把焦点转向两大计算语言学难题:机器翻译与情感分析。作业聚焦情感分析部分,但翻译部分提出的"逐词直译会闹笑话"的思想实验,与情感分析"逐词打分会误判"的缺陷在本质上是同一类问题。
前置知识:TextBlob 的情感打分原理
在动手写分析脚本之前,需要先吃透课程正文给出的两个关键概念:极性(polarity)与主观性(subjectivity)。
极性(Polarity)与主观性(Subjectivity)
课程正文(6-NLP/3-Translation-Sentiment/README.md)明确说明:
- 极性:取值
-1 ~ 1,-1为最负面情感,1为最正面情感; - 主观性:取值
0 ~ 1,0表示完全客观(事实陈述),1表示完全主观(观点/感受)。
TextBlob内部封装了机器学习/词典式的打分逻辑,我们无需自建情感计算器,直接调用blob.sentiment即可同时拿到polarity与subjectivity。课程中演示了用《傲慢与偏见》(Pride and Prejudice)首尾两句做情感分析的代码:
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)可以看到:第二句含有loved、warmest gratitude等强正向词,极性得分(0.7)和主观性得分(0.8)都明显更高;而第一句作为客观陈述,两个分数都偏低。极性符号(正/负)与绝对值大小就是我们在诗歌数据集上做批量判定的核心依据。
非 ML 方法的致命弱点:讽刺与反语
课程正文用一个经典例子说明了"只认正负词"的朴素算法的局限:句子Great, that was a wonderful waste of time, I'm glad we are lost on this dark road实际上是一句充满讽刺的负面句子,但简单算法会把great、wonderful、glad计入正向,把waste、lost、dark计入负向,最终被相互冲突的词汇左右,得出错误结论。
这个案例直接预告了诗歌作业中可能出现的现象:诗歌中大量使用反讽、反语、隐喻和非常规搭配,词面情感与真实情感往往错位。这也是课程在"知识检查"(Knowledge Check)中要求你逐一审视《傲慢与偏见》里那些被判为"绝对正向"却读起来并不正向的句子的原因——例如:
Happy shall I be, when his stay at Netherfield is over!("他的离开让我高兴",含有happy却被误判为正向)——本质是在表达对某人离去的高兴,语境是负向的;If I could but see you as happy!(一个愿望式感叹);Our distress, my dear Lizzy, is very great.(含distress,但被词法特征拖向错误方向)。
同理,被判为"绝对负向"的句子则多因出现disgusted、dreadful等词。这套"逐句追问:它理解语义吗?你同意这个分数吗?"的批判性方法,就是诗歌作业的核心分析套路。
分析流程:从数据到结论的四步实现
作业没有要求从零构建情感分类器,而是要求"使用课程中描述的技术"(即TextBlob)进行批量分析。仓库中的参考答案 6-NLP/3-Translation-Sentiment/solution/notebook.ipynb 给出了一套与课程《傲慢与偏见》挑战(check sentiment polarity)完全一致的实现骨架,直接套用于狄金森诗歌即可。
第 1 步:准备数据
对于《傲慢与偏见》挑战,课程给出的步骤是:从 Project Gutenberg 下载文本副本,删除开头和结尾的元数据,只保留正文。诗歌作业同理:先获取狄金森诗歌数据集(作业所指向的 Kaggle 笔记本中已含 Azure 文本分析标注),并按需清洗——去除题录、编号、空行等干扰信息。
# You should download the book text, clean it, and import it here with open("pride.txt", encoding="utf8") as f: file_contents = f.read()注意encoding="utf8"参数:处理非 ASCII 文本(包括狄金森诗中的破折号、引号变体)时必须显式指定编码,否则容易触发解码错误。
第 2 步:构建 TextBlob 并初始化容器
将整份文本一次性喂给TextBlob,它会自动完成分句(sentence segmentation),随后我们遍历其.sentences属性:
from textblob import TextBlob book_pride = TextBlob(file_contents) positive_sentiment_sentences = [] negative_sentiment_sentences = []第 3 步:按极性阈值筛选句子
作业与挑战的约定是:极性为1或-1的句子视为"绝对正向/绝对负向"。遍历全部句子,把命中极端的句子分别收集起来:
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)针对诗歌场景,可以在此基础上升级为区间判断(例如polarity >= 0.5视为正向、<= -0.5视为负向),以覆盖更多"接近绝对"的样本,从而获得更充足的对比语料。
第 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(" ", " ")))replace("\n", "").replace(" ", " ")是为了把分句时残留的换行与缩进压平,让每首诗以单行形式打印,便于人工逐条核对。
对照 Azure 判定:建立差异清单
拿到TextBlob的逐句(或逐首)极性后,与数据集里 Azure 文本分析给出的情感标注对齐:
- 对每首诗,将
TextBlob极性符号(正/负/中性)与 Azure 的情感标签(positive/negative/neutral/mixed)做成一一对应的对照表; - 统计一致与不一致的比例区间,找出系统性偏差(例如:
TextBlob是否在含Heaven、Eternity、Immortality等词的宗教主题诗中系统性偏向正向?); - 对不一致样本做细读(close reading),判断是模型错了、Azure 错了,还是"情感"本身在诗学语境中就是模糊的。
需要强调的是:诗歌的情感极性往往取决于句法结构与修辞意图,而TextBlob的判定主要基于词级特征——这正是课程知识检查反复追问的问题:"情感基于句子中出现的词,但代码真的'理解'这些词吗?"狄金森诗作以大量破折号、非常规大小写、抽象意象著称,其句子结构与《傲慢与偏见》的散文相差悬殊,分词/分句环节的误差会直接传导到情感得分上,这是分析时值得特别记录的现象。
结果解读:四个必须回答的问题
作业要求回答"是否一致、为什么、有什么意外",可以沿以下四个维度组织你的分析结论:
- 总体一致性:两套体系在多大比例上给出相同方向的情感?给出你统计出的数值区间并说明阈值定义。
- 系统性偏差:
TextBlob更依赖显性情感词(happy、sad、dreadful 等),而 Azure 文本分析作为企业级服务,融合了更复杂的模型与多语言资源(课程 Review 部分将其列为"更精细的企业级情感分析系统"的进阶阅读对象),对反讽、否定结构(如 "no joy")通常更敏感。可以从样本中找出能体现这种差异的具体诗句。 - 意外之处:例如某首"看起来黑暗"的诗被双方判为正向,或一首直白悲伤的诗被
TextBlob判为中性——找出 2~3 个最能说明问题的反例,并尝试解释(词汇误导、分句错误、比喻修辞等)。 - 你的立场:课程要求"你是否同意这些分数?"——结合狄金森的写作风格(对死亡的冷静凝视、对自然与永恒的赞颂常同时呈现)讨论:是否存在"模型正确而人类直觉偏差"的情况,以及情感分析在诗歌这种高度主观文体上的本质边界。
评分标准:什么样的作业算"扎实"
作业原文给出了三档评价标准(Rubric),这也是你自查作业完成度的清单:
| 标准 | 优秀(Vorbildlich / Exemplary) | 合格(Angemessen / Adequate) | 待改进(Verbesserungswürdig / Needs Improvement) |
|---|---|---|---|
| 交付物 | 提交一个 Notebook,其中包含对某位作者(狄金森)样例输出的扎实分析 | Notebook 不完整,或未进行分析 | 未提交 Notebook |
所谓"扎实的分析",结合课程正文的判断标准,至少要包含:可复现的清洗与计算代码、批量统计结果、TextBlob与 Azure 判定的逐条对照、对不一致样本的细读解释,以及回答"为什么/是否意外"的书面讨论——即代码 + 数据 + 批判性解读三者缺一不可。
延伸练习与自测
- 将课程中的《傲慢与偏见》挑战(6-NLP/3-Translation-Sentiment/README.md 的 "Challenge - check sentiment polarity" 一节)完整跑通,再迁移到狄金森诗歌上,比较两种文体下"绝对极性句"的数量与质量差异。
- 尝试课程 Review 部分提出的问题:企业场景(如客服邮件分类、舆情监控)如何利用情感分析?结合课程正文中"议员办公室按支持/反对分拣邮件"的例子,思考情感特征(而非语义理解)驱动的模型在真实业务中的价值与风险。
- 用
TextBlob对同一首诗的不同译作做情感对比,把本课翻译部分(blob.translate,底层调用谷歌翻译、需联网)与情感部分串成一条完整流水线,观察翻译前后情感极性是否漂移——这既是本课知识的综合应用,也是诗歌作业最有意思的延伸方向。
最后提醒:本作业的核心不是"跑出一个更高的准确率",而是训练一种对 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),仅供参考