CMU-11-411-自然语言处理笔记-全-
CMU 11-411 自然语言处理笔记(全)
0


在本节课中,我们将要学习自然语言处理(NLP)的基本概念、课程目标以及相关的教学安排。我们将探讨NLP的定义、重要性、应用领域以及课程的核心内容。
欢迎来到自然语言处理课程 11-411/11-611。我是David Mortonson,是这门课程的讲师之一。另一位讲师是Alan Black,他将进行自我介绍。
大家好,我是Alan Black,就是那位留着长胡子的。我也会讲授部分课程内容。但前几节课将由David主讲。
我们很容易区分彼此:长胡子和小胡子。我的胡子没有那么有特色,也不是永久性的。我无法像甘道夫或邓布利多那样成为小说中的标志性人物。但我对自然语言处理充满热情,并很高兴能向你们介绍这门学科的基础。
在这节课中,我们将介绍自然语言处理是什么,以及本课程将讨论哪些内容。我们还将讨论课程大纲和课程的实际要求,并给你们机会提问,以便更好地了解课程评估方式。
什么是自然语言处理?
你们对NLP一定有所了解,否则不会选这门课。我们对NLP的定义是:自动化地分析、生成和获取人类(即自然)语言。这包含三个部分:
- 分析:NLP中的理解或处理部分。
- 生成:根据某种意义或功能的表示来生成自然语言。
- 获取:从数据中获取表示、必要算法和知识。
有些人用NLP指代所有语言技术,有些人仅用它指代分析。令人困惑的是,有些人将NLP与语音技术分开,认为语言仅指书面语。在本课程中,我们将采取包容的态度,NLP将涵盖分析、生成和获取这三个类别,并且同时包含语音和书面语言。
为什么自然语言处理很重要?
为什么你想学习NLP?一个原因是网络搜索。有一家名为Alphabet的大型公司,它拥有谷歌等众多公司。他们选择Alphabet这个名字,部分原因是因为NLP是他们业务的核心。Alphabet意味着代表语言的字母集合,而语言是人类最重要的创新之一,也是我们使用谷歌搜索进行索引的核心。
不仅仅是谷歌认为NLP重要。许多大小公司都在招聘NLP团队,并支付高薪让他们完成各种自然语言处理任务。所有大型科技公司都有NLP团队。因此,了解NLP是值得的。即使你将来不从事NLP工作,了解它也能帮助你与从事NLP的人交流,并理解其带来的问题和益处。
自然语言处理能做什么?
NLP有哪些实际应用?以下是一些例子:
- 自动小说生成:生成虚构或创意文本。
- 机器翻译。
- 个人数字助理:如Alexa、Siri和Google Home,它们严重依赖NLP。
- 信息抽取:从文本中提取结构化信息。
- 聊天机器人和其他对话系统。
- 情感分析:分析文本背后的情感,例如判断文本是愤怒的还是善意的。
- 问答系统。
- 文本摘要。
- 信息管理:如管理短信、电子邮件和电话留言。
- 理解搜索查询。
- 翻译书籍。
- 自动更正和自动补全:这是NLP的应用,本课程将学习其工作原理和实现方法。
- 写作辅助工具:如Grammarly,帮助改善写作。
- 创意写作:创意文本生成。
- 自动电话:一些自动电话能进行对话,试图让你相信它们是真人。
- 文档翻译。
- 图书馆研究。
- 辅助决策:通过从文本中提取大量信息来帮助做出明智决策。
- 考试评分:许多标准化考试在评分过程中使用NLP。
- 倾听和建议。
- 评估公众舆论:通过爬取在线论坛、扫描Twitter、检测宣传等方式,使用信息抽取和情感分析来评估公众舆论。
- 监听私人电话:理解电话内容并从中提取信息。
- 阅读一切并做出预测。
- 互动式学习辅助。
- 帮助残疾人士、难民和灾民。
- 记录或振兴土著语言。
自然语言处理的职业前景
大多数NLP从业者在工业界工作,为各种公司服务。也有许多人在政府和学术界工作,还有少数人在人道主义组织工作。选择工作时,不仅要考虑薪酬,还要考虑伦理问题,思考你所做的工作对人类是有害还是有益,以及你是否能做得更好。
自然语言处理的详细定义
回到NLP的详细定义,我们可以将其视为自动化语言分析、生成和获取。分析是指将语言作为输入,输出某种可以据此行动的表示。生成则是将这种表示作为输入,输出语言,是相反的过程。获取则是从数据中获取表示、必要算法和知识。
那么,NLP中的“表示”是什么?让我们看下面的图表。这些是语言表示的不同层次。

在底部,你有文本和语音。这是分析时的输入,也是生成时的输出。语言具有丰富的结构,包含多个不同的表示层次:
- 语音学/音系学:语音的表示。
- 正字法:书写系统的表示。
- 形态学:关于词语内部结构的表示。
- 词汇学:关于语言中词语集合(词典)的表示。
- 句法学:关于句子结构的表示。
- 语义学:关于意义的表示。
- 语用学:关于语境中语言使用的表示。
- 语篇学:关于超越句子层次的语言结构的表示。
同一个句子,无论是书面的还是口头的,都可以从所有这些不同的层次来表示。但这非常困难,因为层次之间的映射非常复杂。一个特定的表示是否适合某项任务,取决于你的应用目标。
此外还有其他问题。输入可能是有噪声的。语言表示是理论构建的,我们无法直接观察它们。还存在歧义问题。每个字符串在每个表示层次上都有许多可能的解释。人们非常擅长解决语言歧义,但问题在于我们如何表示上下文以及如何表示可能的选择集合。
另一个问题是丰富性。表达相同意义的方式有很多,而要表达的意义更是数不胜数。我们可以用几乎无限多的不同方式组合词语和短语,以获得不同的意义、句子和语篇。这些层次之间相互影响,存在接口。
最后,人类语言具有多样性。虽然我们表达的意义大致相同,但不同语言表达相同意义的机制可能非常不同。有些语言更喜欢谈论某些意义,或者更适合表达某些类型的意义。
本课程的学习内容
在本课程中,我们将学习模型。模型是什么?它是一个抽象的、理论性的、预测性的构建体,包含三个部分:对世界的部分表示、创建或识别世界的方法,以及关于世界的推理系统。
在NLP中,我们使用许多不同的工具进行建模。有时,非常浅显、不那么复杂的模型效果很好。有时则需要更复杂的模型,这很大程度上取决于你的应用目标。
本课程旨在向你们介绍一些形式化工具,帮助你们在NLP领域导航。它不是介绍当前NLP实践,也不是试图让你们成为最先进的NLP从业者。它旨在为你们提供必要的形式化工具基础,以便你们将来适应NLP实践,或理解过去人们在NLP领域所做的工作。
因此,我们专注于形式化和算法。这不是一个全面的概述,而是对某些关键主题的深入介绍。我们主要关注分析和英语文本,尽管我们也有几节关于语音的讲座,以及几节与非英语NLP相关的讲座。然而,你们将培养的技能适用于NLP的任何子领域。根据经验,我们发现这对于将来在工业界或其他地方从事NLP工作的人来说是一个非常好的入门。
应用与挑战
那么应用呢?这里有一些挑战。应用任务在不断演变,并且通常很难形式化定义。你可能会问,既然应用总是在变化,并且不容易形式化,我们如何弥合这一鸿沟?实际上,这很自然。正因为应用总是在变化,所以建立基础比直接教授应用本身更重要。
还要注意,系统性能的客观评估总是存在争议。评估非常重要,但很少有单一指标来评估你在特定应用上的表现,存在许多相互竞争的评估标准和指标。这既适用于分析本身,也适用于应用任务。
最后,不同类型的应用可能需要不同层次的不同表示。因此你必须灵活,但如果你理解了不同的表示层次以及所使用的不同形式化方法,就更容易为特定应用找到合适的方案。
以下是2020年的一些应用:
- 计算语言学:用计算模型模拟人类的语言能力。
- 信息抽取:如开放信息抽取。
- 问答系统:你们将在本课程的项目中完成。
- 机器翻译:目前非常重要且效果很好。
- 文本摘要:效果一直在提升。
- 观点和情感分析:目前对工业界、学术界和政府应用都非常重要。
- 社交媒体分析:与观点和情感分析密切相关。
- 虚假新闻识别:使用技术来发现不真实的信息。
自然语言处理与计算语言学
这引出了NLP和计算语言学之间的区别。在另一门相关课程中,有人这样评价语言分析:你取了一个美丽的生物,杀死它,然后把它切成碎片。这就是我们在NLP和计算语言学中所做的。
NLP侧重于处理语言的技术。计算语言学侧重于使用技术来支持或实现语言学。这有点像人工智能(更侧重于工程和技术)与认知科学(试图研究大脑以及我们在进行认知时大脑内部发生了什么)之间的区别。
语言表示层次详述
让我们更详细地看看一些表示层次。
形态学是关于将词语分析为有意义组成部分的学科。不同语言具有不同程度的形态复杂性。有些语言被称为分析语或孤立语,如汉语和程度较低的英语,这些语言的词语内部结构不多,大多数词语只有一个意义单位。有些语言是综合语,如芬兰语、土耳其语或希伯来语,这些语言的词语内部结构非常丰富。
词汇学涉及词典。一个问题是如何将文本分割成词语。在汉语中,通常认为每个字符代表一个词,但这并不完全正确。词语作为存储在人类心理词典中的单位,以及需要作为单位存储在NLP词典中的单位,通常大于一个字符。进行这种分析需要了解词典,即词语的存储库。
你还需要做其他事情,例如规范化和消歧词语。有些词有多个含义,如“bank”或“mean”。有些词具有许多特定领域的含义。你还会遇到多词表达式,这些表达式由多个词组成,但需要作为一个单一的词汇条目来处理。
英语的一种词汇分析是词性标注,即为每个词分配标签,如名词、动词、形容词等。
句法学涉及句法分析,即给一个符号序列赋予层次或组合结构。这与语言学理论密切相关,这些理论解释了为什么有些句子结构良好而有些则不然。句法也是歧义的,并且歧义会组合性地爆炸式增长。
语义学是将自然语言句子映射到有意义的领域表示的过程,例如机器人命令语言、数据库查询或形式逻辑表达式。范围歧义是语义学中的一个例子,例如“a seat is available to every customer”可以表示有一个座位,也可以表示每个顾客都有一个座位。超越特定领域是人工智能的目标之一,即能够以非领域特定的方式做到这一点。
语用学和语篇学。语用学是语境中的语言使用。例如,如果你说“Can you pass the salt?”,在语境中它实际上是一个请求,甚至是告诉某人递盐。我们如何让计算机知道这一点?我们赋予它们语用学知识。还有其他类型的语用推理。
语篇学是关于句子层次之上的内容。文本、对话、多方对话都涉及语篇,并且都很困难。
课程管理信息
本课程的网页地址是上述链接。你也可以通过Canvas访问该网页。我们还使用Piazza。我们使用多个不同的平台,虽然这可能会让你们困惑,但每个平台都有其作用。
教材是《Speech and Language Processing》。我鼓励你们不要获取盗版副本,除非你无法将纸质书送到你的所在地。
讲师是Alan Black和David R. Mortonson。助教是Kinja、Milan、Sbi Mohanti、Yuuhao和Michael Huang。Kit也在。
任何想上这门课的人基本上都可以加入,我们欢迎所有人。你们应该完成阅读,这非常有用。有些计算机科学背景的人可能会反对,因为教材中有很多文字,但这些文字的目的是向你们传达自然语言处理的知识。阅读教材对你们大有裨益。
在作业或其他方面使用教材以外的任何资料时,都需要注明出处。作业必须独立完成,这不包括测验。每周五将发布大约10个测验,需要在周一前完成。我们努力使它们更好,更能衡量你们的学习情况。
还有一个项目,这是本课程最重要的部分之一。当被问及对课程的印象时,这是最积极的回应之一,他们从这个小组项目中学到了很多。我们将在接下来的讲座中详细讨论。
你们需要进行合作,我们希望你们组成四人小组。你们应该立即开始寻找小组成员。项目是关于问题生成和问题回答的。在Piazza上发帖是寻找小组成员的好方法。
成绩大部分是共享的,除非有人确实没有完成工作,我们会重新分配分数。编程语言由你们选择。项目必须在Docker容器中运行,只要它能在AWS实例中运行,你们可以随意选择语言,只需遵循特定的结构以便我们运行。
第一周有作业吗?查看网站上的日程安排,第一次作业在9月3日(周四)布置,9月10日截止。这是一个非常简单的作业,旨在确保你们能够进行基本的编程和文本处理,并阅读文档等。

有任何问题吗?
我建议课前阅读吗?当然。如果课前阅读,你会从讲座中获得更多。我强烈推荐这样做。
组队截止日期通常在第二周结束时。所以请立即开始着手。有时我们需要进行一些调整,因为有人可能退课或其他情况。我们希望在下周末之前基本确定下来。


你们可能会问,我们可以做什么来开始?我们对NLP一无所知,这正是我们选这门课的原因。但事实证明,你们可以做很多事情,并且通过开始实践会学到很多。


让我们看看你们关心的部分。这是评分评估。将有两场期中考试,各占成绩的15%,分别覆盖课程的前半部分和后半部分。
项目同样重要,占成绩的30%。这是一个为期整个学期的四人小组项目,并且是竞争性的,我们稍后会讨论。部分成绩(不是大部分)来自你们在与其他系统生成和回答问题比赛中的表现。
将有七次作业,主要是小型编程作业,在学期的大部分周中布置,占成绩的25%。
将有测验,占成绩的15%。将有10次Canvas测验,在大多数周末发布,大约包含5到10个问题。这些测验旨在帮助你们自我评估,确保你们完成阅读、观看讲座并做必要的事情以在课程中取得成功。
我们将去掉两次最低的作业成绩和三次最低的测验成绩。但我们不接受迟交作业,除非在特殊情况下。这样,当你们生病或旅行无法完成时,可以使用这些去掉的机会。
关于混合教学的一些说明可能不适用,因为现在日程有所改变,我们可能有足够的时间在规定时间内完成讲座。我们不会进行预录讲座,但会录制所有讲座并在线发布,以便无法同步参加的人观看。
感恩节假期后,所有课程都将远程进行。根据情况,变化可能更早发生。但至少在一段时间内,我们将进行面对面教学,并与远程教学同步进行。我们有一个特殊的教室,应该具备特殊功能,使我们能够有效地做到这一点。
任何学生都可以在学期的任何时间转为远程学习,无需通知或获得教学团队的许可。但是,如果你想转为面对面学习,则必须获得许可。
我们使用不同的技术完成不同的事情:Zoom用于进行实时复习课,YouTube用于分发录制的讲座,Piazza用于传播课程信息和回答学生问题,GradeScope用于评分作业和管理考试,Canvas用于提供成绩簿访问、提交小组作业和收集私人链接。
我理解处理五件不同的事情可能会让很多人感到烦恼,但这是我们制定的方案,似乎对本课程有效。这些工具中没有哪一个能单独提供我们需要的所有功能。
如果你有残疾,我们鼓励你与我们交谈,以便我们开始做出安排,但你也应尽快在本周与残疾资源办公室联系,以便做好所有安排。
关于学生健康。我们正在经历非常困难的一年。冠状病毒让许多人感到孤立和孤独,并打乱了一切。我们希望你们照顾好自己,尽力保持健康的生活方式,饮食健康、锻炼、避免毒品和酒精、保证充足睡眠,并尝试花时间放松。我知道你们是CMU的学生,但你们仍然可以放松,而不是一直工作。这将对你们有帮助。但我们所有人都在挣扎时都需要支持。如果你们中任何人需要为这类困难提供便利或需要额外帮助,请告诉我们。如果你知道有人因生活事件或焦虑、抑郁等情绪而承受巨大压力,请寻求支持,有咨询和心理服务可以帮助你。同时,尝试向你信任的朋友、教职员工或其他人寻求帮助以获得支持。
这里还有一份关于多样性的声明。我们希望每个人都感到受到尊重,无论他们以何种方式表现出多样性。如果你觉得因为与讲师、助教或其他人的某些不同而受到不良对待,请不要犹豫,联系学生多样性与包容中心。或者,如果你看到其他人以这种方式受到虐待,你也可以使用Report It进行在线举报。
如果是面对面授课,则有特定的课堂出勤政策。我们鼓励每个人参加同步课程,这对你们有帮助,但出勤不是必须的,无论是面对面还是远程。但如果你面对面参加,必须佩戴口罩。如果你不始终佩戴口罩,将采取以下步骤:你将被要求戴上口罩;如果你说没有口罩,将被引导到校园内的分发点;如果你不戴上口罩,将被要求离开并通过远程方式访问课程;如果你拒绝离开,将被移交给学生行为办公室。你可能会被CMU开除,课程将被取消并转为远程进行。

关于教学大纲有什么问题吗?我没有关注聊天,所以得回看一下。另一场期中考试被列为“期末”,但它不是综合性的期末考试,而是第二场期中考试。测验主要是选择题,尽管有些是公式或简答题。还有什么关于测验的问题吗?关于教学大纲或课程还有其他问题吗?
考试有固定的时间窗口吗?通常我们有一个时间窗口,但我们有多个窗口。对于当时不在北美的人,我们可能有另一个时间窗口,也许是匹兹堡时间的早上,以便亚洲、欧洲或非洲的人参加考试。

还有其他问题吗?好的,我非常高兴你们这学期能选这门课。我认为这将是一个很棒的学期,我很高兴我们有这么多学生。我认为我们将有一些非常好的项目和非常好的体验。如果你有任何问题,请在Piazza上发帖。也请花时间看看Canvas,确保你对那里的一切都熟悉。但如果你有任何问题,请在Piazza上发帖,助教会回答他们知道的问题,如果他们不知道,他们会把问题转给我或Black教授,我们会尽快给你答复。保重。抱歉,我被聊天分散了注意力。祝你们下午愉快。
2:NLP应用与核心技术

在本节课中,我们将学习自然语言处理(NLP)的几个核心应用领域:信息抽取、信息检索和问答系统。我们将探讨这些任务的基本概念、实现方法以及评估方式,为后续深入学习打下基础。
信息抽取:从文本到结构化数据
信息抽取的目标是从非结构化的文本中提取结构化信息,并填充到预定义的关系数据库中。其核心输入是文本,输出是填充好的数据表。
命名实体识别
命名实体识别是信息抽取的基础步骤,旨在识别文本中属于特定类别的专有名词,如人名、组织名、地点等。
上一节我们介绍了信息抽取的整体概念,本节中我们来看看命名实体识别的具体实现。
命名实体识别通常被建模为一个序列标注任务。我们将文本分割为词元(大致相当于单词),并为每个词元分配一个标签,表示它是否属于某个命名实体以及在该实体中的位置。
以下是常见的标注方案(IOB格式):
- B-PER: 表示一个人名实体的开始。
- I-PER: 表示一个人名实体的内部。
- B-ORG: 表示一个组织名实体的开始。
- I-ORG: 表示一个组织名实体的内部。
- O: 表示不属于任何命名实体。
例如,在句子 “President Donald Trump met…” 中:
- “President” 被标注为
B-PER - “Donald” 被标注为
I-PER - “Trump” 被标注为
I-PER - “met” 被标注为
O
使用B(开始)和I(内部)标签是为了区分相邻的不同命名实体。
指代消解与实体链接
在识别出命名实体后,我们需要理解这些提及指向现实世界中的哪个具体实体。
- 指代消解:确定文本中不同的提及(如“约翰·爱德华兹参议员”和“爱德华兹”)是否指向同一个实体。
- 实体链接:将文本中的命名实体提及链接到知识库(如维基百科)中对应的唯一实体条目。
关系抽取
关系抽取旨在发现文本中实体之间满足的特定关系,例如“成员_of”、“位于”、“已婚_to”等。
这是一个比命名实体识别更复杂的任务,因为它通常需要理解句子的语义和上下文,而不仅仅是识别词汇模式。一种简单的方法是使用自举法:从少量种子模式或实体对出发,迭代地发现新的模式和实体对。
系统评估:精确率、召回率与F1值
在构建了NLP系统后,我们需要客观地评估其性能。对于分类任务(如命名实体识别),常用的评估指标是精确率、召回率和F1值。
上一节我们探讨了如何从文本中抽取信息,本节中我们来看看如何衡量这些抽取系统的优劣。
评估需要基于人工标注的“黄金标准”数据。我们将系统输出与黄金标准进行比较。
以下是核心评估指标的定义:
- 精确率:衡量系统找出的结果中有多少是正确的。
精确率 = 系统正确识别的数量 / 系统识别出的总数 - 召回率:衡量所有正确的结果中,系统找出了多少。
召回率 = 系统正确识别的数量 / 黄金标准中存在的总数 - F1值:精确率和召回率的调和平均数,是综合衡量指标。
F1 = 2 * (精确率 * 召回率) / (精确率 + 召回率)
为什么不用准确率?因为在诸如命名实体识别的任务中,大多数词元都不是实体,一个总是预测“非实体”的愚蠢系统也能获得很高的准确率,但这显然不是一个好系统。精确率和召回率能更好地反映系统在目标类别上的表现。
信息检索:向量空间模型
信息检索的核心是从大量文档集合中找出与用户查询相关的文档。向量空间模型是解决此问题的基础方法。
上一节我们学习了如何评估NLP系统,本节中我们转向信息检索,看看如何让计算机理解文档的相关性。
其核心思想是将文档和查询都表示为高维空间中的向量。
- 每个维度对应词汇表中的一个唯一词语。
- 向量的每个位置的值是该词语在文档(或查询)中出现的次数(词频)。
- 这构成了一个词袋模型,它忽略了词语的顺序。
为了衡量文档与查询的相似度,我们计算它们对应向量的余弦相似度。余弦相似度关注的是向量之间的夹角,而非长度,因此能避免长文档仅仅因为包含更多词语而获得更高分数的问题。


在实际应用中,我们常使用TF-IDF(词频-逆文档频率)对向量进行加权。TF-IDF倾向于给那些在少数文档中频繁出现(因此可能更具代表性)的词语更高的权重。
问答系统:检索与答案生成
问答系统是NLP的一个重要应用,它直接回答用户用自然语言提出的问题。一个典型的基于检索的问答系统流程如下。
上一节我们介绍了信息检索的基础,本节中我们来看看如何利用它来构建一个问答系统。
以下是构建问答系统的基本步骤:
- 问题处理:
- 将自然语言问题转换为可用于检索的查询向量(使用向量空间模型)。
- 对问题进行分类(例如,是“是什么”事实型问题,还是“是否”判断型问题)。
- 文档/段落检索:
- 在一个文档集合(知识库)中,将每个文档或段落(如句子)也表示为向量。
- 计算查询向量与所有文档/段落向量的余弦相似度。
- 根据相似度得分对文档/段落进行排序,返回最相关的几个。
- 答案生成:
- 从排名最高的相关段落中,抽取出具体的答案片段。
- 例如,对于问题“西弗吉尼亚州最大的城市是什么?”,如果检索到段落“西弗吉尼亚州最大的城市是宾夕法尼亚州的匹兹堡。”,系统应返回“匹兹堡,宾夕法尼亚州”,而不是整个句子。
问答系统常使用平均倒数排名作为评估指标。它衡量的是正确答案在系统返回的答案列表中的排名位置,排名越靠前(倒数越小),得分越高。
总结

本节课中我们一起学习了自然语言处理的三个核心应用领域。我们了解了信息抽取如何将文本转化为结构化数据,包括命名实体识别、指代消解和关系抽取等子任务。我们掌握了使用精确率、召回率和F1值来评估NLP系统性能的方法。我们还探讨了信息检索的向量空间模型,以及如何利用它构建一个基本的问答系统。这些基础概念和流程为后续更深入的NLP学习以及课程项目实践奠定了重要的基础。
3:项目介绍与指南 🎯

在本节课中,我们将学习课程项目的目标、要求、评估方式以及关键的时间节点。项目包含两个核心任务:基于维基百科文章生成高质量问题,以及基于文章和问题生成高质量答案。
项目概述 📋
项目的目标是:给定一篇维基百科文章,生成N个高质量的问题;或者,给定一篇维基百科文章和一系列问题,从文章中生成高质量的答案。
上一节我们介绍了项目的总体目标,本节中我们来看看如何定义“好问题”与“坏问题”。
什么是好问题?🤔
好问题应该能从给定的文章中直接找到答案。以下是一些好问题的例子:
- 匹兹堡以什么闻名?(城市桥梁)
- 匹兹堡有多少座摩天大楼?
- 匹兹堡位于哪个州?
- 匹兹堡的人口是多少?
- 匹兹堡的昵称是什么?
以下是生成好问题的一种方法:使用模板。例如:
- 句子结构为
X is Y,可生成问题What is Y? - 句子结构为
The X verbs Y,可生成问题What does the X verb? - 对于包含数字的句子,可以生成基于数量的问题。
什么是坏问题?🚫
坏问题通常无法从文章中直接找到答案,或者答案的推导过程过于复杂。以下是一些坏问题的例子:
- 法国的首都是哪里?(信息不在文章中)
- 这篇文章的第57个字母是什么?(无意义的问题)
- 为什么匹兹堡有30座摩天大楼?(无法从文章中推断原因)
- 匹兹堡的三条河是什么?(信息隐含,需要复杂推理)
如何生成答案?💡
对于问题生成,可以采用基于模板的方法。对于问题回答,则有多种方法。
上一节我们讨论了问题生成,本节中我们来看看问题回答的常见方法。
一种简单的方法是基于模板。例如,对于问题 What is X?,在文章中寻找 X is Y 这样的模式,然后回答 Y。
更高级的方法是基于抽取的技术。你可以使用向量文档模型,在文本中寻找可能包含答案的片段,然后将其处理成最终答案。
一个可行的起点是构建一个基于信息检索的问答系统。
项目评估方式 📊
项目将由同学进行同行评估。具体流程如下:
- 项目结束时,你的代码会被打包成Docker容器运行在未见过的文章上,生成一系列问题。
- 这些问题会被随机分发给班上的其他同学进行评估。评估标准包括:流畅性(语法正确、表达地道)、合理性和可回答性。
- 评估出的最佳问题会被输入到你的问答系统中,你的系统将生成答案。
- 这些答案会再次被评估,标准包括:正确性、智能性(正确且合理)和流畅性。
具体任务与输入输出格式 ⚙️
以下是两个任务的具体要求:
任务一:问题生成
- 输入:一篇维基百科文章的文本,以及一个整数
N。 - 输出:
N个关于该文章的、不同的、流畅且合理的问题。 - 命令行示例:
./ask <article> <N> - 注意:
N通常在10到30之间,但具体数字每次运行可能不同。
任务二:问题回答
- 输入:一篇维基百科文章的文本,以及一个关于该文章的问题列表。
- 输出:每个问题对应的答案。答案应流畅、正确、智能。
- 命令行示例:
./answer <article> <question_file>
重要时间节点与交付物 🗓️
以下是项目进程中的关键节点:
- 9月24日:项目初步计划。提交一份一页纸的计划,描述团队策略。
- 10月22日:项目进度报告。提交一个简短的视频报告,展示进展。
- 11月17日:项目试运行。提交可运行的代码(Docker文件),确保程序能正确执行
ask和answer命令。 - 12月3日:最终代码提交。提交完整的项目代码(Docker文件)。
- 12月10日:最终项目报告。提交一个总结性的视频报告。
规则与资源 📚
在开始项目前,请了解以下规则和可用资源:
允许事项:
- 可以使用任何库或工具包(除以下列出的例外)。
- 可以阅读并借鉴相关研究论文,但必须注明引用。
禁止事项:
- 不能使用黑盒语法检查器(如果自己实现则可以)。
- 不能使用包含问题答案的外部知识库(如数据库)。
- 程序在运行时不能访问互联网(所有操作必须在Docker容器内完成)。
可用资源:
- 课程将提供五个领域的维基百科文章作为开发数据。
- 寻找研究论文的好去处是 ACL Anthology(计算语言学协会文集)。
组队建议与分工 👥
请在本周内完成组队。建议:
- 在Piazza上寻找队友,并简要介绍自己。
- 考虑寻找相同时区的队友,以便协调会议时间。
- 在项目结束后,我们会通过调查了解各成员贡献度,并据此调整成绩。


总结 ✨
本节课中我们一起学习了课程项目的核心内容。我们明确了项目的两个主要任务:生成高质量问题和生成高质量答案。我们探讨了“好问题”与“坏问题”的区别,介绍了基于模板和基于抽取的解决方法。我们还详细了解了项目的评估流程、关键时间节点、必须遵守的规则以及可以使用的资源。

请立即开始组队并讨论项目初步计划。我们期待看到你们提出的创新想法和完成的优秀项目!如有任何问题,请通过邮件或Piazza联系我们。
4:词汇与形态学

在本节课中,我们将要学习自然语言处理中的一个基础层面:词汇与形态学。我们将探讨词汇的内部结构、形态学的不同类型,以及如何利用有限状态技术来处理形态学问题。
概述
形态学研究词汇的内部结构。与生物学中研究生物体形态不同,语言学中的形态学关注词汇的构成单元——语素。理解形态学对于自然语言处理至关重要,因为它能帮助我们识别词汇的底层统一性,并利用形态变化中编码的信息。
什么是形态学?
上一节我们介绍了形态学的概念,本节中我们来看看它的具体构成。
形态学是关于词汇内部结构的学科。词汇并非不可分割的原子单位,它们可以分解为更小的、有意义的单元,这些单元称为语素。
语素主要分为两种类型:
- 词根:承载词汇的核心意义。
- 词缀:附加在词根上以修改其意义或添加额外信息。
词缀有四种类型:
- 前缀:附加在词根之前,如
pre-(在…之前,如prenuptial)或ir-(不,非,如irregular)。 - 后缀:附加在词根之后,如
-s(复数)、-er(施事者)或-ize(使…化)。 - 中缀:插入到词根中间。英语中较少见,但在其他语言中很常见。
- 环缀:同时附加在词根的两侧。
形态学的类型
形态变化不仅限于简单地将语素拼接在一起,还存在非拼接性形态学。
以下是两种主要的形态学功能类型:
- 屈折形态学:为词汇添加与句子上下文一致的信息,如数(单数/复数)、格(主格/宾格)、动词时态或一致性(数、性)。例如,
walk->walked(过去时),fox->foxes(复数)。 - 派生形态学:通过添加词缀创造出具有新意义、甚至新词性的全新词汇。例如,
parse(解析)->parser(解析器,名词),repulse(排斥)->repulsive(令人厌恶的,形容词)。
为什么形态学对NLP重要?
形态学对自然语言处理而言,既是一个挑战,也是一个信息来源。
一方面,屈折形态学会使同一个词呈现不同的表面形式,这给信息检索、信息抽取等任务带来了问题,因为它掩盖了底层的统一性,可能导致数据稀疏。
另一方面,形态学编码了大量有用信息,对于机器翻译、自然语言理解、语义角色标注等任务,尤其是在形态丰富的语言中,这些信息至关重要。
有限状态形态学
为了处理形态学,我们需要在词汇的书写形式(正字法形式)和其词条形式(词典形式加特征集)之间建立映射。有限状态转换器是实现这种映射的强大工具。
在深入FST之前,我们先回顾其更简单的亲戚:有限状态自动机。
有限状态自动机由五个部分组成:
- Q:有限状态集合。
- q0:特殊的初始状态。
- F:终止状态集合(F ⊆ Q)。
- Σ:有限的字母表(符号集合)。
- δ:状态之间的转移函数,标记来自Σ的符号。
FSA定义了一组能被识别的字符串集合,即正则语言。
有限状态转换器在FSA的基础上进行了扩展,用于实现输入字符串到输出字符串的转换。
FST同样包含Q、q0、F,但它有两个字母表:
- Σ:输入字母表。
- Δ:输出字母表。
其转移标记为 输入符号:输出符号。当经过一个转移时,它从输入带读取输入符号,并向输出带写入输出符号。
构建形态分析器
在为一个语言构建形态分析器时,通常将其分为两部分,分别用FST实现:
- 语素结构规则:规定语素如何组合。它处理词条与词缀的拼接。例如,规则可能规定动词词根后接
-ing构成现在分词。 - 语素变体/正字法规则:规定语素在组合时,其书写形式或发音如何变化。例如,英语中“辅音双写”(
bag->bagging)、“e删除”(make->making)等规则。
这两个FST可以通过“复合”操作组合成一个大的FST。FST的一个重要特性是可逆性:你可以交换每个转移上的输入/输出符号,从而得到一个进行相反方向转换(如从分析变为生成)的FST。
此外,对FST还可以进行多种操作,如串联、克林闭包、并集等。其中,复合操作最为重要,它相当于将第一个FST的输出作为第二个FST的输入,从而创建一个新的、功能复合的FST。
总结

本节课中我们一起学习了自然语言处理中的词汇与形态学。我们了解了语素作为词汇最小意义单元的概念,区分了屈折形态学和派生形态学,并认识到形态学在NLP中既是挑战也是资源。最后,我们重点介绍了有限状态自动机和转换器,以及如何利用它们来高效地分析和生成词汇的形态变化,这是处理形态丰富语言的一项基础且重要的技术。
5:语言模型与平滑技术

在本节课中,我们将学习语言模型的基本概念,这是一种用于预测下一个单词或评估句子“像英语”程度的工具。我们将从简单的模型开始,探讨如何对它们进行评分、改进以及训练的相关方面。
什么是语言模型?
语言模型是自然语言处理中的一个特定概念。它是一种表示方法,允许我们预测下一个单词是什么,或者根据模型来评估一个给定句子有多“像英语”或有多合适。我们希望获得一个衡量句子好坏的标准。这个标准可以是一个概率值,也可以是一个置信度分数,好的句子得分高,差的句子得分低。
例如,句子“This is a pen”是一个好句子,它有动词“is”、主语“This”和宾语“a pen”。而“pen this is a”则不是一个好句子。语言不仅仅是单词的堆砌,它们具有内在的结构,例如主谓宾的顺序和一致性。我们希望语言模型能给“This is a pen”打一个高分,给“pen this is a”打一个低分。
评估翻译质量
考虑一个中文句子的四个英文翻译:
- He briefed two reporters on the chief contents of the statement.
- He briefed reporters on the chief contents of the statement.
- He briefed two reporters on the main contents of the statement.
- He briefed reporters on the main contents of the statement.
我们的目标是让一个自动系统能够判断哪个翻译是最好的英文句子。虽然这四个句子都传达了基本含义,但有些听起来更自然。例如,“briefed two reporters”听起来可能不如“briefed reporters”自然。语言模型可以帮助我们自动选择最佳翻译。
概率论基础
我们将依赖概率论来构建语言模型。这里简要回顾一些基本概念:
- 随机变量:一个具有分布特性的变量。
- 概率表示:
P(X = x)表示随机变量X取值为x的概率,通常简写为P(x)。 - 联合概率:
P(X=x, Y=y)表示X取值为x且Y取值为y的概率。在句子中,单词之间通常不是独立的。 - 条件概率:
P(X=x | Y=y)表示在Y取值为y的条件下,X取值为x的概率。例如,给定前一个词是“president”,下一个词是“of”的概率就很高。
一元模型
一元模型是最简单的语言模型,它只考虑每个单词自身的概率,忽略上下文。一些单词(如“the”)的概率很高,而另一些单词(如“zoo”)的概率则很低。
我们可以通过统计大型文本语料库(如维基百科)中每个单词的出现频率来估计其概率。然后,一个句子的概率可以近似为其中所有单词概率的乘积。
然而,一元模型生成的文本是杂乱无章的,因为它没有考虑单词之间的顺序和关联。例如,它可能生成“L or it tillil the open par eye question mark”这样的无意义字符串。
N元模型
为了考虑上下文,我们引入N元模型。它基于前N-1个单词来预测下一个单词的概率。
- 二元模型:根据前一个单词预测下一个单词。
- 三元模型:根据前两个单词预测下一个单词。
随着上下文长度的增加,模型生成的文本会变得更连贯,但同时也需要更多的数据来训练。N元模型可以被表示为有限状态自动机,其中状态代表上下文,转移弧代表可能的下一单词及其概率。
词汇与未知词
构建语言模型时,我们需要定义词汇表。这引出了几个问题:
- 词汇量:一个人的词汇量大约在1万到2.5万之间,而英语的总词汇量可能达到数百万,包括许多专业术语和地名。
- 什么是词:我们需要决定是否将标点符号(如句号、逗号)视为独立的词,以及如何处理不包含空格的语言(如中文)的分词问题。
- 未知词:任何数据集都是有限的,总会遇到不在词汇表中的词(未知词)。我们需要一种方法来处理它们。
此外,我们还需要特殊的符号来表示句子的开始和结束,例如 <s> 和 </s>。
模型评估:困惑度
我们需要一个标准来评估不同语言模型的好坏。常用的指标是困惑度。困惑度衡量的是模型预测测试集的能力,数值越低表示模型越好。
困惑度的计算公式基于概率,可以理解为模型在预测下一个词时的平均分支因子(即平均有多少个可能的选择)。例如,《华尔街日报》文本的三元模型困惑度约为109,意味着平均在每个上下文中,大约有109个可能的后续单词。
平滑技术
一个关键问题是,当我们在训练数据中从未见过某个N元序列时,其概率会被估计为0。这会导致整个句子的概率为0,并且无法比较包含未知序列的句子。为了解决这个问题,我们使用平滑技术。
以下是两种常见的平滑方法:
- 加一平滑:在计算所有N元序列的计数时,简单地给每个计数加1(或加一个小的常数)。这确保了没有概率为零的情况。虽然简单,但效果不错。
- 古德-图灵平滑:一种更精细的方法。它根据观察到的频率分布来估计未出现事件(N元序列)的概率。基本思想是:用出现一次的事物的部分概率来“补贴”从未出现的事物。
其他实用技巧
在实践中,我们还会用到以下技巧:
- 回退与插值:当高阶N元模型(如三元组)没有数据时,可以回退到低阶模型(如二元组)的概率。也可以将不同阶的模型概率进行加权组合。
- 对数概率:由于句子概率是许多小数的乘积,结果会非常小,容易导致数值下溢。因此,实际计算中通常使用对数概率,将乘法转换为加法,更加稳定和高效。


本节课中,我们一起学习了语言模型的基本概念,包括一元模型和N元模型。我们探讨了如何评估模型(困惑度),并介绍了处理数据稀疏问题的关键技术——平滑。这些是构建更复杂NLP系统的基础组件。
6:词性标注 🏷️

在本节课中,我们将要学习词性标注的基础知识,包括词性的定义、分类、重要性以及在实际应用中面临的挑战。
概述
词性标注是自然语言处理中的一项基础任务,旨在为句子中的每个单词分配一个词性标签。理解词性对于构建更高级的语言模型至关重要。
词性的定义与重要性
词性,或称词类,是依据单词的分布和形态特征,而非其含义,对词汇进行的分类。这种分类为语言提供了结构,使得我们能够更有效地处理和理解文本。
词性的分类标准
词性分类主要依据两个标准:分布标准和形态标准。
- 分布标准:指单词在句子中出现的位置和上下文。例如,名词通常出现在动词之前作为主语,或之后作为宾语。
- 形态标准:指单词可以接受的前缀和后缀。例如,在英语中,可以添加复数后缀“-s”的通常是名词。
主要词性类别
以下是英语中一些主要的词性类别及其特征。
开放类词性
开放类词性的成员数量可以不断增加,新词很容易被创造出来。
- 名词:可以充当动词的主语或宾语,可以被形容词修饰,通常可以与冠词(如
the,a)连用。例如:book(书),city(城市)。 - 动词:可以带名词短语作为论元(如主语、宾语),可以有时态变化(如过去式
-ed),可以被副词修饰。例如:run(跑),think(思考)。 - 形容词:可以修饰名词(定语用法),也可以在系动词后描述主语(表语用法)。部分形容词有比较级(
-er)和最高级(-est)变化。例如:big(大的),smart(聪明的)。 - 副词:主要修饰动词、形容词或其他副词。例如:
quickly(快速地),very(非常)。
封闭类词性
封闭类词性的成员数量相对固定,很少增加新词。
- 介词:出现在名词短语之前,表示名词与句中其他成分的关系。例如:
in(在…里),from(从…)。 - 限定词:出现在名词短语的开头,包括冠词(
the,a)和指示词(this,that)。例如:the cat(这只猫)。 - 代词:用于替代名词短语。例如:
he(他),it(它)。 - 连词:用于连接词语、短语或句子。例如:
and(和),because(因为)。 - 助动词:与主要动词连用,表达时态、语态等。例如:
is(是),have(有),can(能)。
词性标注的挑战
尽管词性有明确的定义,但在实际标注中仍面临一些挑战。
- 一词多性:许多单词根据上下文不同,可以属于多个词性。例如,单词
run既可以是动词(I run),也可以是名词(a long run)。 - 新词问题:语言中不断出现新词(如专有名词、网络新词),标注器在训练时可能从未见过这些词,需要有能力根据上下文推断其词性。
- 细粒度分类:根据任务需要,词性标签的粒度可以很粗(如
名词),也可以很细(如专有名词、复数名词)。常用的宾州树库标签集包含近60个标签。
总结


本节课我们一起学习了词性标注的核心概念。我们了解到词性是依据分布和形态而非意义定义的语法类别,分为开放类和封闭类。词性标注任务虽然基础,但由于存在一词多性、新词等挑战,并非微不足道。它为语言模型提供了更一般的结构信息,是后续许多NLP任务的重要基础。
7:隐马尔可夫模型

在本节课中,我们将学习隐马尔可夫模型。这是一种用于序列建模和标注的通用表示方法,特别适用于词性标注任务。我们将了解如何结合词的固有信息和上下文信息,来自动确定句子中每个词的词性。
概述:词性标注的重要性
词性标注是自然语言处理中的一项基础任务。它允许我们减少符号数量,通过关注词的语法功能而非具体词汇来捕捉语言的普遍规律。这对于减少训练机器学习任务所需的数据量非常有用,因为它将成千上万个不同的词压缩到大约10到50个词性标签中。
从示例开始:一个歧义句子
我们以一个精心构造的句子作为运行示例:Bill directed plays about English kings。
我们通常将其理解为:一个名叫Bill(William的简称)的人,他导演了关于英国国王的戏剧。对应的词性标注应为:
- Bill:专有名词
- directed:动词
- plays:复数名词
- about:介词
- English:形容词
- kings:复数名词
然而,这个句子中的每个词都可能存在歧义:
- Bill:可以是专有名词、动词(“寄账单”)或名词(“账单”)。
- directed:可以是动词或形容词(“被导演的”)。
- plays:可以是复数名词或动词。
- about:可以是介词、副词或小品词。
- English:可以是形容词或名词。
- kings:可以是复数名词或动词(如国际象棋中的“王车易位”)。
我们的目标是利用从数据中学习到的概率,结合上下文信息,自动选择最合理的词性序列。
隐马尔可夫模型简介
隐马尔可夫模型类似于带概率的有限状态自动机。它包含以下组成部分:
- 一个开始状态和一个结束状态:用于标记序列的起始和结束。
- 一组状态:可以理解为词性标签。
- 一个有限的词汇表:即所有可能被观察到的词。
- 状态转移概率:从一个状态(词性)转移到下一个状态的概率。
- 发射概率:在某个状态下生成(观察到)某个特定词的概率。
噪声信道模型
我们可以通过噪声信道模型来理解隐马尔可夫模型在词性标注中的应用。
我们观察到的词序列(例如 “Bill directed plays…”)是输出。我们想要发现的是背后不可见的、产生这些词的词性标签序列。
这里有两类关键信息需要结合:
- 先验概率:词性标签序列本身的概率。这类似于一个语言模型,它告诉我们某个词性序列(如“专有名词-动词-名词”)出现的可能性有多大。这个概率可以在看到具体句子之前就计算好。
- 后验概率/似然概率:给定某个词性标签,观察到某个特定词的概率。例如,给定标签是“动词”,词是“directed”的概率是多少?这个概率是在我们看到具体词之后才起作用的。
我们的目标是找到最可能的隐藏标签序列(Y),给定观察到的词序列(X)。根据贝叶斯规则,这等价于最大化 P(Y) * P(X|Y)。由于对于给定的句子X,P(X)是常数,我们可以忽略它。
计算最可能路径
理论上,我们可以枚举所有可能的词性路径,计算每条路径的联合概率 P(标签序列) * P(词序列|标签序列),然后选择概率最高的那条。
例如,对于句子“Bill directed plays…”,我们需要计算诸如“专有名词-动词-复数名词-…”和“专有名词-形容词-动词-…”等所有路径的概率。
然而,这种方法计算量巨大。如果一个句子有N个词,每个词平均有K个可能的词性,那么路径总数是 K^N,对于长句子这是不可行的。
维特比算法:高效搜索
幸运的是,我们不需要计算所有路径。维特比算法利用动态规划的思想,高效地找到最可能路径。
其核心观察是:当我们从左到右处理句子时,对于当前位置的每个可能状态(词性),我们只需要保留到达该状态的最优路径(即概率最高的路径)。那些非最优的路径,无论后续如何,其总概率都不可能超过从最优路径延续下去的概率。因此,我们可以安全地“剪枝”掉这些非最优路径。
以下是该算法的简要步骤:
- 初始化:计算第一个词所有可能词性的概率(结合先验和发射概率)。
- 递推:对于句子中的第 i 个词,考虑其每个可能的词性标签。对于每个这样的标签,检查所有可能的前一个词性标签(来自第 i-1 个词),计算从每个前驱状态转移到当前状态并发射当前词的概率。只保留对于当前状态来说概率最高的那条路径。
- 终止:处理完所有词后,在最后一个词的所有可能状态中,选择概率最高的那个。
- 回溯:沿着保留的指针回溯,即可得到整个最可能的词性标签序列。
通过这种方式,我们将指数级复杂度降低到了与 (句子长度 * 标签数^2) 相关的多项式复杂度。
处理未知词
在实际应用中,我们会遇到训练数据中未出现过的词(未知词)。简单的处理方法是将其视为一个特殊的“未知词”标记,并估计它在不同词性下的发射概率。
更高级的方法会利用词的形态特征:
- 以大写字母开头的词更可能是专有名词。
- 以“-ed”结尾的词更可能是动词过去式。
- 包含数字的词可能是一个数字或部件号。
- 通过分析词缀、大小写等信息,可以更好地估计未知词的词性概率。
训练数据与跨语言挑战
英语词性标注通常使用宾州树库进行训练,它包含了手工标注的《华尔街日报》文本。但这带来了领域和时代局限性。
对于新语言,构建词性标注器面临挑战:
- 资源稀缺:需要语言学家手工标注数据,成本高昂。
- 形态丰富:许多语言有复杂的形态变化,同一个词干可能有多种形式,这既是挑战(需要更多数据),也是机遇(形态本身常包含词性信息)。
无监督与半监督词性标注
为了减少对标注数据的依赖,研究者开发了无监督方法。其核心思想是:在相似上下文环境中出现的词,往往具有相同的词性。
一种常见方法是布朗聚类。它不依赖于任何语法知识,仅根据词的共现上下文,将词汇表中的词聚类成一棵二叉树。聚类结果中,兄弟节点或附近子树中的词在语义或语法上通常相似。虽然我们不知道每个聚类具体对应什么词性,但得到的类别对于许多下游任务(如语言模型、信息抽取)非常有帮助。
我们可以先用无监督方法(如上下文聚类或布朗聚类)得到词的粗粒度类别,然后利用这些类别作为特征,或者由语言学家快速映射到标准词性集上,从而加速标注过程。
实际应用中的注意事项
在实现维特比算法时,我们通常在对数概率空间中进行计算,而不是直接使用概率。这是因为概率值通常很小,连续相乘可能导致下溢(数值归零)。使用对数概率可以将乘法转换为加法,避免了这个问题。通常我们使用负对数概率,这样最优路径就对应着总和最小的路径(因为概率越高,负对数概率越小)。
是否使用词性标注取决于具体任务:
- 优点:能有效减少特征空间,捕捉语法规律,对数据量小的任务尤其有益。
- 考量:如果任务数据充足,或者预训练模型已经隐含了语法信息,额外的词性标注可能收益不大。同时,要评估标注器在目标领域(如社交媒体文本 vs. 新闻文本)的性能。
总结
本节课我们一起学习了隐马尔可夫模型及其在词性标注中的应用。
- 我们首先了解了词性标注的意义,它能通过语法类别对词汇进行泛化。
- 我们通过一个歧义例句,引出了结合词本身偏好(发射概率)和上下文规律(转移概率/先验概率)的必要性。
- 我们介绍了隐马尔可夫模型的基本框架和噪声信道模型的视角。
- 我们认识到暴力枚举所有路径不可行,从而引入了高效的维特比算法,它利用动态规划剪枝非最优路径。
- 我们讨论了如何处理未知词,以及构建标注器所面临的数据挑战。
- 最后,我们探讨了无监督方法(如布朗聚类)如何帮助资源稀缺的语言或领域快速获得有用的词类别信息。

词性标注是NLP中一项经典且实用的技术,理解其背后的HMM模型和维特比算法,有助于我们掌握序列标注任务的基本思路。
8:句法分析 🧠

在本节课中,我们将要学习自然语言处理中的一个核心概念:句法。我们将探讨什么是句法,它与语义有何不同,并介绍两种主要的句法表示方法:成分句法和依存句法。理解句法是让计算机理解“谁对谁做了什么”的关键一步。
什么是句法?🤔
上一节我们介绍了课程的整体框架,本节中我们来看看句法的基本概念。
句法研究的是如何将单元组合在一起。在编程语言中,句法定义了如何将不同的令牌(如命令、关键字和值)合法地组合成更大的结构(如语句)。它关注的是组合的规则,即形式。语义则关注这些结构的意义,即它们在程序运行时会产生什么效果。编译器或解释器通常能捕获句法错误,但很少能捕获语义错误。
对于自然语言而言,句法和语义的区分同样存在。句法处理的是词语如何组合成短语,以及短语如何组合成句子,它只关乎结构。语义则关乎意义。
一个著名的例子是乔姆斯基的句子:“Colorless green ideas sleep furiously.”(无色的绿色思想愤怒地睡觉。)这个句子在句法上是完全正确的,但在语义上是无意义的,充满了逻辑矛盾。这清楚地表明句法和语义是两个独立的概念。
句法的核心概念:成分与短语 🌳
上一节我们区分了句法和语义,本节中我们来看看句法分析中的两个重要概念:成分和短语。
一种看待句子结构的方式是将其视为一系列嵌套的成分,就像一棵树。每个子树都是一个成分,即句子中比其他词语关系更紧密的一组词。比单词大的成分我们称为短语。短语可以包含其他类型的短语或同类型的短语,因此这是一种嵌套且可能递归的结构。
以下是几种重要的短语类型:
- 名词短语:由一个或多个词组成,作为一个整体起到名词作用的单位。例如,“the elephant”、“it”、“the big ugly elephant”。名词短语可以很复杂,例如“the elephant I love to hate”,其中包含了一个句子(“I love to hate”),这被称为关系从句。
- 介词短语:由介词(如 on, in, under)和一个名词短语组成。结构为:
PP -> P NP。例如,“under the leaking roof”。 - 句子/从句:句子是一种可以独立存在的从句。从句也可以是更大句子的一部分,例如关系从句(修饰名词)或补语从句(作为动词的补充)。
为了形式化地描述这种嵌套和递归的结构,我们需要比有限状态机更强大的工具:上下文无关文法。
上下文无关文法 📝
上一节我们了解了短语的嵌套结构,本节中我们来看看如何用形式化的工具——上下文无关文法来描述它。
上下文无关文法包含以下组成部分:
- 终结符集合 Σ(通常是词汇)。
- 非终结符集合 N(代表短语或词性类别)。
- 一个特殊的开始符号 S(通常代表句子)。
- 一组产生式规则,形式为
X -> α,其中 X 是一个非终结符,α 是由终结符和非终结符组成的字符串。
在句法分析中,非终结符主要有两种:
- 代表短语的符号,如 NP(名词短语)、VP(动词短语)。
- 代表词性的预终结符,如 N(名词)、V(动词)。
终结符就是具体的单词。推导过程从开始符号 S 出发,不断应用产生式规则,直到所有符号都转化为终结符。解析树是推导过程的图形化表示。
上下文无关文法可能产生歧义,即同一个词串可以有多个不同的解析树和推导过程,通常对应不同的含义。
合乎语法性:理论与现实 ⚖️
上一节我们介绍了形式化的文法,本节中我们探讨一个关键概念:合乎语法性。
“合乎语法”描述的是一个句子是否属于某种语言。这有两种理解:
- 形式语言角度:一个句子是否能够由某个自动机或文法生成。
- 人类语言角度:一个句子是否被说话者内化的语法规则所接受。
重要的是,合乎语法性考虑的是语言的所有形式方面(音系、形态、句法),而不包括语义。不同说话者内化的语法规则可能不同,导致对同一个句子是否“合乎语法”判断不一。例如:
- “I’m done my homework.” 在一些方言中可接受,在另一些中则不行。
- 匹兹堡英语中,“It needs washed.” 是常见的,而其他方言可能说 “It needs to be washed” 或 “It needs washing”。
这种语法变异使得构建鲁棒的自然语言处理系统更具挑战性。
为什么需要句法分析?🎯
上一节我们讨论了语法的主观性,本节中我们来看看为什么句法分析在自然语言处理中至关重要。
考虑以下几个句子:
- Oswald shot Kennedy.
- Kennedy was shot by Oswald.
- Oswald, who shot Kennedy, was shot by Ruby.
要确定“谁枪击了谁”,计算机需要理解句法。在第一句中,主语是 Oswald;在第二句的被动语态中,主语变成了 Kennedy,但施事者仍是 Oswald。在第三句的复杂结构中,需要理解关系从句的修饰关系。句法分析是获取句子结构表示的第一步,进而帮助我们识别主语、宾语等语法关系,并最终推断出施事、受事等语义角色。
主语、宾语与依存语法 🔗
上一节我们看到了句法对理解语义关系的重要性,本节中我们深入探讨主语、宾语的概念,并介绍另一种句法表示法:依存语法。
关于主语,存在一些常见的误解:
- 误解1:主语是句子的第一个名词短语。(并不总是)
- 误解2:主语是动作的执行者(施事)。(在被动句中,主语是受事)
- 误解3:主语是句子谈论的话题(主题)。(主题可能与主语不同)
主语是一个句法概念,而非语义概念。在英语中,主语通常与动词保持一致性,代词采用主格形式。
依存语法提供了一种不同于成分句法的视角,它强调词与词之间的二元依存关系。在一个依存关系中,一个词是核心词,另一个词是依存词,它们之间的弧被标记为“主语”、“宾语”等关系。例如,动词通常是句子的根节点,主语和宾语是其依存词。
与成分句法相比,依存语法能更直接、清晰地展示语法关系,跨语言时结构也更相似,因此当前在自然语言处理中应用非常广泛。许多解析器(如斯坦福解析器)能同时输出两种表示。
总结与展望 📚
本节课中我们一起学习了自然语言处理中的句法分析。
- 我们首先区分了句法(结构)和语义(意义)。
- 然后介绍了成分和短语的概念,以及如何使用上下文无关文法进行形式化描述。
- 我们探讨了“合乎语法性”在形式理论和现实语言使用中的不同含义。
- 接着,我们理解了句法分析对于推断“谁对谁做了什么”这一语义理解任务的关键作用。
- 最后,我们辨析了主语和宾语的句法本质,并介绍了能清晰表示语法关系的依存语法。
上下文无关文法虽然可能不足以完全捕捉自然语言的所有句法现象,但其计算性质良好,便于构建高效的解析器。在后续课程中,我们将学习如何从数据中学习概率上下文无关文法,并探讨更强大的句法模型。

本节课中我们一起学习了句法的基本概念、形式化表示方法及其在自然语言理解中的重要性。掌握句法分析是构建能够深度理解语言的人工智能系统的基石。
9:乔姆斯基层级 🧠

在本节课中,我们将要学习形式语法和乔姆斯基层级。我们将从最受限的正则语法开始,逐步介绍上下文无关语法和上下文相关语法,并探讨它们与不同自动机(如有限状态自动机、下推自动机)的对应关系。最后,我们将讨论自然语言在乔姆斯基层级中的位置。
形式语法概述
为了理解乔姆斯基层级,我们首先需要了解形式语法。我们已经讨论过一种形式语法,即上下文无关语法。现在,我们将讨论形式语法的更一般化概念。
一个形式语法 G 包含以下几个部分:
- 一个终结符词汇表,记作 Σ。
- 一个非终结符集合,记作 N。
- 一个特殊的起始符号 S。
- 一组产生式规则。
根据语法的不同类型,你可以拥有不同种类的产生式规则。例如,正则语法有一种产生式规则,上下文无关语法有另一种,上下文相关语法又有不同的类型,直到一种等价于图灵机的语法,它允许你将任何东西重写为任何东西。
形式语法 G 定义了一种形式语言,我们通常将其记作 L(G),即由语法 G 生成的语言。
正则语法
能够生成无限字符串集的最受限的形式语法是正则语法。正则语法有两种形式:右线性语法和左线性语法。对于任何右线性正则语法,都存在一个生成相同字符串集(即接受相同语言)的左线性正则语法,反之亦然。因此,右线性和左线性语法之间总是存在等价关系。
以下是右线性语法的样子。你可以有两种规则:
- 将一个非终结符重写为一个终结符。
- 将一个非终结符重写为一个终结符后跟一个非终结符。
正是第二种规则提供了递归性,允许你用有限的正则语法生成长度无限的字符串。
左线性语法具有相同的约束,但规则是相反的:非终结符被重写为非终结符后跟终结符,只是颠倒了这两个元素的顺序。
所有可以由正则语法描述的语言(即可用正则语法生成的字符串集),都同时拥有右线性和左线性语法。
你可能会问,为什么它们被称为“正则”语法?这与正则表达式有关。正则语法识别的语言集,与真正的正则表达式识别的语言集完全相同。回想我们在词法学部分讨论有限状态机时,有限状态自动机也等价于正则表达式。因此,这三者——有限状态自动机、正则语法和正则表达式——在表达能力上是等价的,它们都描述了完全相同的语言族。
以下是一个正则语法的例子,它生成一个或多个 A 后跟一个或多个 B。
- 起始符号是 S。
- S 可以重写为
aA或aB。 - A 可以重写为
aA或aB。 - B 可以重写为
b或bB。
对应的正则表达式是 a+ b+(+ 符号来自实用的正则表达式记法,并非原始的克林记法)。
L(G) 可以被有限状态机识别。这意味着任何有限状态自动机都可以被确定化和最小化,使得每个状态对每个终结符最多只有一个出弧。但为了做到这一点,你可能需要创建一个非常庞大的、具有 2^N 个状态的 FSA。它也可以被最小化,以找到接受相同语言的最小状态和弧集。
正则语法和有限状态机有时被用于实现正则表达式。但有时它们无法实现。如果你实现了像“向前看”这样的功能,你就不再拥有真正的正则表达式,你可以识别不属于 L(RG) 的非正则语言。因此,你不能直接单独使用有限状态机或正则语法来实现,必须使用其他不那么优雅的机制。
上下文无关语法
我们已经讨论过上下文无关语法,它比正则语法更强大,即它可以识别正则语法能识别的所有语言,以及更多。
与只有两种规则类型不同,上下文无关语法可以有多种规则类型。它们的共同点是,规则的左侧只能有一个非终结符,但规则的右侧可以是任何东西。
这对于表达括号嵌套之类的事情非常有用,例如数学表达式中的括号:(2 * (3 + 1)) + 5。你能用正则语法智能地处理这个表达式,或者描述这类表达式的集合吗?答案是不能。你需要某种形式的内存来跟踪已经经过了多少个左括号和右括号。正则表达式没有办法做到这一点。基于同样的逻辑,正则语法也无法做到。但上下文无关语法可以处理这个问题。
以下是一个用于算术表达式的上下文无关语法示例(A 和 B 代表加法和减法)。括号嵌套通过一条规则来表达,该规则生成开括号、内容和闭括号,然后你可以在其中包含这些符号的任何组合,无论是括号内的还是括号外的。
CFG 比正则语法更强大,因为任何你在正则语法中能有的规则,在 CFG 中也能有,而且 CFG 还允许这些其他很酷的东西。L(CFG) 可以被下推自动机识别。下推自动机之于上下文无关语法,就如同有限状态自动机之于正则语法。它们就像有限状态自动机,但带有一种有限的内存——下推栈,这使得它们能够处理这类括号嵌套的情况。
上下文无关语法也可以被规范化,这在学习解析算法时很重要。有一种形式叫做乔姆斯基范式。在乔姆斯基范式中,任何上下文无关语法都可以被重写,并且只有三种规则:
- 非终结符重写为空(ε)。
- 非终结符重写为终结符。
- 非终结符重写为两个非终结符。
任何上下文无关语法都可以被规范化为乔姆斯基范式,有时它会变得大很多,但这总是可能的。
大多数编程语言实际上是上下文无关语言。它们可以用上下文无关语法描述。事实上,有些语言使用上下文无关解析器进行解析,它们的正式规范通常用上下文无关语法来表述。但也有例外,例如 C++ 由于模板语法的原因,其解析甚至需要解决停机问题,因此不能完全用上下文无关语法描述。
上下文相关语法
上下文相关语法的规则形式如下:α Nt β -> α γ β。其中,Nt 是被重写的东西,γ 是它被重写成的结果,而 α 和 β(规则左右两侧的部分)是上下文。因此,这个 Nt 只有在出现在这两个非终结符之间时,才会被重写为 γ。这就是“上下文相关”的含义。
在上下文相关语法中,规则的左侧可以有多个符号,但其中只有一个符号被重写,其他的是左右上下文。
在音系学(研究语言声音结构和模式的语言学分支)中,传统上使用上下文相关规则。它们写成这样:A -> B / X _ Y(斜杠表示“在...的语境中”)。例如,N -> M / _ P or B(N 在 P 或 B 之前重写为 M)。这些都是上下文相关规则,重写只发生在特定语境中,但你只修改目标,不修改语境。
具有讽刺意味的是,正如你可能从词法学部分注意到的那样,我们将这些规则写成了有限状态转换器。事实上,几乎所有在语言中描述过的音系规则都可以用有限状态转换器实现。这意味着我们使用了一个比必要强大得多的形式体系来完成这件事。
上下文相关语法对应的语言可以被一种称为线性有界自动机的自动机识别。它们的处理可能困难得多,因为解析开销很大,并且可能存在大量虚假的歧义。因此,我们喜欢在可能的情况下避免使用上下文相关语法,因为它会引入这些问题。
广义重写规则与乔姆斯基层级
然后是广义重写规则。在这些规则中,两侧可以有任意数量的符号,可以将任何东西重写为任何东西。这些规则等价于图灵机,因此可能是难以处理的,但功能非常强大。
我们可以将所有不同类型的语言和自动机放入一个层级结构中。顶层(0 型语言)包含所有其他类型。1 型(上下文相关)包含除 0 型外的一切。2 型(上下文无关)包含 3 型。3 型(正则语言)是最受限、限制最多的。基本上,规则的限制越严格,语言族(语言类别)就越受限,自动机也越简单。
这就是乔姆斯基层级。你可能会想,这里提到的“轻度上下文相关”和对应的“线程自动机”是什么?我们稍后会回到这个问题。
我们想要做的是努力证明特定语言是或不是正则的,或者不是上下文无关的。我们使用一种称为“泵引理”的证明方法来做到这一点。实际上,有针对正则语言的泵引理,也有针对上下文无关语言的泵引理。
对于正则语言的直觉来自 Jurafsky & Martin 第 533 页:如果一个正则语言有任何长于自动机状态数的字符串,那么该语言的自动机中必然存在某种循环。我们可以通过证明如果一个语言没有这样的循环,那么它就不可能是正则语言,来利用这个事实。换句话说,如果你要生成无限数量或非常长的字符串,并且没有任何重复模式,那么如果你没有任何循环,你就无法用正则语法生成该语言。该语言至少必须是上下文无关的。
我们可以用这个来证明某些语言不是正则的。例如,考虑英语中像“The cat the dog chased likes tuna fish.”这样的嵌套结构。支持这些句子的人认为,尽管由于大脑内存限制,处理起来很困难,但它们仍然是合乎语法的英语句子。其背后的观点是,英语不是正则语言。为什么?因为这些句子具有类似 a^n b^n 的结构模式(例如,n 个名词短语对应 n 个动词短语)。你能用正则语法或正则表达式描述 a^n b^n 吗?你不能无限继续而没有循环。根据泵引理,这种语言不可能是正则的。


自然语言与轻度上下文敏感性
现在回到乔姆斯基层级图。我们知道有些语言至少是上下文无关的。问题是,所有语言都是上下文无关的吗?或者有些语言是否需要更强大的自动机来识别?有一种观点认为,在 1 型和 2 型之间存在一个层级,即“轻度上下文相关”语言。
对于人类语言(自然语言)来说,是否有任何自然语言是上下文无关的?有人认为乔姆斯基遗漏了一些东西,实际上存在这个“轻度上下文相关”的星号,并且有些自然语言是轻度上下文相关的,而不是完全上下文无关的。但也许没有语言是完全上下文相关的,这很好,因为处理上下文相关语言将是一场噩梦。
最初支持这一观点的论据来自瑞士德语。瑞士德语中有一种称为“交叉序列依存”的结构。例如,在句子中,动词与宾语的关系不是简单的嵌套,而是交叉对应。这种模式无法用上下文无关语法来捕捉,它需要比上下文无关更强大的形式体系,但又不需要上下文相关语法的全部功能,是介于两者之间的东西。
因此,即使英语也可能不是完全上下文无关的。例如,“分别”结构(Alice, Bob and Carol will have a beer, wine and a coffee respectively)在语义上建立了交叉对应关系。
语言学家和计算机科学家得出的结论是,自然语言是轻度上下文相关的。这对英语来说可能不完全正确,英语在很大程度上是上下文无关的,只有一些特殊结构例外。然而,这对瑞士德语和一些其他语言(如某些荷兰语变体)是成立的。即使在有这种结构的语言中,上下文相关结构的使用频率也相对较低,并且其深度往往受到实际记忆能力的限制。
那么,我们关心语言不一定是上下文无关这个事实吗?对于许多应用来说,CFG 可能就足够了。即使你处理的是瑞士德语,CFG 可能仍然足够。它们具有很大的优势:在计算上比上下文相关语法(甚至是轻度上下文相关语法)更容易处理,易于理解和推理,并且解析算法也易于实现。
但退一步说,对于很多应用来说,实际上正则语法就足够了。由于句法中的这些递归结构受到工作记忆的限制,人们实际说出和写出的句子通常可以用一个足够复杂的有限状态机来建模。一旦编译完成,有限状态机可以线性时间运行,这比任何上下文无关解析算法都要好得多。另一方面,它们是“扁平”的,不能将句子解析为嵌套的组成成分(除了向一个方向分支)。解析树总是看起来像一条链。
课程总结


本节课中,我们一起学习了乔姆斯基层级和形式语法。我们从最基础的正则语法及其与有限状态自动机、正则表达式的等价关系开始,然后探讨了更强大的上下文无关语法及其对应的下推自动机。我们还了解了上下文相关语法和广义重写规则,并将它们组织成乔姆斯基层级。最后,我们讨论了自然语言在层级中的位置,认识到自然语言通常被认为是“轻度上下文相关”的,但对于大多数实际应用,上下文无关甚至正则语法模型通常已经足够。理解这些不同语法类别的能力和限制,对于选择适合特定自然语言处理任务的工具和模型至关重要。
10:上下文无关识别

在本节课中,我们将要学习上下文无关语法在自然语言处理中的应用,特别是识别和解析的概念。我们将重点介绍一种名为CKY(或CYK)的特定算法,并探讨其工作原理、前提条件以及如何将其从识别算法扩展为解析算法。
概述
解析是自然语言理解中的重要环节,它有助于从句子结构过渡到语义分析。上下文无关语法非常强大,可以用于识别和解析,并且能与多种解析算法结合使用。本节课,我们将深入探讨CKY算法及其所需的乔姆斯基范式。
为什么需要解析?
你可能会认为,不需要解析,仅通过匹配词的模式(例如使用正则表达式)就能完成所有工作,甚至实现部分自然语言理解。然而,考虑以下句子:
The student who was taught by Alan Black won the prize.
如果仅进行表面字符串匹配,可能会错误地认为“Alan Black won the prize”。但通过解析,我们可以正确地将“the student who was taught by Alan Black”识别为一个独立成分(名词短语),然后与“won the prize”结合。这说明了解析的重要性:它能正确分析句子的层次结构。
虽然本节课主要学习识别,但CKY算法稍作修改即可变为解析算法。
上下文无关语法定义
一个上下文无关语法包含以下组成部分:
- 终结符集合 Σ:例如单词。
- 非终结符集合 N:例如表示短语类型或词性的符号。
- 起始符号 S:通常代表句子。
- 产生式规则:形式为 X → α,其中 X 是一个非终结符,α 是由终结符和非终结符组成的序列。
识别与解析问题
给定一个句子 W 和一个语法 G:
- 识别 是判断句子 W 是否属于语法 G 所定义的语言。
- 解析 是找出句子 W 在语法 G 中的一个或多个推导(即分析树)。
解析可以被视为一种搜索过程。自底向上解析从句子开始,搜索通往起始符号 S 的路径;自顶向下解析则从 S 开始,搜索能推导出该句子的路径。
搜索算法框架
一个通用的识别搜索算法框架如下:
- 初始化一个议程,包含初始状态(例如状态0)。
- 当议程非空时:
- 从议程中弹出一个状态 S。
- 如果 S 是成功状态,则返回 S(识别成功)。
- 如果 S 不是失败状态,则从 S 生成所有可能的新状态,并将其加入议程。
- 如果议程为空仍未找到成功状态,则返回“否”(识别失败)。
这个框架过于通用,需要结合具体语法和策略来实现。
语法示例与乔姆斯基范式
一个语法通常包含两部分:语法规则(非终结符到非终结符序列)和词典规则(非终结符到终结符)。为了使用CKY算法,语法必须转换为乔姆斯基范式。
在乔姆斯基范式中,每条产生式规则只能是以下两种形式之一:
- A → B C (一个非终结符推导出两个非终结符)
- A → w (一个非终结符推导出一个终结符)
- (有时也允许 S → ε,即起始符号推导出空串,但非必需)
任何上下文无关语法都可以通过引入新的非终结符被转换为等价的乔姆斯基范式语法,尽管规则数量可能会增加。
CKY算法详解
CKY是一种基于动态规划的自底向上识别算法。它使用一张表格来记录所有可能的成分。
以下是算法的核心步骤:
初始化
遍历句子中的每个单词 w_j,在表格的对角线位置 table[j-1, j] 中,填入所有能推导出该单词 w_j 的非终结符 A(即应用所有 A → w_j 形式的词典规则)。
组合推导
接下来,我们按长度递增的顺序遍历所有可能的子串跨度。对于跨度 [i, j],我们寻找一个分割点 k (i < k < j),使得存在语法规则 A → B C,并且非终结符 B 出现在 table[i, k] 中,非终结符 C 出现在 table[k, j] 中。如果找到,则将非终结符 A 加入到 table[i, j] 中。
检查成功
最终,如果起始符号 S 出现在覆盖整个句子的单元格 table[0, n] 中(n为句子长度),则识别成功。
让我们通过一个例子“book this flight through Houston”来可视化这个过程。算法首先标注每个词的词性,然后逐步组合成更大的短语(如名词短语、介词短语、动词短语),最终判断能否构成一个句子(S)。
从识别到解析
CKY本质上是一个识别算法。要将其变为解析算法,只需在向表格单元格添加非终结符时,同时记录回溯指针。这些指针指明了当前成分是由哪两个子成分通过哪条规则组合而成的。识别完成后,从顶层的 S 符号出发,沿着回溯指针向下展开,就能重建出完整的分析树。
算法复杂度与比较
CKY算法的时间复杂度是 O(n³ * |G|),其中 n 是句子长度,|G| 与语法大小相关。这是一个确定的上界(最坏情况复杂度)。对于自然语言处理,存在平均性能更优的算法(例如Earley算法),但CKY因其概念清晰、易于实现和理解,是学习解析算法的良好起点。
总结

本节课我们一起学习了上下文无关语法在识别和解析中的应用。我们了解了识别与解析的区别,介绍了自底向上和自顶向下的解析思路。我们重点学习了CKY算法,这是一种基于动态规划和乔姆斯基范式的自底向上识别算法。我们还探讨了如何通过添加回溯指针将CKY扩展为解析算法。最后,我们讨论了算法的复杂度,并指出它是学习更高级解析算法的基础。掌握CKY有助于理解自然语言句法分析的核心机制。
11:解析算法与语法形式

在本节课中,我们将继续探讨上下文无关语法的解析。我们将介绍一些新的算法和解析类型,包括依存解析,并简要提及一些历史上不同的解析方法。我们还将讨论如何为语法规则添加概率,以及如何利用这些概率来选择最佳解析树。
概率上下文无关语法
上一节我们介绍了CKY算法及其在解析中的应用。本节中,我们来看看如何为上下文无关语法添加概率,以便在多个可能的解析之间进行选择。
考虑以下两个句子:
- Book the dinner flight.
- Book the dinner, Flight.
第一个句子更可能表示“预订包含晚餐的航班”,而第二个句子则可能表示“告诉一个名叫Flight的人去预订晚餐”。为了在解析时区分这两种可能性,我们可以为语法规则添加概率。
我们可以为每条规则分配一个概率,表示该规则相对于其他规则的可能性。然后,通过将解析树中所有使用规则的概率相乘,可以计算出整个解析树的概率。这样,我们就可以选择概率最高的解析。
核心概念:在概率上下文无关语法中,每个非终结符的所有扩展规则的概率之和应为1。例如,对于非终结符 NP,其所有规则 NP -> ... 的概率之和为1。
为了在CKY算法中融入概率,我们只需在原有算法的基础上为每个条目添加一个概率分数。我们可以选择保留所有匹配的规则并在最后比较概率,或者在应用规则时进行局部最优选择(虽然这可能错过全局最优解析,但效率更高)。概率通常很小,相乘后会更小,因此实践中常使用负对数概率(-log(p))进行计算,这样可以将乘法转换为加法,并提高数值精度。
解析也可以被视为一种推导过程。我们可以将规则及其概率视为带权重的推导步骤,通过组合这些步骤并累乘其概率,最终得到解析树的权重。
有时我们使用“权重”而非严格的“概率”,因为确保所有权重和为1在理论和实践上可能比较困难。由于我们主要关心解析树的相对优劣(即权重的大小比较),而非其绝对概率值,因此使用权重是可行的。有时,我们甚至会手动调整某些规则的权重以获得更好的解析结果。
Earley算法与图表解析
CKY算法要求语法是乔姆斯基范式,即规则必须是二元分支的。虽然任何上下文无关语法都可以转换为二元分支形式,但这有时不够直观。本节中,我们来看看一个更通用的算法——Earley算法。
Earley算法由Jay Earley于1971年提出,可以处理任意形式的上下文无关语法。它是一种高效的图表解析算法,能够找到所有可能的解析(而不仅仅是最佳解析)。该算法使用一种称为“状态”或“边”的数据结构。
核心概念:Earley算法使用“点规则”。在规则中插入一个点“•”,用以表示解析进度。例如,规则 S -> • NP VP 表示我们正在寻找一个 S,并且刚刚开始,正在寻找 NP。规则 NP -> Det • Nom 表示我们已经找到了一个限定词(Det),正在寻找一个名词短语(Nom)。
每个状态都有起始和结束位置,对应于句子中词与词之间的位置。算法是动态规划的,通过维护一个议程(agenda)和图表(chart)来工作。初始时,会将寻找句子(S)的起始状态放入议程。然后,算法循环处理议程中的状态,应用三个主要操作:
- 预测:如果点的右边是一个非终结符(如
NP),则将所有能展开该非终结符的规则(如NP -> Det Nom)作为新状态加入图表(起始于当前点位置)。 - 扫描:如果点的右边是一个与当前位置单词匹配的终结符(如
book匹配Verb),则创建一个点移动过该单词的新状态。 - 完成:如果一个状态的点已到达规则末尾(如
VP -> Verb NP •),则查找图表中那些点正好位于该状态起始位置、且正在寻找该状态左侧非终结符(如VP)的其他状态,并为它们创建点移动过该已完成成分的新状态。
算法会持续进行,直到议程为空。最终,如果在图表中存在一个从句子开头到结尾、且规则为 S -> ... • 的状态,则解析成功。为了防止左递归规则导致无限循环,需要确保不重复添加相同的状态到图表中。
Earley算法的时间复杂度为 O(n³),空间复杂度为 O(n²)。虽然无法在保证找到所有解析的前提下更快,但可以通过启发式方法加速以在大多数情况下获得可接受的速度。要恢复解析树结构,只需在每个状态中记录其是由哪些子状态推导而来的,解析完成后反向追踪即可。
词汇化语法与中心词
手动编写语法规则非常困难,且容易产生大量规则。本节中,我们来看看如何通过词汇化和引入“中心词”的概念来约束和丰富语法规则。
动词通常有特定的论元结构(及物、不及物、双及物等),并且可能要求特定的介词短语作为间接论元。这称为“子语类化”。为了更精确地描述这些约束,我们可以在规则中引入词汇信息,特别是“中心词”。
核心概念:在一个短语中,“中心词”是该短语最重要的词,它决定了短语的核心属性。例如,在名词短语“the luxury automaker”中,中心词是“maker”;在动词短语“sold 1,214 cars”中,中心词是“sold”。
中心词可以通过一系列语言学规则来确定。例如,在名词短语中,中心词通常是那个可以发生数变化(单数/复数)并与动词保持一致的词。在“the short teachers”中,“teachers”是中心词,它决定了动词要用复数形式“are”。
我们可以创建词汇化的语法规则,将中心词信息编码到非终结符中。例如,规则 NP(maker) -> Det(luxury) Nom(automaker)。这样,规则的概率可以基于具体的中心词来计算,从而减少歧义,提高解析准确性。从已解析的树库中,我们可以自动提取此类规则及其概率。
另一种利用中心词信息的方法是构建“中心词标注树”,即记录每个短语的中心词是什么。这可以进一步细化和区分语法规则。词汇化语法能生成更符合语言习惯的句子。
依存解析
上一节我们介绍了基于成分的解析树。本节中,我们来看看另一种重要的解析表示形式——依存解析。
给定一个词汇化的解析树,我们可以换一个视角来看待它:不再关注S、NP、VP等成分标签,而是关注词与词之间的依赖关系。这称为依存解析。
核心概念:依存树由词与词之间的有向链接构成,表示一个词(中心词)依赖于另一个词。通常,句子的主要动词是根节点。例如,在句子“The luxury automaker last year sold 1,214 cars in the U.S.”中,动词“sold”是根,它依赖于主语“maker”和宾语“cars”。“maker”又依赖于修饰语“luxury”和“automaker”。
依存树是一种树结构,每个词(除了根节点)恰好有一个父节点(其中心词),但一个中心词可以有多个子节点(依赖于它的词)。与成分树相比,依存树更扁平,直接表示了词与词之间的语义关系。
依存解析有几个优点:
- 更易于下游任务使用:对于许多机器学习任务,将依存关系作为特征(例如,每个词及其中心词)比处理复杂的树结构要简单得多。
- 跨语言一致性:依存关系在不同语言中可能比成分结构更稳定。
- 高效解析:存在专门的高效依存解析算法。
从成分树到依存树的转换是明确的(需要定义中心词提取规则),但反向转换则可能丢失信息,因为多个不同的成分树可能对应同一个依存树。
确定中心词有时存在选择。例如,在动词短语“have written”中,中心词应该是“have”还是“written”?在介词短语“picture of my son”中,中心词应该是介词“of”还是名词“son”?这取决于下游任务的需求。有些依存解析器提供不同的中心词定义方案。
近年来,基于神经网络的依存解析器取得了很大成功。例如,斯坦福大学的Dependency Parser使用一个从左到右的神经网络,根据当前上下文决策是建立链接还是将词压入栈中以待后续处理。这种方法不仅准确,而且速度极快,使得大规模文本的依存解析变得可行。
依存树通常以图形方式绘制,但为了输入机器学习模型,常被编码为如下表格形式:为句子中的每个词编号,然后列出每个词的父节点编号和依赖关系类型。
其他语法形式主义
在计算语言学和自然语言处理的发展历程中,研究者提出了多种语法形式主义,旨在更简洁、更强大地描述语言。本节中,我们简要介绍其中两种。
合一语法:这类语法(如广义短语结构语法、中心词驱动短语结构语法、词汇功能语法)不使用简单的符号作为规则成分,而是使用“属性-值”对列表,并可以包含变量。例如,可以定义规则 S -> NP[num=?n] VP[num=?n],其中变量 ?n 确保主语和动词在数上一致。这极大地减少了规则数量,并使语法更易于编写和维护。近年来,在知识图谱等领域的表示学习中,类似的思想有所回归。
范畴语法:这是一种非常简洁的语法形式,核心思想是将句法信息主要编码在词汇条目中,而语法规则数量极少(例如,只有5条核心规则)。例如,专有名词“John”的范畴是 NP,及物动词“likes”的范畴是 (S\NP)/NP,表示它需要一个右侧的 NP(宾语)和一个左侧的 NP(主语)来构成一个句子 S。通过“向前应用”和“向后应用”等组合规则,可以像数学运算一样推导出句子的结构。虽然词汇条目变得复杂,但同类词的范畴是相同的。范畴语法与类型论和函数式编程有深刻联系,也有基于树库的统计和神经解析器。
总结
本节课我们一起学习了上下文无关语法解析的进阶内容。
我们首先介绍了概率上下文无关语法,通过为规则添加概率,并修改CKY等算法,使我们能够选择可能性最高的解析树。
接着,我们探讨了Earley算法,这是一种能够处理任意形式上下文无关语法的通用图表解析算法,通过“点规则”和预测、扫描、完成三个操作高效地找到所有解析。
然后,我们讨论了词汇化语法和中心词的概念,通过将具体的词(尤其是中心词)信息融入语法规则,可以生成更精确、约束性更强的解析。
之后,我们重点介绍了依存解析,这是一种关注词与词之间依赖关系的解析方式。依存树更易于集成到下游机器学习任务中,并且存在像神经网络解析器这样的高效实现。
最后,我们简要回顾了历史上重要的其他语法形式主义,如合一语法和范畴语法,它们以不同的方式追求语法描述的简洁性和表达力。


理解这些不同的解析方法和语法表示形式,有助于我们根据具体任务的需求(如速度、准确性、与下游任务的集成度)选择合适的工具,并更好地理解自然语言结构的复杂性。
12:树库与概率上下文无关文法

在本节课中,我们将要学习树库和概率上下文无关文法。我们将探讨什么是树库,如何从树库中获取语法规则,以及如何利用这些规则构建概率模型来处理句子的歧义问题。
什么是树库?
树库是一个大型的文本语料库。这个语料库中的每个句子都已经被分析成了句法树。这些句法树可以是成分树,也可以是依存树。今天我们将主要讨论成分树,因为我们要讨论概率上下文无关文法,但许多相同的原理也适用于依存树。
语法编码的两种方式
表示语言语法的方式主要有两种。一种方式是显式编码,即直接写出所有的规则。例如,你可以手动写出一个上下文无关文法的所有规则。另一种方式是隐式编码,即通过分析大量句子的句法结构,从这些分析中推导出一套规则。树库就属于后一种方式。
树库的构建与挑战
构建树库是一项艰巨的任务。它至少包含六个步骤,每一步都需要大量的工作。首先,需要制定一个初始的编码手册,指导标注者如何应用句法测试来确定句子的结构。其次,需要开发标注工具,包括一个预处理器和一个用户界面。然后,需要收集数据,并确保拥有数据的合法使用权。接着,需要自动解析数据,并培训标注人员。之后,需要人工修正自动标注的结果。最后,当遇到编码手册中未涵盖的情况时,需要修订手册并更新已标注的数据。
树库的局限性
树库虽然有用,但也存在严重的局限性。首先,构建成本高昂,导致难以被替代,因此即使存在缺陷,也可能被长期使用。其次,由于时间和资金的压力,树库的质量可能并不完美。此外,编码手册和高级决策通常由专家制定,但大部分标注工作由非专家完成,这可能导致错误和不一致。
从树库中提取规则
从树库中可以提取出大量的上下文无关文法规则。例如,从一个句子“Pierre Vinken joined the board”的句法树中,我们可以提取出诸如 NP -> NNP NNP 和 S -> NP VP . 等规则。然而,树库中的规则分布极不均匀:少数规则出现频率极高,而大量规则只出现几次。
解析器的评估
评估一个解析器的性能,我们通常使用解析树与标准树库(黄金标准)的对比。常用的评估指标包括标记召回率、标记精确率和交叉括号数。标记召回率衡量解析器正确识别的成分占黄金标准中总成分的比例。标记精确率衡量解析器识别的成分中正确的比例。交叉括号数则衡量两种解析在结构上的差异程度。
为了综合评估,我们使用F值,其通用公式为:
其中,当 \(\beta = 1\) 时,即为F1值,它是精确率和召回率的调和平均数。
概率上下文无关文法
概率上下文无关文法是对标准上下文无关文法的扩展,它为每条产生式规则赋予一个概率值。一个PCFG包含四个部分:终结符集合、非终结符集合、起始符号以及带有概率的产生式规则集合。对于每个非终结符,其所有产生式规则的概率之和必须为1。
PCFG的一个关键优势是能够计算整个句法树的概率。给定一个句法树,其概率等于树中所有节点所使用的产生式规则概率的乘积:
这使得PCFG可以用于句法歧义消解。对于有多个可能解析的句子,我们可以计算每个解析树的概率,并选择概率最高的那个。
PCFG概率的来源
获取PCFG概率最简单的方法是从树库中统计。对于每条规则 X -> α,其概率估计为:
也可以从普通语料库中学习PCFG,但这更复杂,需要先有一个CFG来解析语料库,然后通过迭代算法(如向内-向外算法)来估计规则概率。
PCFG的局限性与词汇化
标准的PCFG存在两个主要问题。第一,它假设规则之间是独立的,无法捕捉结构间的依赖关系。第二,它缺乏词汇信息,无法利用词语本身对句法结构选择的影响。
为了解决这些问题,我们引入了词汇化的概率上下文无关文法。在这种文法中,每个句法成分都与其中心词相关联。中心词是决定该成分类型(如名词短语、动词短语)的最重要词语。通过将中心词信息标注到非终结符上,规则变得更加具体,从而能够捕捉到词汇对句法概率的影响。例如,规则不再是简单的 S -> NP VP,而是 S(dumped) -> NP(workers) VP(dumped)。
然而,词汇化也带来了数据稀疏问题,因为规则数量急剧增加。这通常需要更多的训练数据或更智能的平滑技术来处理。
总结


本节课我们一起学习了树库和概率上下文无关文法。我们了解了树库的构建过程、价值与局限,学习了如何从树库中提取语法规则并评估解析器的性能。我们重点介绍了概率上下文无关文法,它通过为规则赋予概率,使得句法分析能够进行歧义消解并评估句子的合理性。最后,我们探讨了标准PCFG的局限性以及词汇化PCFG如何通过引入中心词信息来提升模型性能。理解这些基础概念对于使用和改进句法分析器至关重要。
13:词汇语义学

在本节课中,我们将要学习词汇语义学,即关于词语意义的学问。我们将探讨三种理解词语意义的方法:分解法、本体论法和分布法。课程将介绍核心概念,并通过公式和代码示例进行说明,旨在让初学者能够轻松理解。
课程概述
在之前的课程中,我们讨论了句法分析、分类和语言建模等技术。然而,所有这些技术的最终价值都依赖于它们与现实世界的联系,即语义。本节课,我们将聚焦于词汇层面的语义,探索如何表征词语的意义,以便在自然语言处理应用中使用。
分解语义学
上一节我们介绍了语义学的重要性,本节中我们来看看第一种方法:分解语义学。这种方法认为,词语的意义可以分解为更小的、有意义的特征或“原子”,就像分子由原子构成一样。
例如,我们可以用一组特征来描述“男孩”、“女孩”、“男人”、“女人”等词语:
- 男孩:
+人类, -女性, -成年 - 女孩:
+人类, +女性, -成年 - 男人:
+人类, -女性, +成年 - 女人:
+人类, +女性, +成年
以下是这种方法的潜在优势:
- 它为每个词语提供了一个完整且可解释的表征。
- 这些特征可以转化为二进制向量(如+为1,-为0),从而可以在向量空间中计算词语之间的相似度。
然而,这种方法也存在明显的缺点:
- 需要大量的特征来覆盖整个词汇表。
- 确定每个词语的正确特征集非常困难,且缺乏统一标准。
- 难以将这些特征与现实世界准确关联。
因此,尽管在某些特定任务(如语义角色标注)中有所应用,分解语义学在计算词汇语义学中并不常用。
本体论语义学
上一节我们介绍了自底向上的分解法,本节中我们来看看自顶向下的本体论方法。这种方法不直接定义词语本身,而是通过定义词语与其他词语之间的关系来表征其意义。
以下是几种核心的语义关系:
- 同义关系: 词语意义大致相同。例如,“小”和“微小”。
- 反义关系: 词语意义相反。例如,“小”和“大”。
- 上下位关系: 表示“是一种”的集合包含关系。
- 下位词: 表示更具体的概念。例如,“狗”是“哺乳动物”的下位词。
- 上位词: 表示更一般的概念。例如,“哺乳动物”是“狗”的上位词。
- 部分整体关系: 表示“是…的一部分”或“拥有…”的关系。
- 部分词: 表示整体的一部分。例如,“肝脏”是“身体”的部分词。
- 整体词: 表示拥有某部分。例如,“身体”是“肝脏”的整体词。
重要区分: 下位关系是集合包含(如“狗”属于“哺乳动物”),而部分整体关系是组成部分(如“肝脏”是“身体”的一部分)。两者完全不同。
WordNet:一个著名的词汇本体
WordNet 是一个广泛使用的英语词汇数据库,它按照上述关系将词语(更准确地说,是词语的义项)组织成一个大型网络。
在 WordNet 中,意义相近的词语被分组到 同义词集 中。例如,关于“狗”的一个同义词集可能包含 {dog, domestic dog, Canis familiaris},并附有定义和例句。

WordNet 的主体是一个庞大的 上下位关系层级结构(或称分类法)。例如,“鱼”的下位关系链可能是:实体 <- 物体 <- 整体 <- 生物 <- 生物体 <- 动物 <- 脊索动物 <- 脊椎动物 <- 水生脊椎动物 <- 鱼。
利用 WordNet 这样的层级结构,我们可以计算词语的 信息量。信息量公式为:
I(c) = -log P(c)
其中 P(c) 是词语 c 或其下位词在语料库中出现的概率。越具体、越少见的词语,其信息量越高。
WordNet 可以通过 Python 的 NLTK 库方便地使用:
from nltk.corpus import wordnet as wn
synsets = wn.synsets(‘dog’) # 获取“dog”的所有同义词集
然而,WordNet 这类资源也存在局限:它们需要大量人工编纂,可能存在不一致性,并且是静态的,难以覆盖所有语言使用现象。
分布语义学
上一节我们讨论了依赖于人工定义的本体论方法,本节中我们来看看完全数据驱动的分布语义学。其核心思想是:一个词的意义由其上下文决定。即,出现在相似上下文中的词语,其意义也相似。
我们可以通过构建 共现向量 来形式化这一思想。具体做法是:设定一个滑动窗口(例如,窗口大小为5个词),扫描大型语料库。对于目标词 w,统计其他每个词 f 出现在 w 窗口内的次数。这个计数向量就表征了 w 的上下文分布,从而间接表征了其意义。
例如,分析“杏子”、“菠萝”、“数字”、“信息”四个词的共现向量后,我们会发现“杏子”和“菠萝”的向量相似(因为它们常与“水果”、“甜”等词共现),而“数字”和“信息”的向量相似(因为它们常与“技术”、“数据”等词共现)。
点间互信息
直接使用原始共现计数有一个问题:像“the”、“is”这样的高频词,它们与许多词共现的次数都很高,但这并非因为有特殊的语义关联,仅仅是因为它们本身出现频繁。
为了解决这个问题,我们使用 点间互信息。PMI 衡量的是两个词实际共同出现的概率,与它们随机共同出现的概率的比值。其公式为:
PMI(w, f) = log( P(w, f) / (P(w) * P(f)) )
在计算中,常使用正点间互信息:
PPMI(w, f) = max(PMI(w, f), 0)
PPMI 降低了高频但无特殊关联词对的权重,突出了那些有显著共现关系的词对。
实践结果
使用大型语料库计算词语的 PPMI 向量,然后通过 余弦相似度 比较向量,可以找到与目标词语义最接近的词。例如:
- rum(朗姆酒) 的相似词:vodka, cognac, brandy, whiskey...
- say(说) 的相似词:read, speak, present, receive...
- mathematics(数学) 的相似词:physics, biology, geology, sociology...
这些结果完全由算法从数据中自动学习得到,没有人工干预,效果相当不错,展示了分布语义学的强大能力。
课程总结
本节课我们一起学习了词汇语义学的三种主要方法:
- 分解语义学:将词语意义分解为语义特征。
- 本体论语义学:通过词语间的语义关系(如上下位、部分整体关系)来定义意义,并以 WordNet 为例进行了说明。
- 分布语义学:基于“一个词的意义由其上下文决定”的分布假设,使用共现向量和点间互信息来从数据中自动学习词语的语义表征。

理解词语的意义是连接语言计算与现实世界的关键。在接下来的课程中,我们将深入探讨词向量这一将分布语义思想转化为强大工具的技术。
14:词向量语义学

在本节课中,我们将学习词向量语义学,通常被称为词嵌入。我们将探讨现代自然语言处理如何表示词语,理解词嵌入的工作原理,以及如何从分析角度和神经网络角度构建词嵌入。核心目标是让机器能够理解词语之间的相似性,从而应用于问答、摘要、抄袭检测等任务。
概述:词义与相似性
词语并非完全孤立存在。许多词语具有相似的含义,而另一些则含义迥异。我们通常将词语视为词典列表中的符号,认为它们要么相等,要么完全不相关。然而,这种观点并不准确。例如,“fast”(快速)和“rapid”(迅速)在含义上是相关的,我们希望它们比“fast”和“chair”(椅子)更相似。
考虑构建一个问答系统。如果有人问“Mount Everest有多高?”,而维基百科条目写的是“Mount Everest的官方高度是29,029英尺”。如果系统知道“tall”(高)和“height”(高度)在某种意义上是相似的,就能回答这个问题。否则,系统会认为“我知道高度,但不知道‘高’是什么意思”,从而无法作答。
因此,我们需要一种表示方法,使得“tall”和“height”比“tall”和“chair”更相似。
词义的变化与语境
语言会随时间变化。语言学家通过研究词语在历史语境中的使用来评估词义是否发生了变化。例如,词语“dog”(狗)、“deer”(鹿)和“hound”(猎犬)的含义在历史上发生了演变。在1250年左右,“dog”的含义比现在更局限,“deer”则泛指森林中的大型动物(类似于德语中的“Tier”,意为动物),而“hound”曾指代许多我们现在称为“dog”的动物。
另一个例子是“gay”这个词。一百年前,“gay”主要意为“快乐的、愉快的”,而如今通常指“同性恋的”。通过分析历史文本中“gay”出现的上下文,我们可以追踪其含义的演变。
人们通过观察词语在语境中的使用来判断其含义是否相似。传统上,我们使用同义词词典来查找相似词,但同义词词典可能过时,且并非对所有语言都适用。
分布语义模型
我们试图借助的核心思想是分布语义模型。我们无法从计算上精确定义一个词的含义,但可以尝试通过词语出现的上下文来表示其含义,以便用于自然语言处理任务。
语言学家Zellig Harris在1950年代指出,词语“oculist”(眼科医生)和“eye doctor”(眼科医生)出现在几乎相同的语境中。因此,如果两个词出现在相似的语境中,我们可以认为它们是同义词。不过需要谨慎,例如颜色词“blue”(蓝色)、“red”(红色)、“green”(绿色)也常出现在相似语境中,但它们并非同义词,而是描述物体的相同属性(颜色)。
丹麦语言学家John Rupert Firth在1957年说过:“You shall know a word by the company it keeps”(观其伴,知其义)。这句话非常重要,它指出了我们今天的计算技术基础:通过词语出现的上下文来构建词义,并衡量这些上下文是否相似。
通过上下文推断词义
假设你从未听过“tisquino”这个词,但看到以下句子:
- A bottle of tisquino is on the table.
- Everybody likes tisquino.
- Tisquino makes you drunk.
- We make tisquino from corn.
即使不认识这个词,你也可以推断“tisquino”很可能是一种用玉米酿造的酒精饮料(事实上它是一种啤酒)。这是因为你可以用“beer”(啤酒)或“whiskey”(威士忌)等词替换“tisquino”,句子依然通顺(只要假设它们也是玉米酿造的)。人类在阅读时会这样做,我们也希望机器能具备这种能力。
因此,我们的核心观点是:如果两个词出现在相似的词语上下文中,那么它们就是相似的。
向量表示:稀疏与稠密
我们已经讨论过用向量表示词语。例如,可以定义一个包含1万个词的词汇表,每个词对应一个长度为1万的向量(one-hot向量),其中只有该词对应的位置是1,其余为0。这是一种稀疏向量表示,大部分元素是0。
我们可以基于上下文构建词表示:对于一个目标词,查看其周围出现的词,并在一个很宽的向量中标记这些上下文词。但这会产生非常宽且稀疏的向量。
另一种方法是尝试获得稠密向量表示。我们可以通过计算技术(如奇异值分解SVD,一种潜在语义分析形式)将稀疏向量投影到更低维度的空间。或者使用神经网络(如Skip-gram或连续词袋模型CBOW)来学习一个紧凑的表示,该表示能尽可能准确地预测原始上下文。我们之前讨论过的布朗聚类也可以用于获得更密集的表示。
这种表示通常被称为嵌入。人们常说的词向量或嵌入通常指稠密向量。关键目标是获得一种表示,使我们能够计算词语之间的距离度量,而不仅仅是给每个词分配一个独立的整数编号。
共现向量
我们首先来看共现向量。基本思想是统计词语在特定上下文(如文档)中共同出现的情况。
例如,分析莎士比亚的几部戏剧中词语的出现次数:
| 词语 | 《皆大欢喜》 | 《第十二夜》 | 《尤利乌斯·凯撒》 | 《亨利五世》 |
|---|---|---|---|---|
| battle | 1 | 1 | 8 | 15 |
| soldier | 2 | 2 | 12 | 36 |
| fool | 114 | 43 | 2 | 1 |
| clown | 9 | 33 | 0 | 0 |
观察可知,“battle”和“soldier”在《尤利乌斯·凯撒》和《亨利五世》中出现更频繁,而“fool”和“clown”在《皆大欢喜》和《第十二夜》中出现更频繁。这表明《尤利乌斯·凯撒》和《亨利五世》这两部戏剧更相似(都是关于战争和王权的),而“fool”和“clown”这两个词也比它们与“soldier”或“battle”更相似。
基于整个文档进行统计可能不够精细。我们可以将上下文限制在目标词前后固定数量的词语范围内(例如前后各7个词)。但这种方法需要大量数据才能获得可靠的统计信息。
点互信息与正点互信息
原始的共现频率并不理想,因为像“the”、“of”这样的高频词会出现巨大的数值,但它们的信息量并不高。我们更关心那些能区分语境的内容词。
因此,我们引入点互信息来衡量一个上下文词对于目标词的信息量。其基本思想是:比较两个词实际共同出现的概率与它们独立出现的预期概率。
公式:
PMI(x, y) = log2( P(x, y) / (P(x) * P(y)) )
PMI值范围在负无穷到正无穷之间。负值表示两个词共同出现的次数比随机预期还要少(可能互为反义词)。但在许多任务中,我们只关心词语何时相似,而不关心它们何时不相似。因此,通常使用正点互信息,即将所有负的PMI值设为零。
公式:
PPMI(x, y) = max(0, PMI(x, y))
PPMI仍然对低频事件有些敏感。非常罕见的词可能因为共现次数极少而获得异常高的PPMI值。我们可以使用平滑技术(如加一平滑)来缓解这个问题,给予低频词稍高的概率估计,从而得到更稳定的PPMI值。
相似性度量:余弦相似度
获得词向量后,我们需要一种方法来衡量两个向量的相似度。一种简单的方法是计算它们的点积。但点积的值会受到向量长度(即非零元素数量)的影响,难以直接比较不同词对之间的相似度。
更好的方法是使用余弦相似度。它计算两个向量夹角的余弦值,从而消除了向量长度的影响。
公式:
cosine_similarity(A, B) = (A · B) / (||A|| * ||B||)
其中 A · B 是点积,||A|| 和 ||B|| 是向量的模(长度)。余弦相似度的取值范围在-1到1之间。对于PPMI向量(非负),其值通常在0到1之间,1表示完全相同,0表示无关。
余弦相似度本质上是衡量两个向量在空间中的方向是否一致。我们可以基于余弦相似度对所有词语进行聚类,形成层次结构,从而发现语义上相近的词语类别(如身体部位:手腕、脚踝、肩膀、手臂等)。
基于句法上下文的改进
前述方法只考虑了词语的上下文,没有利用句法结构。我们可以使用依存句法分析来改进。不是简单地取目标词前后几个词,而是取其在依存树中直接相连的词语(如主语、宾语等)。这样得到的上下文更关注句法上相关的词(如动词及其核心论元),而不仅仅是表面相邻的词。这种方法通常能获得更好的语义表示。
另一种度量:TF-IDF
除了PPMI,TF-IDF是另一种常用的度量。
- TF代表词频,即词语在文档中出现的频率(有时会取对数)。
- IDF代表逆文档频率,衡量一个词在所有文档中的普遍程度。IDF值高意味着该词在少数文档中集中出现,是区分文档的有力指标。
TF-IDF结合了这两者,用于评估一个词对于特定文档的重要性。
从稀疏到稠密:降维技术
到目前为止,我们讨论的向量表示仍然是稀疏的(维度高,大部分为零)。从计算效率和机器学习角度,我们希望得到稠密的、低维度的向量表示(例如300维)。这样不仅计算更快,有时还能捕捉到更抽象的语义关系。
以下是三种主要的降维或稠密表示方法:
1. 奇异值分解
奇异值分解是一种数学技术,是潜在语义分析的一种。它通过线性代数方法,将高维稀疏矩阵分解,并保留最重要的特征,投影到低维空间(如300维)。SVD会寻找数据中的相关性,例如“car”和“automobile”的共现模式相似,可能会在低维空间中被合并或接近。选择300维并没有特别的理论依据,更多是历史和经验结果。
2. 神经网络词嵌入
这类方法使用神经网络来学习稠密词向量。核心思想与之前一致:利用上下文信息。
- Skip-gram模型:给定一个中心词,训练神经网络来预测其周围的上下文词。
- 连续词袋模型:给定上下文词,训练神经网络来预测中心词。
在训练时,输入是词语的one-hot向量,通过网络中的一个“瓶颈”层(如300维)后,试图预测上下文或中心词。训练完成后,这个“瓶颈”层的激活值就作为该词的稠密向量表示。这类模型(如Word2Vec)可以预先在大规模语料上训练好,供下游任务直接使用。
研究表明,Skip-gram等神经网络嵌入与PPMI存在相关性,并且由于神经网络固有的平滑效应,它们在处理低频词时可能表现更好。
使用这些预训练的词向量,并通过余弦相似度查找最近邻,可以发现语义上相似的词语或短语(例如“Redmond”(雷德蒙德)与“Microsoft”(微软)、“Washington”(华盛顿)与“government”(政府))。
词嵌入还有一个有趣的性质:它们似乎能捕捉到某种语义关系。例如,经典的例子是:vector(“king”) - vector(“man”) + vector(“woman”) ≈ vector(“queen”)。这暗示在向量空间中存在着“性别”或“国家-首都”等关系方向。不过后续研究指出,这种关系并不总是那么精确和普适,但确实表明词向量编码了有用的语义信息。
3. 布朗聚类
我们之前在词性标注中讨论过布朗聚类。它是一种层次聚类算法,将词汇表中的所有词组织成一棵二叉树。每个词都可以通过从根节点到该词叶子节点的路径(一串0和1)来表示,这个路径就可以作为该词的向量表示。这种表示是离散的,并且具有层次结构:路径前缀相同的词在语义上更接近。布朗聚类计算成本较高,但得到的表示针对特定语料,有时非常有效。
上下文化词嵌入
Word2Vec或GloVe为每个词提供一个静态的向量,不考虑一词多义。例如,“apple”的向量混合了其作为“水果”和“公司”的所有含义。
上下文化词嵌入(如ELMo、BERT)解决了这个问题。它们需要输入整个句子,然后根据词语在句中的具体上下文,生成不同的向量表示。例如,“apple”后面跟着“pie”和跟着“computer”会得到不同的向量。BERT等模型使用Transformer架构,能够考虑句子中所有词之间的交互,因此产生的表示质量更高,极大地推动了自然语言处理的发展。不过,它们模型更大,计算也更昂贵。
评估与应用
如何评估词向量的好坏?除了内在任务(如计算余弦相似度),更重要的是看其在下游任务中的表现,例如:
- 问答系统
- 拼写检查(寻找相似词)
- 文本评分
- 模拟人类的词汇测试(如TOEFL中的同义词选择)
词向量在这些任务中表现良好,但它们并不真正“理解”语言,这一点需要牢记。
总结
本节课我们一起学习了分布向量语义模型。我们讨论了如何用一组浮点数(向量)来表示词义,并希望这个表示能支持距离度量,从而服务于下游任务。
我们首先介绍了稀疏表示方法,包括简单的共现统计以及更优的正点互信息方法。

接着,我们探讨了三种获得稠密向量表示的主要技术:
- 降维技术:如奇异值分解,将高维稀疏表示投影到低维稠密空间。
- 神经网络嵌入:如Skip-gram和CBOW模型,通过神经网络学习紧凑表示,或直接使用预训练模型(如Word2Vec、GloVe)。我们还提到了更先进的上下文化词嵌入(如BERT),它能根据句子上下文生成动态向量。
- 布朗聚类:一种层次聚类方法,为每个词生成一个基于聚类路径的离散向量表示。





这些词向量表示是现代自然语言处理系统的基石,使我们能够以计算的方式处理和利用词语之间的语义关系。
15:深度学习概述 🧠

在本节课中,我们将对深度学习进行一个快速的概览。我们将回顾深度学习的历史、其在自然语言处理(NLP)中应用的原因与局限性,并探讨一些使用深度学习改进NLP的重要里程碑。
课程概述
我们这门课程主要讨论自然语言分析的各种形式。输入形式是人类文本(也可能是语音,但我们主要讨论文本),例如网页、问题、推文、语音指令或整个文档。我们需要对这些输入进行处理,例如生成问题、生成答案、解释指令、查询数据库或发现趋势话题。我们使用某种算法或函数来处理输入,并最终产生输出,输出可能是自然语言,也可能是现实世界中的某个动作。
我们探讨了多种可能用到的算法类型,例如语音识别、情感分析、文档分类。我们也讨论了用于解决这些高级任务的底层技术,如分词、拼写纠正、词性标注、句法分析等。此外,还有一些中间任务,如命名实体识别、语义解析、共指消解,这些任务本身很有趣,但通常是为更大的NLP应用服务的。
核心问题是:我们能否用深度学习取代所有这些分析过程?答案是肯定的。但问题是,我们是否应该这样做?这取决于具体任务,因为我们的目标是获得最佳结果,而不一定是最高的CPU或GPU使用率。我们需要知道在何时何地,相较于统计学习或规则系统,神经网络学习是最佳选择,以及如何最容易地实现它。
总的来说,神经网络效果很好,但它们需要大量数据。如果我们没有足够的数据,可以通过数据增强技术或添加额外信息(如词性标签或句法信息)来弥补,使学习过程更快。但一般来说,我们需要大量数据。因此,如果你的任务数据量不足,可能需要考虑更简单的统计技术。无论如何,我们都应该评估并选择最佳方案。
深度学习简史 📜
接下来,我将简要介绍深度学习的历史。这不仅因为其历史悠长(可追溯到20世纪50年代),还因为了解其构建模块在过去50多年里的演变至关重要。
我们将讨论训练,因为训练是深度学习的关键技能。虽然本课程不专门教授如何为NLP构建深度神经网络(那是另一门课程的内容),但我会介绍一些在过去10年里改变我们对神经网络在NLP中应用的看法、并显著推动该领域发展的重要成果。
我将以文档分类作为主要示例。假设我们有一系列新闻文章,需要将它们分类到金融、商业、体育、娱乐和健康等类别中。我们试图找出每篇文章属于哪个类别。
从线性模型到神经网络
我们真正讨论的是一个函数,它接收一个标签(如“体育”)和一个文档,并输出一个概率。我们的目标是找到给定文档下最可能的类别。无论是统计学习、神经网络学习还是规则学习,我们都在尝试从数据中学习这个概率函数。
几百年来最明显的方法是使用某种线性模型。我们会查看一系列特征(例如单词的出现情况),并尝试找到合适的权重来乘以这些特征,然后求和,看结果是否超过某个阈值(例如大于零)。一个线性模型可能会考虑文档中所有单词的出现情况(出现为1,不出现为0),向量的长度等于词汇表大小。我们希望学习到的权重能告诉我们某些单词更可能出现在特定类别中。
然而,这种方法孤立地处理每个单词,没有考虑上下文。例如,“皇家马德里”这个二元词组是谈论足球的强有力指标。我们可以通过训练来发现这一点。线性模型试图在数据中画一条线(线性分割)来区分不同类别。但对于真实数据,几乎不可能得到一条完美的分割线,因此我们只能尝试最小化误差。
如果我们被允许画多条线,效果会好得多。换句话说,简单的单线线性模型可能不足以完成我们想做的许多复杂任务。因此,我们希望得到更复杂的模型以获得更好的结果。机器学习领域的人们已经为此探索了很长时间。
神经网络基础 🧮
最简单的神经网络形式实际上就是线性回归。你有一组输入特征,将其与权重相乘,然后求和,最后选择输出值最高的节点。这仍然是一个线性过程。
神经网络(即使在这种只有两层的简单网络中)的不同之处在于权重的获取方式。在线性回归中,我们通过逆矩阵乘法等方式获取权重。而在神经网络中,我们使用一种称为反向传播的技术。给定一个示例,我们预测输出,查看误差,然后尝试修改权重以减少该误差。我们不会一次性大幅度改变权重(否则权重会剧烈波动),而是每次只改变一小部分(如10%或5%)。通过多次迭代,权重会逐渐移动到能实现最佳分割的位置。
因此,神经网络感知机通过反向传播来学习权重。我们分配误差量,将其分布到所有权重上,然后尝试更新它们。如何更新有很多选择,我今天会讨论其中一些。但基本思想是:它仍然是一个线性模型,我们有一组特征乘以权重,然后在另一端查看某个阈值。但获取权重的方式不同,这对神经网络很重要,因为我们不仅仅有简单的线性模型。
在神经网络中,我们实际上可以有更复杂的形式。这种线性权重模型在20世纪50年代就已出现。你可以将神经网络视为矩阵乘法,这与线性代数中的概念相同,但视角不同,这在我们扩展神经网络复杂性时具有优势。
多层网络与编码器-解码器
人们很快意识到,除了线性模型,我们还可以做更复杂的事情。我们可以拥有多个层,还可以改变每层的节点数量。例如,在中间层使用更少的节点,然后尝试预测输出。这样,神经网络可以用于一种压缩形式。
我们可以将输入(例如一个10000维的词汇表向量)压缩到中间层的一个只有几百维的编码,然后再从这个编码尝试重建出原始的10000维输出。我们可以使用神经网络学习技术来实现这一点。这意味着中间点包含了所有信息(虽然重建不会100%准确,但会非常接近)。这个中间的小向量对于下游机器学习任务有很多好处,这被称为编码器-解码器架构。
在21世纪初,我们经常在语音处理中使用它,将大量可能重要的频谱特征投影到更少的特征(通常称为瓶颈特征)上,然后使用这个中间表示。我们当时并没有在最终的识别器中使用神经网络,只是用它们来编码数据。
多层网络和这种压缩形式是有用的。可以说,这与矩阵乘法得到的结果相同,但这是训练的一种更有效方式。
我们发现,在这些压缩形式中得到的特征具有某种意义。它们是有用的。在该领域中的距离度量,相较于原始高维空间中的距离度量,具有了含义。当我们对单词做类似处理时(大约一个月前我们讨论过词嵌入),这就是将词袋表示压缩成词嵌入的一种方式。
大约在2011年,人们发现这种距离度量具有意义:相似的单词距离近,不同类别的单词会聚集在一起。当时有些人惊呼神经网络理解了世界,但这在哲学意义上绝对不是真的。当你使用神经网络获得这些压缩形式时,你实际上是在查看单词出现的上下文。你得到的是在相同上下文中可能出现的单词之间的距离度量。一旦你获得了具有这种属性的距离度量,出现在相同上下文中的单词距离更近,你就能得到一些语义信息。例如,地名出现在其他地名附近,颜色词出现在其他颜色词附近,水果词出现在其他水果词附近。所以它确实在学习一些东西,学习一些关于意义的东西,但不是这两个词在深层哲学意义上相同,而是这些词在相同上下文中出现,因此在某种意义上它们是相似的。它们可能是同义词,也可能是反义词(这有点问题),在这个领域中相似的词在语义上可能并不相似。
但这具有这些属性,并且非常有用,因为在自然语言处理中,我们真的想知道两个词是否在某种意义上相同或相关,因为这告诉我们很多信息,不仅是关于这个词本身,还关于它周围的词。
非线性函数与深度网络的力量
我们可以定义比简单线性形式更复杂的函数,这正是神经网络计算能力的真正来源。如果你看这个多层网络,它将是矩阵乘法乘以矩阵乘法。两个矩阵相乘,你可以预先计算矩阵的乘积,根据结合律,结果完全相同,所以我们没有得到任何增益。
那么,为什么我们要有多层呢?如果我们只是那样做,我们肯定不会得到更多。但这不是我们在神经网络中做的唯一事情。我们经常在中间乘法之后做一些后处理。事实上,我们经常在那里应用一个后处理函数,这个后处理函数通常是非线性函数,比如逻辑函数。我们可能会说,不是直接取所有的输出,而是查看输出,并做一些类似的事情:如果值高于阈值,就设为1;如果低于阈值,就设为0。这是一种试图进行0/1识别的过程。我们将应用这个函数,强制使高的值更高,低的值更低。
当我们这样做时,在神经网络中就不再是简单的矩阵乘法了,它实际上更复杂:乘以某个值,应用某个函数,再乘以另一个值。这样做之后,你无法预先计算中间发生的函数,因为你无法在不了解输入的情况下独立执行该函数。因此,你最终得到了实际上是新的、更复杂的函数。这是一件非常好的事情。
这里通常应用的是非线性函数。因此,我们实际上可以得到比简单多重线性回归更有趣的分类结果,因为那并没有真正的帮助。所以,如果我们在中间形式中应用这些函数(我们在几乎所有神经网络中都是这样做的),我们最终会得到这些函数的非线性表示,使我们能够学习比标准线性函数复杂得多的东西。这很酷,因为线性回归无法学习非线性回归函数,它是有限的。
你可以构建一堆线性回归决策器,取它们的输出,应用某个函数,然后将它们输入到另一层线性函数中。这正是神经网络所做的。但神经网络的优点是,我们可以从头到尾一起训练所有权重。而我刚才说的构建独立模型然后以某种方式组合它们的方法,你必须在不根据后续结果进行修正的情况下,尽可能好地训练这些初始模型。因此,将事物连接在一起在神经网络中进行的优势是,你可以一起训练所有这些权重,这非常强大。
激活函数与训练要求
在每个层级可以应用多种函数,其中一些最好被描述为“魔法”——它们并非真正的魔法,但当它们有效时,人们并不总能确切知道原因。人们对其何时有效有直觉,但并非总能弄清楚什么有效、什么好。有一些经验法则,一般来说,有一些函数你更可能使用,它们通常在你的工具包中实现,你不需要深入了解细节,通常是从其他地方复制而来。
但这里有很大的探索空间。并非任意函数都可以放在那里,因为训练的方式和设置权重的要求,放在那里的任何函数都必须是可微分的,因为你需要进行数学计算以应用每个权重的梯度。有些你想放入的函数(如softmax)不是处处可微的,但有近似技术可以让你随机地、没有太大问题地通过这一点。
为什么需要更多层?深度与宽度
为什么我们需要更多层?神经网络理论表明,只要网络足够宽(即具有足够多的特征),你实际上可以用一个神经网络训练任何可计算函数。这很有趣,但不太实用。就像任何信号都可以分解为傅里叶变换,任何计算机级别的函数都可以在图灵机中表示一样。我知道情况如此,但我不会构建一个拥有10亿个参数的单层网络,因为我将无法训练它,因为证明需要无限量的数据来测试。
那么,为什么我们有深度网络呢?深度网络实际上使我们能够获得更高效的表示,可能更快。如果我们使用宽网络,也许有办法做到,但这不是我们在研究中实际采用的方式,我们更关心深度形式而非宽度形式,因为深度允许我们做到这一点。在训练深度网络的权重时存在一些非平凡的问题,因为网络越深,距离输出越远的权重更新越小,或者说你越不确定,因此你不想快速更新权重,这使得训练更加困难。这意味着你可能需要大量数据。
回到20世纪80年代,大多数神经网络只有2到3层深。随着我们进入21世纪,训练数学的改进、计算机速度的提高以及数据量的增加,我们开始走向深度,因此深度学习兴起。那么,“深度”有多深?人们通常会转移话题,因为他们并不想回答“深度”有多深这个问题。这更像是一个广告术语而非实际要求。你可能会发现有些只有两层的网络被称为“深度”,也有些有1000层的网络被称为“深度”(尽管千层网络非常罕见,训练极其困难)。实际上,“深度”通常指3、4层到10、15层,因为超过这个范围会变得相当困难。而且,还有其他架构方面的事情,我稍后会谈到,这些对于构建更好的架构比仅仅说“我有一堆层,我再加10层看看是否更好”更为重要。因为你添加的层越多,可能就需要更多的数据来正确训练,调整超参数也越困难。
深度网络中的层级表征
人们注意到,当你拥有多层深度网络时,靠近输入的层似乎更关心低级功能。以视觉为例,第一层可能关心识别图片中的线条,第二层可能关心面部特征(如嘴、鼻子、眼睛),而第三层则关心面部识别、方向和位置。我们在视觉中看到了这一点,但这很难验证,因为记住,其中的所有权重都是完全随机的,你不能直接显示它们并说“看,那是嘴”。它看起来像一堆随机噪声,但如果你以某种方式排列,它可能看起来像嘴。要弄清楚如何做到这一点,实际上需要一些额外的机器学习。
但在自然语言中是否也能看到这一点呢?能否查看自然语言表示中的较低层级和较高层级,并尝试识别那里发生了什么?在这个领域已经有了一些工作。例如,在BERT中(其表示最终约有10层),较低层级似乎非常偏向句法,它们非常关注单词的局部信息(如单词特征、功能词与非功能词),而越往输出层走,它们似乎更偏向语义侧。也许这就是我们在自然语言中得到的维度,而在视觉中我们得到的是视觉表征。
循环神经网络与序列建模
到目前为止,我只讨论了在某种意义上是简单的前馈神经网络。它们有一堆输入,一些层(可能在这些层中有有趣的处理),以及一堆输出。它们可能改变这些层的宽度,可能改变应用于每层输出的函数,但总归是一堆输入,一堆输出。
这并不总是看待许多问题的最佳方式,尤其是在自然语言处理中。因为在自然语言中,我们实际上有单词序列(可能是文本或语音),我们可能希望得到的表示不是简单地获取文档中的所有单词,而是依次处理文档中的每个单词,并获得一种表示,因为我们知道单词的上下文实际上可以产生很大的影响,有时是紧邻的上下文,有时是更远的上下文。


因此,人们实际上在20世纪80年代早期就开始研究如何实现单词输入和单词输出表示,然后将前一个单词的输出传递给下一个单词,依此类推。在右侧的循环网络中,我们可能有一行三个单词。一个单词输入到这里,获得一个表示作为输出,然后将其与第二个单词的信息结合,再输出到第三个单词,依此类推。它可能无限长(也许不是无限长,但可以是任意长),而不是固定长度。然后我们将从输出中学习一些东西。这里的每个节点内部可能也有多层,甚至输出也可能有多层。
这就是所谓的循环神经网络。一般来说(因为有很多不同类型),它们通常被称为循环神经网络,因为它们将信息传递给下一个节点,并处理序列。在神经网络处理中,你经常会听到人们谈论序列到序列建模,因为自然语言中的许多任务(如语音识别、机器翻译)通常被称为序列到序列建模,并且它们使用某种形式的循环神经网络。有很多不同类型的循环神经网络,但这是最简单的形式。
重要的是,回到我们的文档分类问题,这种类型的模型将擅长识别在上下文中某处出现的“皇家马德里”这个二元词组,因为这是谈论足球的强有力指标,而不仅仅是任意出现在文档中但不相邻的“real”和“Madrid”这两个英文单词。我们可以区分它们。
循环神经网络的计算与变体
我们如何计算每个层级的隐藏层?实际上,我们真正想说的是,这就像查看一个中间节点,我们取来自前一个节点的任何信息和来自当前单词的任何信息(不一定非得是单词,但单词是很好的例子),然后会有一个组合函数做一些处理,将两者作为该点的输出并传递给下一个节点。我们可以在这里有更复杂的东西,但这是看待它的最简单方式。
处理循环神经网络有很多不同的方法,独立于绿色部分(即内部结构)的复杂性。有时我们查看所有这些单词,然后在最后有一个单一输出,这可能是情感分析或我们一直在讨论的文档分类。现在,也许这是一个更好的表示,而不是仅仅将其视为一个大词袋,我们实际上是在依次查看每个单词。
有时我们想做多对多映射,也许每个输入都会有一个输出,但我们关心上下文。例如,词性标注就是一个很好的例子,命名实体识别也是,我们关心上下文,并试图判断这是一个地名还是人名。有时我们会有一堆输入,直到某个特定点才有输出,然后我们开始输出一堆东西。机器翻译是一个很好的例子,因为在机器翻译中,我们通常先查看源语言的所有单词,然后到达句子结尾,此时我们开始输出目标语言的句子。我们这样做的原因是,在进行翻译时,词序可能完全不同。例如,英语是主谓宾,而日语输出可能是主宾谓。所以我们必须交换宾语和动词的位置。
因此,在机器翻译中,我们通常收集所有信息,然后在最后输出。语言生成过程通常也是这样工作的,预测对话中的下一轮也是如此。但我们不需要逐词进行。我们可以逐字符进行。对于像英语和中文这样的语言,这样做可能没有优势,但对于大多数具有复杂形态的语言(英语和中文是特例),如果我们将每个单词视为单独的标记,而不查看其内部字符如何指代形态变体和其他词根,就会错过一些东西,并且需要多得多的数据来训练。因此,我们也可以说从字符而不是单词构建这些序列模型,我们经常这样做,翻译通常是这样做的好方法,通常可以处理你从未见过的新词。
长短期记忆网络
除了循环神经网络,还有其他表示序列的方式,现在更常用的是长短期记忆网络。LSTM是标准缩写。与仅仅通过某个门控形式将输入和输出组合在一起不同(该形式既输出到隐藏层也输出到下一个节点),我们实际上可以做的是:我们可以让所有信息都通过,但用这里的某个东西进行门控,并学习哪些部分应该通过。然后,我们可以使这里的组合事物复杂化,我们还可以获取单词本身并能够传递它,而不是某种高级表示。
尽管理论上这完全没有区别,但实际上在训练时,就训练速度和它捕获单词级信息(如果我们处理单词)和高级信息的速度而言,LSTM要好得多。因此,许多人实际上会使用LSTM。从技术上讲,它们仍然是一种循环神经网络,但人们使用的是循环神经网络的简单形式。所以,如果有人说他们使用循环神经网络,而你想听起来很聪明,可以问是否是LSTM,因为这是一个非常合理的问题。
LSTM本身有许多不同的变体,其中有一些选项。很多时候人们并不关心,但如果你仔细观察,你可能应该关心这一点。大多数工具包实际上允许你尝试这个,但这可能不重要,取决于你实际训练的目标和训练方式。
双向循环神经网络与注意力机制
循环神经网络(无论是LSTM还是其他)可以是单向的(从左到右或从右到左),但也可以是双向的。实际上,在语言中,我们经常同时关心从左到右和从右到左的信息,因为信息是双向流动的。如果你有完整的句子并试图对其做些什么,那么同时进行从左到右和从右到左的处理以了解更多关于前后信息是非常好的。在语言建模中,有些情况下你不能展望未来。例如,当你试图预测某人接下来要说什么时,你不能查看他们接下来要说什么来预测他们接下来要做什么,因为那个时间还没有发生。尽管新闻中关于神经网络有很多炒作,但我们还不能进行时间旅行(至少据我所知)。所以,双向循环神经网络、双向LSTM也是完全合理的事情,尤其是在处理单词序列时,后面的信息非常相关。

因此,当你查看像BERT
16:非英语语言的NLP 🌍


在本节课中,我们将探讨自然语言处理(NLP)在英语之外的语言世界中的应用。我们将了解全球语言的多样性、为不同语言开发技术所面临的挑战与机遇,以及为何需要关注资源匮乏的语言。
关于考试内容的说明

上一节我们介绍了课程的整体安排,本节中我们来看看关于期末考试的一个具体问题。
有同学询问关于多模态客座讲座(例如Transformer模型)的内容在期末考试中的占比。对于期末考试,你需要了解以下内容:
- 你需要知道Transformer是什么。
- 你需要了解不同神经网络架构的基本特性。这意味着你应该知道CNN(卷积神经网络)、RNN(循环神经网络)、LSTM(长短期记忆网络)以及Transformer是什么。
这并不意味着你需要能够完整描述它们的所有细节。但你应该知道这些架构是什么、它们各自擅长什么,以及它们的一些属性,例如可能的应用场景。
你确实需要掌握多模态客座讲座中的知识,考试中很可能会有题目大量涉及该讲座的内容。因此,你需要了解那些知识。
具体来说,你不需要能够绘制Transformer的示意图并讨论其背后的所有数学原理。但你应该知道注意力机制和自注意力是什么。如果你了解这些基础知识,就足够了。
多语言世界的NLP
在之前的课程中,我们主要讨论的是英语NLP。你的项目也是基于英语NLP,大多数讲座的例子也来自英语NLP。这不仅是因为我们是在英语语境下上课,英语是我们共享的通用语言,还因为大量的NLP研究是基于英语进行的。
例如,许多数据集仅存在于英语中,没有其他语言的等效数据集。因此,人们有时会假设,语言就是语言,如果一种解决方案对英语有效,那么它对任何语言都有效。所以只需要确保它对英语有效,其他语言的问题就微不足道了。
但事实并非完全如此,这也是我们今天要讨论的部分内容。当你超越英语NLP时,会遇到一些其他有趣挑战,同时也存在机遇。
世界的语言多样性
首先,根据一个名为Ethnologue的世界语言目录,世界上有超过7400种语言。这个数字是高于还是低于你的预期?
这取决于如何区分方言和语言,这是我们接下来要讨论的问题。方言与语言的区分,我们会发现这些术语被不同的人以不同的方式使用。当语言学家使用时,它们意味着一件事;当普通人使用时,它们意味着另一件事,并且这两者并不一致。
我们稍后会详细讨论。这里我们只讨论具有官方地位的语言吗?答案是否定的。就某些国家具有官方地位的语言而言,数量要少得多,只有几百种,而不是几千种。
那么,我们如何定义语言以回答之前的问题呢?在Ethnologue中,当他们确定什么是语言、什么是不同的语言时,他们使用了称为词汇统计学的方法。他们获取要比较的每种语言变体的词汇列表,如果任何两种变体之间同源词(显然具有相同起源的词)的数量超过某个阈值,那么我们就说这些不是不同的语言,而是同一语言的方言。如果低于该阈值,那么我们就说这些是独立的语言,是不同的语言的方言。
有时这些决定并非如此明确,但这是理想的方法论。所使用的核心标准是相互可懂度。如果两种语言变体是相互可懂的,即只懂这些变体的人可以在没有事先接触的情况下相互交谈,那么我们会说这些不是独立的语言,而是同一语言的方言。
例如,美式英语和英式英语是不同的,事实上,有许多不同的英式英语变体。但标准英式英语或标准发音与美式英语,如果我们让两个从未接触过对方语言的人共处一室,他们可以相互交谈。因此,我们会说美式英语和标准发音是同一语言的方言。
但是,说英语的人和说荷兰语的人则不会处于同样的情况,尽管荷兰语和英语关系相当密切,但仍然差异很大,荷兰语使用者和英语使用者在没有事先接触的情况下可能只能理解大约5%。我们稍后会回到这个问题,但这对语言技术来说很重要,因为方言需要一些特殊处理。而当你遇到完全独立、相互不可懂的语言时,你通常需要完全独立的模型、完全不同的数据等等。
这是一张世界语言地图,每个绿色小点代表一种语言。你会看到,在北美,英语是一个点(在英国,不在北美)。北美有许多原住民语言,其中大多数正在消亡,所以它们是非常小的语言。中美洲和南美洲有更多语言。非洲有大量语言,西非和中非的密度非常高。与中东、欧洲等地相比,印度有高密度的语言。东南亚有很多语言。而根据Ethnologue的定义,语言密度最高的地方是新几内亚,那里大约有世界四分之一语言。
世界上有很多语言,许多语言集中在资金并不集中的地区。因此,许多语言被忽视了,特别是因为其中许多语言的使用者数量相当少。
但有些你可能没听说过的语言,却有非常多的使用者。世界上大多数人,在人类历史上,大多数人都说一种以上的语言。在座有多少人会说两种语言?至少两种。有多少人会说至少三种语言?很好。有多少人会说三种以上语言?所以大约有四、五个人会说超过三种语言。
你都会说哪些语言?英语、印地语、卡纳达语和泰卢固语。这些都是大语言,都有很多使用者,我认为了解它们都很有用,特别是在印度南部。或者印地语,如果你在印度任何地方或印度侨民社区。
大多数人会说一种以上的语言,人类历史上大多数人都会说一种以上的语言。这里有一个我过去研究过的语言的例子,这种语言叫Koktai。Koktai的使用者主要居住在印度东北部曼尼普尔邦Ukhru区的一个叫Koktai的村庄里。
说Koktai的人在家里说这种语言,但在家庭或村庄生活之外基本不说。如果他们想与同属一个民族群体的邻近村庄的人交谈,他们会说一种相关的语言叫Tangkhul。Koktai和Tangkhul有时被称为那加语言,尽管这个类别意义不大,但由于历史原因,它们有时被这样称呼。
在高中阶段,Ukhru区的人,比如Koktai村的人,接受Tangkhul语的教育,这也是他们在教堂使用的语言,因为大多数Koktai使用者,实际上我认为所有Koktai使用者都是基督徒,他们大多属于美国浸信会教派。因此,他们的教堂服务不是用Koktai进行,而是用Tangkhul。
但他们生活在曼尼普尔邦。曼尼普尔邦的主要民族群体是梅泰人或曼尼普尔人,他们说一种与Tangkhul和Koktai有远亲关系的语言,叫梅泰语,这是曼尼普尔邦的官方语言。因此,在官方事务、高等教育中,例如,如果他们去曼尼普尔大学,教学语言将是梅泰语和英语。
但Koktai村的人不仅是一个区、一个邦的一部分,也是印度的一部分。实际上,他们中的许多人希望自己不是印度的一部分,因此他们进行了长期的叛乱,试图争取自治或独立。由于这个原因,曼尼普尔邦那个地区有很多印度士兵试图镇压叛乱,因此人们与许多士兵接触,并用印地语与这些士兵交谈。这也是他们与印度其他地区联系的主要方式。
因为Koktai村的人大多是美国浸信会教徒,所以他们与美国有联系。他们从美国接收传教士,派人到美国接受神学培训,这就是我遇到Koktai使用者的方式。他们也是国际社会的一部分,因此他们说英语,或者如果他们受过更多教育,许多人会说英语。
因此,对于生活在Koktai村的人来说,能够用所有这些不同的语言进行交流,并在不同语境中使用它们,并不罕见。事实上,这是普遍情况。
什么是全球语言?
这里的问题是,什么是全球语言?我会将其定义为一种你可能在学校(比如大学)学习的语言,一种你可能会学习的语言,不是作为专门的研究对象,而是作为通识课程的一部分。例如,主要是普通话、英语、法语、阿拉伯语、西班牙语、俄语、葡萄牙语、日语、德语、意大利语,现在还有韩语和土耳其语。我们可能还会加上印地语,因为越来越多的印度以外的人在学习印地语。
与汉语普通话相比,印度以外的人学习印地语的动力较小,因为印度有很多人说英语。如果你想去印度或与印度人交流,你只需要用英语。但印地语是另一种巨大的语言。
讨论所有这些的目的是为了谈论语言技术,谈论NLP。如果你想为你的语言拥有NLP,你希望提供哪些基本的东西,哪些技术给英语使用者、印地语使用者、梅泰语使用者、Tangkhul使用者,甚至可能是Koktai使用者(尽管它只是一个村庄,为一种只有几千人使用的语言开发语言技术相当困难)?
如果你说一种目前还没有什么语言技术的语言,你会想要什么?你想要哪些NLP功能?
以下是可能的需求:
- 翻译:翻译成或从更广泛使用的语言进行翻译,可能是指语音翻译,实现语音到语音的翻译。或者是指不仅适用于正式书面散文,也适用于口语对话或该语域的翻译。
- 语音技术:自动语音识别(ASR)、语音合成。
- 机器翻译:翻译成英语或其他全球语言,以及从这些语言翻译过来。
- 语言建模:语言模型有助于判断语言中可能的序列,这在许多语言技术中使用,例如语音识别、统计机器翻译。它也用于智能手机的预测文本输入、自动完成功能。
- 输入法:良好、易用的输入方法,如语音转文本、适合该语言的键盘。
- 拼写检查:如果人们要用该语言生成文档并保持拼写一致,则需要拼写检查。
- 语法检查:某种程度的语法检查。
- 大型语料库:拥有大型语料库是前提条件,但语料库本身不是技术,而是开发技术的基础。对于小语种,收集足够数据来训练好的语言模型或做其他事情通常是一个限制因素。
- 信息检索和搜索引擎:能够进行信息检索。
- 词法分析:处理语言的形态。
- 问答系统:与信息检索在很多情况下相关。
这些都是人们日常使用的东西。在这些功能之下,你需要为语言开发许多其他东西才能使一切正常工作。
以下是需要开发的基础设施:
- 语言检测:非常重要,例如在汇集数据集合时,你需要知道哪些数据是目标语言。
- 词性标注:我们在这门课中稍微涉及过。
- 句法分析:现今尤其指依存句法分析,可能需要产生依存树库。
- 语义角色标注:可能需要的。
- 命名实体识别:这对很多事情都有用,尽管用户不会直接下载NER应用到手机上,但它支撑着许多其他功能。
- 文本摘要。
- 机器翻译(再次提到)。
- 信息抽取和问答系统。
公司和政府使用所有这些来构建第一页提到的功能。但为了让一切正常工作,你必须建立大量的基础设施。
长期以来,为新语言创建语言技术最令人烦恼的事情之一是字符编码。如果你年纪稍长,你会记得有一段时间,每种语言都有自己的字符编码,因为你只能在一套编码中表示128或256个字符。因此,你必须为每种语言使用不同的编码和相应的字体,字体渲染也很差,生活很糟糕。我花了太多时间尝试在不同编码之间转换数据,比如中文的大五码和国标码,或者越南语的不同编码。
然后Unicode出现了,它解决了许多这些问题。现在,当有一种语言在Unicode中还没有得到很好支持时,有一个系统的过程可以将其添加进去。Unicode现在涵盖了世界上大多数文字系统,你可以用Unicode书写世界上几乎所有现存的文字,这是一项伟大的成就,我们都应该感激。
有同学提出了一个非常重要的问题:如果一种语言没有文字怎么办?有些语言根本没有自己的文字,或者没有任何文字书写系统。有人研究过为没有文字的语言开发纯粹基于语音的语言技术。基本上,你可以使用非文字的文本表示,比如音素层面的表示。但开发一种文字实际上要容易得多。如今,当你创造一种新的书写系统时,大多数时候你会使用罗马字母、西里尔字母或一种邻近大语言的书写系统(如果兼容性足够好)。因此,你可能需要一种用Unicode表示的方式,需要字体和字体渲染技术,然后,正如前面提到的,需要输入法。
如果你只说英语,你可能不理解这有多重要。你需要一种输入语言的方式,无论是通过键盘、语音还是其他方式。
另一个非常重要但人们有时不会想到的事情是,你需要标准的正字法,即标准的拼写系统,标准的书写系统。在我参与的一个DARPA项目中,我们为埃塞俄比亚最大的语言奥罗莫语开发NER、信息抽取和机器翻译。但奥罗莫语不是埃塞俄比亚的官方语言,在2000年代之前,它没有官方的正字法或书写系统。自1970年代以来有一种非官方的正字法,但并未标准化。因此,人们在何时写双元音、何时写双辅音上意见不一,人们只是按照听到的来写,并且存在方言变异。拼写上的大量变异使得技术开发变得困难。
为什么没有标准正字法会使开发技术具有挑战性?原因如下:
- 如果拼写不同,你可能无法识别同一单词的不同实例。
- 想象一下,你正在构建一个N元语言模型,一切都会被搞乱,因为实际上是同一个单词的实例被不同地书写,导致欠泛化,并可能导致稀疏性问题。
- 不仅对于语言建模,对于其他任务也是如此,因为有时一种拼写很少出现,看起来有很多不同的单词,但实际上只是几个单词,只是有很多不同的拼写方式。
- 你的表示是稀疏的。
- 你错过了这些单词具有相同语义的泛化,因为它们拼写不同。这会给任何你训练的模型注入表面噪音。


因此,标准化你的正字法,让一些当地人来教人们正确拼写,将使开发语言技术变得容易得多。
然后,最困难的部分可能是获取足够的文本或语音数据来训练模型,这取决于你试图训练哪种模型,可能需要大量数据。
语言技术的分布现状
以下是一些语言,这些实际上是世界上按母语者数量排名的前20种语言,从大到小排列。我想让你们告诉我,你们认为其中哪些语言可能拥有我们上面列出的大部分语言技术。
以下是可能拥有较好语言技术的语言:



- 联合国语言:英语、法语、俄语、西班牙语、汉语普通话、阿拉伯语。
- 印地语。
- 韩语。
- 德语:德国GDP高,资源丰富,也是欧盟主要语言之一。实际上,任何欧盟语言由于欧盟的补贴,其语言技术的发展程度可能超过其使用者数量所预期的水平,因为在这方面投入了大量资源。
- 葡萄牙语:葡萄牙在欧盟,巴西是一个大国,还有其他国家说葡萄牙语,如安哥拉和莫桑比克,尽管这可能不是它们拥有较好语言技术的原因。欧盟因素和葡萄牙、巴西作为人口大国(现在是中等收入国家)都有贡献。
让我们看看对每种语言技术发展程度的评估,你会发现我们基本上是对的。例如,葡萄牙语有相当程度的发展,尽管不如西班牙语。俄语、日语、法语、韩语,以及在某种程度上德语,都有良好的语言技术。
但为什么呢?你会注意到一些顶级语言中有些没有太多语言技术,孟加拉语、旁遮普语、泰卢固语、马拉地语和泰米尔语有什么共同点?

有同学说,任何其他印度语言都被印地语作为更可能被投资的通用语言所掩盖。这无疑是事实,对印地语技术的投资要多得多,资源被投入到印地语而不是这些其他语言中,尽管它们有数百万的使用者。例如,孟加拉语按母语者计算是世界第七大语言,但它的语言技术非常薄弱。我做过一些孟加拉语NLP工作,有很多文本数据,但除此之外的工作不多。

除了印地语因素,还有英语因素。当印度的中产阶级使用电脑时,他们使用母语的频率如何?他们使用英语的频率如何?根据经验,几乎总是英语。部分原因可能是大多数教授NLP等课程的高等教育机构是用英语授课的。但很大程度上是因为受过教育的印度人习惯于使用英语技术,并利用所有现有的英语技术。即使在印度开发语言技术,也常常是针对英语,因为市场被认为在那里。

现在,大多数印度人是否希望一直说英语并只使用英语电脑?根据我的非正式调查,可能不是。但受过教育的人习惯于使用英语,而且这样更容易,你不需要复杂的输入法。
另一个可能重要的因素是,许多印度语言在互联网上有时使用罗马化拼写,而不是其标准的书写音节文字。主要问题是,人们很难输入天城文或其他印度文字。他们必须有特殊的输入法,而且很难习惯,通常无法在普通笔记本电脑或台式机上轻易买到专门支持这些正字法的键盘,而且人们可能也不想要,因为他们也想使用英语。因此,为了绕过这个问题,人们为不同的正字法开发了罗马化方案,用英文字母、罗马字符输入这些语言的方式。
这实际上不是问题,只要人们遵守标准化约定,这可以作为良好NLP的基础。你甚至可以自动在标准正字法和罗马化之间转换。问题在于缺乏标准化和公认的约定。

但我认为,随着技术,特别是语音技术(与不一定识字或文化程度不高的人相关)的普及,随着低成本智能手机等的普及,对这些其他语言的语言技术市场的吸引力将真正扩大,人们将习惯于使用英语或这些主要全球语言之外的语言的技术。

那么,语言技术主要只存在于主要的全球语言中,这可以吗?即使对于许多这些语言,也存在尚未开发的重要语言技术。
为什么我们需要其他语言的语言技术?为什么前12种语言不够?为什么英语不够?难道不能每个人都只使用英语的语言技术吗?我们应该担心这个问题吗?
以下是支持为其他语言开发技术的论点:
- 社会和文化的理由:希望防止许多语言的灭绝,缺乏语言技术会加速灭绝,因为缺乏日常生活的便利性和使用。并非所有人都被前12种语言覆盖,特别是在欠发达地区。
- 道德论点:我们希望每个人都能获得语言技术。
- 文化论点:我们希望保护语言和文化,为它们提供语言技术是促进其发展、帮助其与使用者保持相关性从而不至于灭绝的一种方式。
- 经济论点:即使你覆盖了前12种左右语言的使用者,世界上仍有大量的人不把这些语言作为母语。这是一个潜在的市场。随着硬件成本降低、数据连接成本降低,向说这些语言的人销售语言技术的机会变得更大。
- 政府与安全需求:政府通常也对低资源语言的语言技术感兴趣,例如用于识别错误信息、发现预谋犯罪等。美国政府就是如此,这也是他们资助我为低资源语言工作的原因,以便能够与主要说这些低资源语言地区的人交流,收集和处理信息,建立世界动态模型。
因此,实际上有很多理由想要为低资源语言开发语言技术。
方言与语言:术语的挑战
我们稍微谈了一下方言和语言。在中国,有非常多的语言变体,人们以差异巨大的方式说汉语。这包括标准普通话、其他官话变体、上海话和其他吴语变体、粤语和其他粤语变体、客家话和其他闽语变体,以及其他语组变体,如晋语、赣语、湘语等。


如果你问一个中国的普通人或语言学家关于这些变体,他们会称之为“方言”。而“方言”在英语中通常被翻译为“dialect”。但它与语言学家使用的英语术语“

浙公网安备 33010602011771号