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)得分。学完本文,你将掌握:基于规则翻译与基于机器学习翻译的本质区别、TextBlob的translate()与sentiment用法、情感分析中"词袋式"规则方法的致命缺陷,以及如何用 20 行左右 Python 完成一本全书的句子级情感统计。
1. 翻译为什么难:从"形式语法规则"方法说起
人类语言有数千种,各自的语法规则差异极大,因此翻译是一个公认的难题。课程先介绍一种经典的非机器学习思路——把形式语法规则转成语言无关的结构,再翻译回目标语言。这个思路包含两步:
- 识别(Identification):把输入语言中的单词标注为名词、动词等词性。
- 生成翻译(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)",money与monnaie并不同义。更准确的翻译是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_corporatranslate()方法通过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
这句话实际表达的是负面的、讽刺的情绪,但简单算法会看到great、wonderful、glad三个正面词,以及waste、lost、dark三个负面词,整体判断被这些相互矛盾的词左右,从而得出错误结论。
✅ 停下来想一想:作为人类,我们靠什么传递讽刺?语调(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 并剔除首尾的元数据,只保留正文):
- 下载《傲慢与偏见》纯文本,删除文件开头与结尾的元数据;
- 在 Python 中打开文件,把内容读成字符串;
- 用全书文本创建
TextBlob对象; - 循环分析书中的每个句子:
- 若极性为 1 或 -1,分别把该句存入"正面句子"或"负面句子"列表;
- 最后分别打印两类句子及各自的数量。
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),仅供参考