查看全课大纲(第 10 / 69 节)
- 1.NLP 的研究领域、应用与学习路径
- 2.自然语言的基本术语
- 3.信息论基础:信息熵与交叉熵
- 4.语言的进化与语义变迁
- 5.主观概率、客观概率与条件概率
- 6.贝叶斯原理与推理
- 7.随机变量:二项式、期望方差与联合概率
- 8.常见概率分布
- 9.辛普森悖论与贝叶斯解题实例
- 10.语言模型:语言概率与词袋模型
- 11.n-gram 语言模型(二元 / 三元 / N-Gram)
- 12.语言模型评价:交叉熵、困惑度与插值
- 13.朴素贝叶斯文本分类:垃圾邮件
- 14.拼写检查
- 15.中文分词:构词法、最大匹配、最优路径与 Jieba
- 16.词表示问题与语义相似度
- 17.TF-IDF 权重处理
- 18.One-Hot 表达与词表示的局限
- 19.Word2Vec 核心思想
- 20.Word2Vec 训练过程
- 21.Skip-gram 模型详解
- 22.词性标注任务与标注方法(规则 + N-Gram)
- 23.EM 算法与混合模型
- 24.高斯混合模型 GMM
- 25.从混合模型到隐马尔可夫模型
- 26.隐马尔可夫模型(HMM)推导与维特比解码
- 27.线性链条件随机场 CRF
- 28.贝叶斯网络与图模型
- 29.隐马尔可夫链与 HMM 推导
- 30.PLSA 主题模型
- 31.LSI 与 SVD 向量表达
- 32.LDA 与狄利克雷分布
- 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
- 34.上下文无关文法(CFG)与句法分析
- 35.概率上下文无关文法 PCFG
- 36.统计机器翻译:词对齐与翻译模型
- 37.统计机器翻译中的对齐模型与参数估计
- 38.从统计机器翻译到神经机器翻译
- 39.神经元与反向传播速览(指向深度学习课)
- 40.CNN 原理及其在 NLP 中的应用
- 41.循环神经网络的基本原理与 Elman / Jordan 网络
- 42.LSTM:长短期记忆网络的核心思想与分步实现
- 43.Encoder-Decoder 框架
- 44.Seq2Seq 与早期注意力机制
- 45.注意力机制的背景与动机
- 46.注意力模型实现原理与匹配函数
- 47.记忆网络:组成与计算
- 48.注意力机制的应用与历史延展
- 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
- 50.Multi-Head Attention、FFNN 与位置编码
- 51.层归一化、损失函数与 Universal Transformer 延展
- 52.预训练范式:从 ELMo 到 BERT
- 53.BERT 与掩码语言模型
- 54.BERT 下游任务微调与 GLUE 口径
- 55.GPT 与自回归语言建模
- 56.GPT-1 到 GPT-4 的演进
- 57.指令微调与 RLHF
- 58.分词器:BPE、WordPiece 与中文词表
- 59.上下文窗口与长文本处理
- 60.能力边界、成本与适用场景
- 61.文本分类实战:从朴素贝叶斯到逻辑回归
- 62.命名实体识别实战
- 63.文本生成与摘要实战
- 64.语义检索与向量库实战
- 65.RAG 知识库问答
- 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
- 67.幻觉与事实性问题
- 68.文本与知识结合(知识图谱压缩)
- 69.跨媒体信息检索与未来展望
语言模型:语言概率与词袋模型
小象实战讲义 · 自然语言处理
欢迎来到《自然语言处理》课程的第三章。在前两章,我们探讨了自然语言处理的基本任务和挑战。从本章开始,我们将深入NLP的核心技术之一——语言模型。语言模型是理解、生成和评估自然语言的基础,它贯穿于语音识别、机器翻译、文本生成等几乎所有NLP应用。本节作为语言模型的入门,将为你建立最基础的概率语言观,并介绍一个简单但影响深远的模型——词袋模型。学完本节,你将能理解如何用概率量化一段文本的“合理性”,并掌握词袋模型的基本思想及其应用场景。
💡 核心导读
- 语言即概率:语言模型的核心思想是将一段话(utterance)视为一个随机事件,其概率大小反映了该话语在语言中出现的“自然程度”。
- 无限猴子定理:通过一个思想实验,直观感受在完全随机假设下,生成有意义文本的概率有多么微小,从而凸显语言中蕴含的结构性。
- 词袋模型(Bag-of-Words):一种简化但强大的文本表示方法,它忽略词序和语法,只关心文档中每个词的出现频率,是许多经典文本分类和情感分析任务的基础。
- 从独立到条件:理解从最简单的“词与词相互独立”的假设,到更符合语言事实的“条件概率”假设的演进思路,这是后续n-gram等模型发展的起点。
语言模型:为语言赋予概率
什么是语言模型(Language Model)?简单来说,语言模型就是计算一段话语(utterance)或一个句子(sentence)在某种语言中出现的概率的模型。
一段话语可以看作一个词序列(sequence of words)。例如,“The dog barks.” 就是一个序列。在建模时,我们通常会在句子末尾加上一个特殊的结束符,如 <EOS> (End Of Sentence) 或 <STOP>,以明确句子的边界。因此,一个句子 S 可以表示为: S = w_1, w_2, ..., w_n, <EOS>
语言模型的任务就是计算这个序列的概率: P(S) = P(w_1, w_2, ..., w_n, <EOS>)
这个概率值衡量了该句子在语言中的“自然程度”或“流畅程度”。例如,我们凭直觉知道 P("The dog barks.") 应该远大于 P("The cat barks."),而 P("The dog barks at you.") 的概率则介于两者之间。语言模型的目标就是量化这种直觉。
作为一个概率模型,它必须满足概率的基本公理:
- 非负性:对于任意词序列
x_1, x_2, ..., x_n,其概率P(x_1, x_2, ..., x_n) >= 0。 - 归一性:所有可能的词序列(来自词汇表
V的所有组合)的概率之和为 1。即:∑_{x_1, x_2, ..., x_n ∈ V} P(x_1, x_2, ..., x_n) = 1
无限猴子定理:一个思想实验
为了理解计算句子概率的挑战,我们来看一个著名的思想实验——无限猴子定理(Infinite Monkey Theorem)。
给定无限长的时间,一只在打字机上随机敲击键盘的猴子,几乎必然能打出莎士比亚的全部著作。
这个定理听起来不可思议,但它从概率论的角度是成立的。关键在于“无限长的时间”和“几乎必然”。让我们通过一个简化例子来感受一下这个概率有多小。
假设打字机有 50 个键(包含字母、空格和标点)。猴子最喜欢的单词是 “banana”,它由 6 个字母组成。猴子完全随机且独立地敲击每个键。
- 第一次敲出 ‘b’ 的概率是
1/50。 - 第二次敲出 ‘a’ 的概率也是
1/50。 - …
- 连续六次恰好敲出 “banana” 的概率是:
(1/50) × (1/50) × (1/50) × (1/50) × (1/50) × (1/50) = (1/50)^6 ≈ 1 / 15,625,000,000
这个概率大约是 150亿分之一!这还只是敲出一个6字母单词的概率。要敲出莎士比亚的鸿篇巨著,其概率之小已经超出了人类的直观想象。
这个实验告诉我们两件事:
- 在完全随机、相互独立的假设下,生成有意义文本的概率极低。
- 真实的语言绝非随机,词与词之间存在着强烈的依赖关系。语言模型的核心任务,就是捕捉并量化这种依赖关系。
最简单的语言模型:词袋模型
基于“无限猴子”的完全独立假设,我们可以构建第一个,也是最简单的语言模型。
独立假设模型
如果我们假设一个句子中每个词的出现都与其他词完全独立,那么句子的概率就是每个词单独出现概率的乘积: P(w_1, w_2, ..., w_n) = P(w_1) × P(w_2) × ... × P(w_n)
其中,P(w_i) 可以通过在大型语料库(如多年的新闻文本)中统计词 w_i 出现的频率来估计: P(w_i) = Count(w_i) / N 这里 N 是语料库中所有词的总数(即所有“一元组”的总数)。
例如,对于句子 “I love China”:
P("I") = Count("I") / NP("love") = Count("love") / NP("China") = Count("China") / NP("I love China") = P("I") × P("love") × P("China")
显然,这个模型过于简化了。独立乘积相对序列的真实概率没有固定的大小方向:词间正依赖时联合概率可高于独立乘积,负依赖时可低于独立乘积,不能仅凭独立假设断言本例必然高估。它忽略了“I love”之后更可能接“you”、“my country”等词,而不是任意一个像“China”这样的词这一事实。词与词之间并不是独立的。
词袋模型(Bag-of-Words, BoW)
尽管独立假设不符合语言事实,但由词袋计数出发,再进一步假设各词独立,就得到了最简单的一元语言模型;而词袋模型(Bag-of-Words, BoW)本身只是一种文本表示:它保留词项特征及计数、丢弃顺序,也可以与逻辑回归等不采用独立假设的模型结合。
词袋模型的核心思想是:将一篇文档(或一个句子)看作一个装词的“袋子”,只关心袋子里有哪些词以及每个词出现了多少次,完全忽略词出现的顺序、语法和句法关系。
例如,对于影评句子:
“I love this movie, it’s sweet, but the sucks. Satirical humor, the dialogue is great and the adventure scenes are fun.”
按简单空格切分并去掉句末标点后,得到的是一个词频向量(下列计数与该句一一对应):
the: 3次I(即小写i): 1次it’s: 1次sweet: 1次great: 1次love: 1次movie: 1次- … 其余词各出现1次
原始的句子结构信息完全丢失了,只剩下词汇及其计数。
# 一个简单的词袋模型表示示例(伪代码思路)
# 假设我们有一个微型语料库和一篇文档
corpus_vocab = ["i", "love", "this", "movie", "it", "is", "great"] # 词汇表(与下文统一为小写)
document = "I love this movie. It is great."
# 词袋表示过程:
# 1. 分词(这里简单按空格分),统一转小写
tokens = document.lower().replace('.', '').split() # ['i', 'love', 'this', 'movie', 'it', 'is', 'great']
# 2. 统计频率
bow_vector = {}
for word in corpus_vocab:
bow_vector[word] = tokens.count(word)
print("词袋向量(基于给定词汇表):")
print(bow_vector)词袋向量(基于给定词汇表):
{'i': 1, 'love': 1, 'this': 1, 'movie': 1, 'it': 1, 'is': 1, 'great': 1}词袋模型的优势在于其极大的简化和可计算性。它将变长、结构复杂的文本,转换成了定长、数值化的向量。这个向量可以直接作为机器学习模型(如逻辑回归、朴素贝叶斯、支持向量机等)的输入,用于文本分类、情感分析、信息检索等任务。
在课件中,也展示了如何利用基于词袋特征(Bag-of-Words Features)的逻辑回归(Logistic Regression)进行情感分析。词袋模型也被引申为特征袋(Bag-of-Features),广泛应用于计算机视觉(图像局部特征)、音频处理等领域。
从独立到条件:语言模型的演进方向
词袋模型的成功并不意味着“词间独立”的假设是正确的。它只是在一个特定任务(如基于词频的文档分类)上,这个假设的负面影响被其他因素(如大量的训练数据、简单的模型结构)所弥补了。
回到语言概率的本质。不作独立假设时,任意联合分布都满足链式法则(精确恒等式): P(w_1, ..., w_n) = P(w_1) · P(w_2 | w_1) · ... · P(w_n | w_1, ..., w_{n-1}) 被假设截断的是历史长度,而不是条件概率本身。后续 n-gram 模型进一步假设每个词只依赖前面有限个词;条件概率写成: P(w_n | w_1, w_2, ..., w_{n-1}) 即第 n 个词 w_n 出现的概率,依赖于前面所有词 w_1 到 w_{n-1}。
这就是条件语言模型的基本思想。后续我们将要学习的 n-gram 模型、马尔可夫模型,以及更现代的循环神经网络(RNN)、Transformer 等,都是在这一思想下,以不同的方式和复杂度来建模这种条件依赖关系。
📝 动手练一练
- 概念辨析:词袋模型(Bag-of-Words)完全忽略了文本中的哪种信息?这种忽略在哪些类型的NLP任务中可能成为严重缺陷,在哪些任务中影响相对较小?
- 概率计算:假设有一个极小的语言,词汇表只有 {“a”, “b”, “c”}。在一个大型语料库中统计得到:
P("a") = 0.5,P("b") = 0.3,P("c") = 0.2。若采用“词间独立”的简单语言模型,请计算序列 “a b c” 的概率。如果语料库中“a b c”这个三元组出现的实际频率是 0.05,这个简单模型的计算结果说明了什么问题?
👉 点击查看参考答案
概念辨析:
- 词袋模型完全忽略了词的顺序信息、语法结构和句法关系。
- 可能成为严重缺陷的任务:任何依赖词序或句法理解的任务,如机器翻译(“猫追老鼠” vs “老鼠追猫”)、句法分析、语义角色标注、某些需要理解逻辑关系的问答系统。
- 影响相对较小的任务:主要依赖关键词出现与否和频率的任务,如垃圾邮件过滤(判断是否包含“免费”、“获奖”等词)、基于主题的文档分类(判断文档属于“体育”还是“科技”)、简单的情感分析(判断积极/消极词汇的密度)。
概率计算:
- 根据独立假设:
P("a b c") = P("a") × P("b") × P("c") = 0.5 × 0.3 × 0.2 = 0.03。 - 模型计算结果(0.03)小于实际统计频率(0.05),比值为
0.05/0.03 = 5/3 > 1,说明该序列整体上呈相对独立模型的正依赖。但仅凭这两个总数,不能分别推出P(b|a) > P(b)和P(c|ab) > P(c);要分别验证这两点,还需要P(ab)等更细粒度的数据。简单模型由于假设独立,未能刻画这种常见搭配序列的依赖结构。
- 根据独立假设:
本章小结
本节我们建立了语言模型的基本概念:用概率来衡量一段文本的自然程度。我们从“无限猴子定理”这个思想实验出发,理解了在完全随机假设下生成有意义文本的困难,从而引出了语言内在的结构性。
接着,我们介绍了词袋表示(Bag-of-Words, BoW):只保留词项与计数、丢弃顺序;在 BoW 计数上进一步施加词间独立假设,才得到最简单的一元语言模型。尽管独立假设过于简化,词袋表示以其简单、高效的特点,成为文本表示的一项基础技术,并将文本转换为机器学习模型可处理的数值向量。
最后,我们指出了语言模型发展的正确方向:从“独立”走向“条件”。一个词的概率应取决于其上下文。这为后续学习 n-gram、马尔可夫链以及更复杂的神经网络语言模型铺平了道路。
📋 行动清单
- 理解语言模型的核心是计算
P(句子),并能解释这个概率的直观意义。 - 掌握词袋模型的思想:忽略词序,只统计词频。能想象出一段文本被转换成词袋向量的过程。
- 明确“词间独立”是一个强假设,它不符合语言事实;该假设是一元语言模型和朴素贝叶斯等生成式模型的基础,而词袋作为表示本身并不要求独立。
- 思考:如果让你改进词袋模型,除了词频,你还可以加入哪些信息来更好地表示文本?(提示:想想我们平时如何区分两篇不同的文章)
—— 小象教研组