news 2026/9/11 3:17:12

ML-For-Beginners NLP 课程:用 TextBlob 实现机器翻译与情感分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ML-For-Beginners NLP 课程:用 TextBlob 实现机器翻译与情感分析

ML-For-Beginners NLP 课程:用 TextBlob 实现机器翻译与情感分析

【免费下载链接】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 课,主题是自然语言处理(NLP)中最具代表性的两个挑战——机器翻译(Machine Translation)情感分析(Sentiment Analysis)。课程以 Jane Austen 1813 年经典小说《傲慢与偏见》(Pride and Prejudice)为贯穿素材:先用TextBlob库把小说的英文名句翻译成法语,再对全书逐句计算情感极性(polarity)与主观性(subjectivity)得分。学完本文,你将掌握:基于规则翻译与基于机器学习翻译的本质区别、TextBlobtranslate()sentiment用法、情感分析中"词袋式"规则方法的致命缺陷,以及如何用 20 行左右 Python 完成一本全书的句子级情感统计。

1. 翻译为什么难:从"形式语法规则"方法说起

人类语言有数千种,各自的语法规则差异极大,因此翻译是一个公认的难题。课程先介绍一种经典的非机器学习思路——把形式语法规则转成语言无关的结构,再翻译回目标语言。这个思路包含两步:

  1. 识别(Identification):把输入语言中的单词标注为名词、动词等词性。
  2. 生成翻译(Create translation):按目标语言的格式,对每个词产出一一对应的直接翻译。

1.1 实例:英语到爱尔兰语

以英语句子I feel happy为例,它的词序是标准的主语(I)→ 动词(feel)→ 形容词(happy)。但在爱尔兰语中,情感(如 happy / sad)被表达为"落在你身上"的状态,同样的意思要说成Tá athas orm,其字面直译是Happy is upon me("快乐在我身上")。

爱尔兰语的正式语序是:

  • 动词(Verb):Tá(或 is)
  • 形容词(Adjective):athas(happy)
  • 主语(Subject):orm(upon me)

一位爱尔兰语母语者翻译成英语时会说I feel happy,而不是Happy is upon me——因为他理解句子的含义,即便单词与句式完全不同。这正说明:逐词直译(naive translation)会严重失真。课程给出了一个生动的反例:I feel happy若被朴素程序逐词翻译成爱尔兰语,会得到Mise bhraitheann athas(字面意为me feel happy),这根本不是合法的爱尔兰语句子——尽管英语和爱尔兰语只隔着一道海峡,它们却是语法结构截然不同的两种语言。

✅ 想一想:你学第二语言时,是否经历过"先用母语思考、逐词在脑中翻译、再说出口"的阶段?朴素翻译程序做的就是这件事,而流利的关键正是跨过这个阶段。

2. 机器学习的翻译思路:忽略词义,只找模式

与规则方法相对,机器学习方法刻意忽略单词的"含义",转而去识别文本中的统计模式。这需要大量的双语对照文本作为训练语料(一个语料称corpus,多个称corpora)。

课程用《傲慢与偏见》举例:若同时拿到英文原著与法语译本,就能发现许多短语是"习语化(idiomatically)"地翻译过去的,而这种对照关系正是模型可以学习的模式。课程还提示了一个经典陷阱——假同源词(false cognate):英语短语I have no money若逐词直译成法语,可能得到Je n'ai pas de monnaie;但monnaie实际含义是"零钱(loose change)",moneymonnaie并不同义。更准确的翻译是Je n'ai pas d'argent

图片说明:本课用这张图直观展示"直译陷阱"——表面相似的单词在不同语言中含义并不等价。(图源:课程作者 Jen Looper)

当模型拥有足够多由精通双语的专家人工翻译过的语料时,它就能通过识别这些翻译中反复出现的模式,显著提升翻译的准确度——这正是机器翻译与传统规则系统最本质的分野。

3. 动手练习:用 TextBlob 翻译《傲慢与偏见》开篇

课程要求使用TextBlob库完成翻译。TextBlob是 Python 生态中一个极简的文本处理库,内部封装了多项 NLP 能力。环境准备(来自本系列第 1 课 1-Introduction-to-NLP 的前置说明):

pip install -U textblob python -m textblob.download_corpora

translate()方法通过to参数指定目标语言代码(如fr表示法语)。尝试《傲慢与偏见》著名的开篇句:

from textblob import TextBlob blob = TextBlob( "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" ) print(blob.translate(to="fr"))

运行结果:

C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!

课程指出,这个结果甚至比 1932 年 V. Leconte 与 Ch. Pressoir 的法语译本更精确。人类译本为了"清楚"而擅自添枝加叶,把原句扩写为:

C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles.

在这个案例里,由 ML 驱动的翻译反而比"过度发挥"的人类译者更忠实于原文。

3.1 原理:TextBlob 背后是什么?

TextBlob本身并不内置翻译引擎——blob.translate在后台调用的是Google Translate,一个能够解析数百万条短语并预测最佳输出的成熟 AI 服务。这意味着两件事:

  • 整个过程没有任何人工干预;
  • 使用translate()必须联网

✅ 试一试更多句子:ML 翻译与人工翻译到底谁更好?分别在哪些场景下成立?

4. 情感分析:规则方法的局限

情感分析是 ML 的另一片主场。非 ML 的"词袋式"方法是:预先标注一批"正面词"和"负面词",然后统计一段新文本中正、负、中性词的加权总值,以此判定整体情感。

这种简单方法极易被欺骗。课程举了一个经典的反讽句:

Great, that was a wonderful waste of time, I'm glad we are lost on this dark road

这句话实际表达的是负面的、讽刺的情绪,但简单算法会看到greatwonderfulglad三个正面词,以及wastelostdark三个负面词,整体判断被这些相互矛盾的词左右,从而得出错误结论。

✅ 停下来想一想:作为人类,我们靠什么传递讽刺?语调(tone inflection)起了很大作用。试着用不同语气说出 "Well, that film was awesome",体会声音如何改变含义。

4.1 ML 方法:让模式自己浮现

ML 的情感分析思路是:先人工收集大量带标签的文本——推文、影评,或任何"用户既给了分数、又写了文字意见"的数据——再用 NLP 技术挖掘文字意见与评分之间的关联模式。例如:正面影评比负面影评更常出现 'Oscar worthy',正面餐厅评论说 'gourmet' 的频率远高于 'disgusting'。

课程用一个政务场景帮助理解(这也是本课程一贯的"公平与实用"视角):假设你在某位政客的办公室工作,需要把市民来信分成"支持新法案"与"反对新法案"两堆。邮件太多读不过来时,可以训练一个模型:用一部分"支持"邮件和一部分"反对"邮件做训练集,模型会学会把某些词与模式分别关联到两边——但它完全不理解内容,只知道某些词更可能出现在哪类邮件里。再用未参与训练的部分邮件检验其判断是否与人类一致,满意之后就能自动处理后续来信。

✅ 这个"训练—验证—部署"的过程,是否和你前面课程中用过的方法很像?(例如 2-Regression、4-Classification 系列中的监督学习流程。)

5. 动手练习:情感极性与主观性

课程给出了情感的两个量化维度:

  • 极性(Polarity):取值 -1 到 1,-1 表示最负面,1 表示最正面;
  • 主观性(Subjectivity):取值 0 到 1,0 表示纯客观,1 表示纯主观。

下面的程序分析《傲慢与偏见》首句与末句的情感:

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(明显正面且主观)——与小说"有情人终成眷属"的结局基调一致。

6. 挑战:统计全书的绝对正负句

课程的核心挑战任务是:用情感极性判断《傲慢与偏见》中"绝对正面"的句子是否多于"绝对负面"的句子。约定:极性为 1 视为绝对正面,-1 视为绝对负面。

官方给出的步骤(文本来自 Project Gutenberg,需下载 .txt 并剔除首尾的元数据,只保留正文):

  1. 下载《傲慢与偏见》纯文本,删除文件开头与结尾的元数据;
  2. 在 Python 中打开文件,把内容读成字符串;
  3. 用全书文本创建TextBlob对象;
  4. 循环分析书中的每个句子:
    • 若极性为 1 或 -1,分别把该句存入"正面句子"或"负面句子"列表;
  5. 最后分别打印两类句子及各自的数量。

6.1 参考实现解读

课程提供了完整的参考实现,见 solution/notebook.ipynb。核心逻辑可拆解为四段:

① 读取文本(对应 notebook 中with open("pride.txt", ...)单元格):

with open("pride.txt", encoding="utf8") as f: file_contents = f.read()

② 构建 TextBlob 并初始化容器

book_pride = TextBlob(file_contents) positive_sentiment_sentences = [] negative_sentiment_sentences = []

③ 逐句扫描,按极性归类(notebook.ipynb 中的循环单元格):

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)

TextBlob.sentences提供句子切分,sentence.sentiment.polarity给出单句极性——整个统计完全复用TextBlob的能力,无需自写情感计算器。

④ 打印结果(含简单清洗,把换行与缩进替换为空格以便阅读):

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(" ", " ")))

6.2 知识检查:模型的判断值得信任吗?

TextBlob的极性基于句子中出现的单词,但代码本身并不理解这些词。课程要求读者批判性地审查结果:

  • 被判定为绝对正面的句子,你同意吗?例如:
    • "What an excellent father you have, girls!"
    • "How wonderfully these sort of things occur!"
    • "I have the greatest dislike in the world to that sort of thing."(注意这句其实含dislike,却被判为绝对正面?值得你亲自运行验证)
    • "I am so happy!"
  • 下面 3 句被判为绝对正面,但细读并非正面句,为什么?
    • "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)
  • 被判定为绝对负面的句子,你同意吗?例如:
    • "Everybody is disgusted with his pride."
    • "The pause was to Elizabeth's feelings dreadful."
    • "It would be dreadful!"

任何一个简·奥斯汀读者都会明白:她常借作品讽刺英国摄政时代社会的荒诞面。主角 Elizabeth Bennett 是敏锐的社会观察者(正如作者本人),语言高度微妙;连 Mr. Darcy 都注意到她爱"发表并非自己真实想法的意见"来取乐:

"I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own."

这正是情感分析(尤其是词袋式规则方法)在文学文本上的软肋:讽刺、反语与语境信息被完全忽略

7. 扩展挑战与作业

  • 🚀 扩展挑战:回到第 1 课的机器人 Marvin(基础实现见 6-NLP/1-Introduction-to-NLP),能否从用户输入中提取更多特征(例如用本课的情感极性),让它变得更"聪明"?
  • 📝 课后作业:Poetic license(详见 assignment.md):使用一份包含 500+ 首 Emily Dickinson 诗歌、且已用企业级情感分析服务标注过的数据集,用本课学到的TextBlob技术重新分析。思考:你得到的情感结论与服务商的结论一致吗?为什么?有什么让你意外的地方?评分标准关注的是"是否提交了一份对作者样本输出做了扎实分析的 notebook"。

8. 回顾与自学建议

从文本中提取情感的方法远不止TextBlob一种。可以思考:

  • 哪些商业应用会受益于情感分析?(舆情监测、客服工单分类、产品评论聚合……)
  • 这项技术在哪里会失灵?(本课的反讽示例就是答案之一)
  • 企业级系统如何做情感分析?Azure 提供了生产级文本分析服务,其内部实现远比单词统计复杂;你可以拿上面《傲慢与偏见》的句子去测试,看它能否捕捉到人类译者与文学评论者能看出的细微差别。

小结

本课通过"翻译"与"情感分析"两个任务,完整呈现了 NLP 中"规则方法 vs 统计/ML 方法"的对照:

维度规则方法机器学习方法
翻译词性标注 + 逐词直译(易产生Mise bhraitheann athas这类错译)从双语语料中学习模式(如 TextBlob 背后的 Google Translate)
情感分析正负词计数(易被反讽欺骗)从带标签文本中学习词与情感的统计关联

配套的完整课程上下文可参考 6-NLP 章节总览,继续深入可接着学习 4-Hotel-Reviews-1(数据准备) 与 5-Hotel-Reviews-2(用 NLTK 做情感分析)——后者会把本课的"玩具级"情感分析升级为真实语料上的完整工程实践。

【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 3:15:34

Python+PyMuPDF批量删除PDF水印:文本、图片、矢量一次搞定

收到一份PDF,打开一看,每一页右下角都压着“内部资料请勿外传”的半透明水印,想打印出来开会,又不想让人看到这个“内部”字样;想直接发给合作方,又怕显得很不专业。手动删?几十页文件一页一页去…

作者头像 李华
网站建设 2026/9/11 3:15:17

ProcessHacker 硬件监控完全指南

ProcessHacker 硬件监控完全指南 【免费下载链接】systeminformer A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solutions, Inc. https://windows-intern…

作者头像 李华
网站建设 2026/9/11 3:15:08

港口车辆双模定位与智能调度系统实践

1. 港口车辆管理现状与痛点分析 港口作为物流枢纽,每天有大量集装箱卡车、叉车、牵引车等特种车辆在有限区域内高频作业。传统管理方式主要依赖人工调度和纸质记录,存在三大核心痛点: 实时定位缺失 :调度中心无法掌握车辆精确位…

作者头像 李华
网站建设 2026/9/11 3:15:01

系统仿真体系化:直流调速模型从开环到单闭环的复用之路

做过系统仿真的人,多多少少都有过一种无力感:模型搭了不少,仿真报告写了一大摞,可真到下一次产品改型时,能直接拿来用的东西没几样。新来的同事接项目,头三个月基本在“考古”,翻历史模型、猜参…

作者头像 李华
网站建设 2026/9/11 3:11:44

智能体工作流引擎的设计与实现:从DAG调度到节点编排实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华