
目录
-
[1.1 自然语言处理的概念](#1.1 自然语言处理的概念)
-
[1.2 自然语言处理的难点](#1.2 自然语言处理的难点)
-
[1.3 自然语言处理任务体系](#1.3 自然语言处理任务体系)
-
[1.3.1 任务层级](#1.3.1 任务层级)
-
[1.3.2 任务类别](#1.3.2 任务类别)
-
[1.3.3 层次 × 任务 二维表](#1.3.3 层次 × 任务 二维表)
-
[1.3.4 研究对象与层次](#1.3.4 研究对象与层次)
-
[1.3.5 语言学知识库与语料库](#1.3.5 语言学知识库与语料库)
-
-
[1.4 自然语言处理技术发展历史](#1.4 自然语言处理技术发展历史)
-
[1.4.1 两大范式:理性主义与经验主义](#1.4.1 两大范式:理性主义与经验主义)
-
[1.4.2 表示方法的演进](#1.4.2 表示方法的演进)
-
[1.4.3 四个发展阶段](#1.4.3 四个发展阶段)
-
[1.4.4 预训练 + 精调:新范式](#1.4.4 预训练 + 精调:新范式)
-
[1.4.5 大模型时代:ChatGPT、提示工程与指令微调](#1.4.5 大模型时代:ChatGPT、提示工程与指令微调)
-
1.1 自然语言处理的概念
1.1.1 一句话解释:让机器"听懂人话"
想象一下,你对着手机说:"帮我查一下明天去北京的高铁。"
手机没有长耳朵,但它要把你的一串声音变成文字,再理解"明天""北京""高铁"这些词,最后调用订票 App。这一整套"人话 → 机器能懂的信息 → 机器动作"的过程,就是 NLP(Natural Language Processing,自然语言处理) 在做的事。
再打个比方:
NLP 就像一位"人机翻译官"。人类说的是充满省略、歧义、情绪的"自然语言",机器只认识 0 和 1。NLP 的任务,就是在这两种"语言"之间搭一座桥。

图 1:NLP 的核心角色------把人类的自然语言翻译成机器能理解的结构化信息。
1.1.2 学术定义:NLP 到底是什么?
教材里给出的定义更严谨:
自然语言处理(NLP):用计算机来理解和生成自然语言的各种理论和方法。
它有两个核心方向:
-
NLU(Natural Language Understanding,自然语言理解):让机器"读懂"人话。
-
NLG(Natural Language Generation,自然语言生成):让机器"写出/说出"人话。
NLP 是 AI(Artificial Intelligence,人工智能) 的一个重要分支,也是 计算机科学 和 语言学 的交叉学科,因此它还有一个更学术的名字------CL(Computational Linguistics,计算语言学)。
🌰 类比:如果说 AI 是一所大学,NLP 就是里面的"语言学院",专门研究怎么让机器和人用自然语言交流。
1.1.3 为什么是"人工智能皇冠上的明珠"?
NLP 常被称为 "人工智能皇冠上的明珠"。为什么?
因为语言是人类智能的核心载体。我们思考问题、传递知识、协作创新,几乎都依赖语言。如果机器不能理解语言,它就很难真正"理解"世界。因此,NLP 被普遍认为是制约 AI 取得更大突破和更广泛应用的关键瓶颈之一。
💡 可以这样理解:视觉让机器"看见"世界,语音让机器"听见"世界,而 NLP 让机器"理解"世界。
1.1.4 NLP 家族里的几位"兄弟"
在教材和论文里,你还会经常看到这些缩写,别被吓到:
| 缩写 | 英文全称 | 中文含义 | 通俗解释 |
|---|---|---|---|
| NLP | Natural Language Processing | 自然语言处理 | 让机器处理和理解人类语言的总称 |
| NLU | Natural Language Understanding | 自然语言理解 | 机器"听懂"你在说什么(偏理解) |
| NLG | Natural Language Generation | 自然语言生成 | 机器"说人话"给你听(偏生成) |
| CL | Computational Linguistics | 计算语言学 | 计算机科学 + 语言学的交叉学科 |
| ASR | Automatic Speech Recognition | 自动语音识别 | 把声音变成文字 |
| TTS | Text-to-Speech | 文本转语音 | 把文字读出来 |
| LM | Language Model | 语言模型 | 预测下一个词是什么的模型 |
| LLM | Large Language Model | 大语言模型 | 参数量巨大的语言模型,比如 GPT、文心一言 |
💡 小技巧:看到论文里出现陌生缩写,先找它的全称,再对应中文,就不会一头雾水了。
1.1.5 从一个真实例子感受 NLP
假设你发了一条朋友圈:
"这家火锅店排队两小时,但真的值!"
NLP 系统可能要完成:
- 分词:这家 / 火锅店 / 排队 / 两 / 小时 / 但 / 真的 / 值
- 情感分析:整体是"正面"评价
- 实体识别:【火锅店】是商家,【两小时】是时间
- 信息抽取:可以提炼成"推荐某火锅店"
你看,一条随手发的动态,背后其实藏了一整套 NLP 流水线。
1.1.6 动手实验:用 jieba 做一个中文分词小工具
下面给出完整可运行的 Python 代码。运行后,你会看到一句话被切分成一个个"词块",这就是机器理解中文的第一步。
python
"""
实验 1.1:中文分词入门
目标:体验 NLP 的第一步------把连续的中文句子切成词
依赖:jieba(pip install jieba)
"""
import jieba
# 示例句子:生活中的自然语言
text = "我明天要去北京天安门广场看升旗仪式,顺便吃碗炸酱面。"
# 精确模式分词(适合文本分析)
words = jieba.lcut(text, cut_all=False)
print("【精确模式】", " / ".join(words))
# 全模式分词(把所有可能的词都列出来)
words_full = jieba.lcut(text, cut_all=True)
print("【全模式】", " / ".join(words_full))
# 搜索引擎模式(更细粒度,适合检索)
words_search = jieba.lcut_for_search(text)
print("【搜索模式】", " / ".join(words_search))
运行结果截图:

🤔 想一想:为什么中文需要分词?因为中文不像英文那样有空格隔开。机器看到的"我去北京"是一个连续字符串,必须先切开才知道"北京"是一个地名。
1.2 自然语言处理的难点
NLP 难,不是难在"让计算机接触文字",而是难在"让计算机真正理解文字背后的意义"。PPT 和教材把难点系统地归纳为八大类:

图 2:NLP 的八大难点------从符号到语义,从规则到常识,层层递进。
1.2.1 抽象性:符号背后的复杂世界
语言是由抽象符号构成的。每个词背后都对应着现实世界或头脑中的复杂概念。
比如"车"这个字,可以指汽车、火车、自行车、电动车......它们共同点是"有轮子、能载人或物",但形态千差万别。机器只看到"车"这个字,无法像人一样一眼联想到各种具体事物。
🌰 对比:图像识别可以直接看到"一只猫",但 NLP 看到的是"猫"这个字,必须先从符号映射到概念。

图 2-1:抽象性------"车"字背后对应多种多样的具体事物。
1.2.2 组合性:有限拼出无限
语言的基本符号单元是有限的:英文 26 个字母,中文常用字也就几千个。但这些有限符号可以组合出无限的语义。
更麻烦的是,同样的词,顺序不同,意思也不同:
"狗咬人" ≠ "人咬狗"
机器无法像查字典一样"穷举"所有可能的句子,必须学会组合规则。

图 2-2:组合性------同样几个字,顺序不同,意思完全不同。
1.2.3 歧义性:同一形式,多种语义
这是 NLP 最著名的难点。歧义主要来源于"语言形式和语义之间的多对多关系":
-
一词多义:"苹果"是水果,也是公司。
-
一义多词:"曹雪芹写了《红楼梦》"和"《红楼梦》的作者是曹雪芹",形式不同,语义相同。
-
句法歧义:"关心自己的孩子"------谁关心谁?
💡 解决歧义的关键:上下文。人类靠常识和语境秒懂,机器却很难。

图 2-3:歧义性------同一形式可能对应多种语义。
1.2.4 进化性:语言是"活的"
任何一种"活着"的语言都在不断发展变化。新词层出不穷,旧词也被赋予新含义:
-
新词:超女、非典、新冠、内卷、躺平
-
旧词新义:腐败(原指食物变质 → 也指贪污)、杯具(谐音"悲剧")
机器学的是"过去的语料",但人类每天都在创造新说法。

图 2-4:进化性------语言不断产生新词和新义,老词典跟不上节奏。
1.2.5 非规范性:网络文本的"放飞自我"
互联网上,尤其是用户产生的内容里,经常出现非规范文本:
-
音近词:"为什么" → "为森么"
-
简写变形:please → pls,cool → coooooooool
-
新造词:喜大普奔、不明觉厉
-
错别字:各种手误
这些对机器来说都是"噪声"。

图 2-5:非规范性------网络文本的谐音、简写、新造词让机器头疼。
1.2.6 主观性:标准不统一
和图像、语音不同,NLP 任务往往带有主观性。比如:
"打篮球"是一个词还是两个词?
不同标注员可能有不同答案。这种主观性提高了数据标注难度,也让系统评价变得复杂。

图 2-6:主观性------不同人对同一段文字可能有不同的标注标准。
1.2.7 知识性:理解需要背景知识
理解语言通常需要大量背景知识和推理能力。
"张三打了李四,然后他倒了。"
问:这里的"他"指谁?
人类会结合生活常识判断"被打的人更可能倒下",但机器没有这些默认知识。如何表示、获取并利用知识,至今仍是开放问题。

图 2-7:知识性------理解句子需要结合生活常识和背景知识。
1.2.8 难移植性:一个模型走不通天下
NLP 涉及的任务和领域众多,彼此差异很大:
-
不同任务目标不同:分词 vs 机器翻译
-
不同领域用词不同:医学文本 vs 体育新闻
-
不同语言结构不同:中文无空格 vs 英文有形态变化
因此,很难用一个统一模型解决所有问题,这也给系统可移植性带来巨大挑战。大语言模型的出现,正是为了缓解这个问题。

图 2-8:难移植性------不同任务、领域、语言差异大,一个模型难以通吃。
1.2.9 动手实验:可视化"歧义"在不同上下文中的变化
下面的代码用 matplotlib 画出一个"词义热度图",展示同一个词在不同句子里偏向哪种含义。Mac 用户可直接运行,中文显示已配置好。
python
"""
实验 1.2:歧义可视化
目标:直观感受"同一个词在不同上下文里有不同含义"
依赖:matplotlib(pip install matplotlib)
"""
import matplotlib.pyplot as plt
import numpy as np
# Mac 中文字体配置
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'Arial Unicode MS'
plt.rcParams['axes.facecolor'] = 'white'
# 模拟"苹果"在不同上下文中的语义倾向
contexts = [
"我每天早上吃一个苹果",
"苹果公司发布了新 iPhone",
"牛顿被苹果砸中了头",
"苹果手表可以测心率",
]
# 0=水果, 1=公司/品牌
fruit_score = [0.95, 0.05, 0.90, 0.10]
brand_score = [0.05, 0.95, 0.10, 0.90]
x = np.arange(len(contexts))
width = 0.35
fig, ax = plt.subplots(figsize=(10, 6))
bars1 = ax.bar(x - width/2, fruit_score, width, label='水果含义', color='#FF9F43')
bars2 = ax.bar(x + width/2, brand_score, width, label='公司/品牌含义', color='#54A0FF')
ax.set_ylabel('语义倾向概率', fontsize=12)
ax.set_title('"苹果"在不同上下文中的含义消歧', fontsize=14)
ax.set_xticks(x)
ax.set_xticklabels(contexts, rotation=15, ha='right', fontsize=10)
ax.legend()
ax.set_ylim(0, 1.15)
# 在柱子上标注数值
for bar in bars1 + bars2:
height = bar.get_height()
ax.annotate(f'{height:.2f}',
xy=(bar.get_x() + bar.get_width() / 2, height),
xytext=(0, 3),
textcoords="offset points",
ha='center', va='bottom', fontsize=9)
plt.tight_layout()
plt.show()
运行结果截图:

效果说明:
运行后会出现一张柱状对比图。你会清楚看到:同样两个字"苹果",在不同句子里"水果含义"和"品牌含义"的概率此消彼长。这就是 Word Sense Disambiguation(WSD,词义消歧) 要解决的问题。
1.3 自然语言处理任务体系
NLP 不是单一任务,而是一棵大树。教材从三个维度梳理:层级、类别、研究对象。PPT 进一步把任务归纳为"五大类别",并给出了"层次 × 任务"的二维视角。
1.3.1 任务层级:处理的粒度有多大?
任务层级回答的是:处理的粒度有多大?
| 层级 | 处理对象 | 典型任务 | 英文缩写 |
|---|---|---|---|
| 字词级 | 单个字或词 | 分词、词性标注、命名实体识别 | CWS (Chinese Word Segmentation)、POS (Part-of-Speech Tagging)、NER(Named Entity Recognition) |
| 句子级 | 一句话 | 句法分析、情感分析、文本分类 | SA (Sentiment Analysis)、TC(Text Classification) |
| 篇章级 | 多句话/文章 | 阅读理解、文本摘要、文档分类 | RC (Reading Comprehension)、Summarization |
通俗理解:像读报纸一样分层
- 字词级:先认字、认词,知道"北京"是地名,"吃"是动词。
- 句子级:分析一句话的结构和情感,比如"这家店不错"是正面评价。
- 篇章级:把整篇文章读完,能回答"这篇文章主要讲了什么?"
1.3.2 任务类别:任务要干什么?
PPT 把 NLP 任务分为五大类,形成一个更完整的任务谱系:

图 3:NLP 任务的五大类别及其典型任务。
| 类别 | 核心作用 | 典型任务 |
|---|---|---|
| 回归问题(Regression) | 把文本映射为连续数值 | 作文打分、刑期预测、罚款金额预测 |
| 分类问题(Classification) | 给文本贴一个类别标签 | 垃圾邮件识别、情感分类、主题分类 |
| 匹配问题(Matching) | 判断两段文本之间的关系 | 文本相似度、问答匹配、语义蕴含 |
| 解析问题(Parsing) | 标注词语或识别词语间关系 | 分词、词性标注、NER、句法分析、语义角色标注 |
| 生成问题(Generation) | 根据输入生成一段自然语言 | 机器翻译、文本摘要、对话生成、图像描述生成 |
🎯 记忆口诀:"回归分类匹配解析生成"------按任务输出形式从简单到复杂排列。
下面把每类里的关键任务展开讲一下:
① 分类问题(Classification)
文本分类是最常见的 NLP 任务之一。输入一段文本,输出一个类别标签。
-
情感分类:判断评论是褒义、贬义还是中性。

图 3-7:情感分类------给文本贴上"正面 / 负面 / 中性"的情绪标签。
-
主题分类:判断新闻属于体育、财经、科技还是娱乐。
-
垃圾邮件过滤:判断邮件是正常邮件还是垃圾邮件。
-
问题类型分类:判断用户问的是"时间""地点"还是"原因"。
② 匹配问题(Matching)
判断两个文本之间的关系或相似度。
-
文本相似度评估:计算两句话有多像(0~1 之间)。
-
问题-回答匹配:判断一个答案是否能回答给定问题。
-
语义蕴含:判断前提和假设之间是"蕴含""矛盾"还是"无关"。

图 3-8:文本匹配------比较两段文字的关系或相似度。
③ 解析问题(Parsing)
对文本进行结构化分析,是 NLP 的"语法课"。
-
中文分词(CWS, Chinese Word Segmentation):把汉字序列切成词序列。例如"自然语言处理" → "自然语言 / 处理"。

图 3-1:中文分词------把连续汉字"切"成有意义的词块。
-
词性标注(POS, Part-of-Speech Tagging):给每个词标注词性,如名词、动词、形容词。英文常用 Penn Treebank 标签,如 NNP(专有名词)、VBD(过去时动词)、IN(介词)。

图 3-2:词性标注------给每个词贴上词性小标签。
-
命名实体识别(NER, Named Entity Recognition):识别文本中的人名、地名、机构名等实体。

图 3-3:命名实体识别------在文本中圈出人名、地名、机构名等实体。
-
依存句法分析(DP, Dependency Parsing):分析句子成分之间的依存关系,比如主谓宾、定状补。

图 3-4:依存句法分析------画出词语之间的"主谓宾"关系网。
-
语义角色标注(SRL, Semantic Role Labeling):标注谓词的论元,如施事、受事、时间、地点。

图 3-5:语义角色标注------搞清楚"谁做了什么、对谁、在哪里、什么时候"。
-
共指消解(Coreference Resolution):识别文本中不同 mentions 是否指代同一实体。例如"张三打了李四,然后他倒了"中的"他"到底指谁。

图 3-6:共指消解------把"他/她/它"和真正指代的对象连上线。
④ 生成问题(Generation)
根据输入生成自然语言文本。
-
机器翻译(MT, Machine Translation):把一种语言翻译成另一种语言。

图 3-9:机器翻译------把一种语言"变"成另一种语言。
-
文本摘要:把长文章压缩成短摘要。
-
问答系统(QA, Question Answering):根据问题生成或抽取答案。

图 3-10:问答系统------用户提问,机器从文本中"捞出"答案。
-
对话系统(Dialogue System):多轮对话,像智能客服、ChatGPT。

图 3-11:对话系统------人和机器多轮"聊天",像智能客服一样。
-
图像描述生成:根据图片生成文字说明。
⑤ 回归问题(Regression)
输出是一个连续数值,而不是离散类别。
-
作文打分:预测作文得分。
-
刑期/罚款预测:根据案情描述预测判决结果。
-
股价预测:根据财经新闻预测股价走势(虽然很难)。
1.3.3 层次 × 任务 二维表
把"层级"和"任务类别"交叉起来,就得到了教材和 PPT 中反复强调的"层次 × 任务"二维表:

图 4:同一任务在不同层级上有不同表现;同一层级也可做多种任务。
| 层级 | 分类 | 匹配 | 解析 | 生成 | 回归 |
|---|---|---|---|---|---|
| 字词级 | 词性标注、NER | 词语相似度 | 分词、词性标注 | 文本纠错 | --- |
| 句子级 | 情感分析 | 句子相似度 | 句法分析、SRL | 机器翻译、摘要 | 句子打分 |
| 篇章级 | 文档分类 | 文档相似度 | 篇章结构分析 | 多文档摘要 | --- |
💡 这个二维表的意义:它告诉我们 NLP 任务不是杂乱无章的,而是可以从"处理粒度"和"任务目标"两个维度系统梳理。
1.3.4 研究对象与层次
从研究对象看,NLP 又分为几个层次:
| 层次 | 研究内容 | 关键词 |
|---|---|---|
| 形式(Form) | 文本的字面形态 | 字符、词、句法结构 |
| 意义(Meaning) | 文本表达的意思 | 语义、逻辑、知识 |
| 语境/语用(Context/Pragmatics) | 谁在什么场景下说的 | 指代消解、对话状态、背景知识 |

图 5:NLP 研究对象------从语音文字形式,到语义,再到语用语境。
🌰 生活化类比:
形式层:听到一句话"你吃了吗?"------先识别出这几个字。
语义层:理解字面意思是询问是否吃饭。
语用层:知道在中国这可能是打招呼,不一定真问你吃没吃。
1.3.5 语言学知识库与语料库
NLP 的发展离不开两类基础资源:
① 语言学知识库
包括词典、规则库等。词典不仅提供词语的读音、词性、语义解释,还提供词语之间的关系信息,如:
-
上下位关系:狗 → 哺乳动物 → 动物
-
同义反义关系:高兴 ↔ 快乐,高 ↔ 低
② 语料库资源
指面向某一 NLP 任务所标注的数据集。例如:
-
分词语料库(标注了词边界)
-
情感分析语料库(标注了情感标签)
-
命名实体识别语料库(标注了实体类型)
💡 关系:知识库是"人工整理的语言知识",语料库是"真实文本+人工标注"。统计方法和深度学习方法都需要大量语料库来训练模型。
1.3.6 动手实验:搭建一条完整的 NLP 流水线
下面这个实验把分词、词性标注、命名实体识别、情感分析、文本分类串起来,让你体验 NLP 的"全流程"。
python
"""
实验 1.3:NLP 任务流水线体验
目标:一次性体验分词、NER、情感分析、文本分类
依赖:jieba, snownlp, sklearn, matplotlib
安装:pip install jieba snownlp scikit-learn matplotlib
"""
import jieba
import jieba.posseg as pseg
from snownlp import SnowNLP
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
import matplotlib.pyplot as plt
import numpy as np
# Mac 中文字体配置
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'Arial Unicode MS'
plt.rcParams['axes.facecolor'] = 'white'
# 提前加载一些常用词,提升分词和词性标注效果
jieba.add_word("字节跳动", tag='nt')
jieba.add_word("Mate60", tag='n')
jieba.add_word("续航", tag='n')
jieba.add_word("拍照", tag='v')
def pipeline_demo(text):
print(f"\n📝 原始文本:{text}")
print("-" * 50)
# 1. 分词
words = jieba.lcut(text)
print("1️⃣ 分词:", " / ".join(words))
# 2. 词性标注
pos_tags = [(w.word, w.flag) for w in pseg.lcut(text)]
print("2️⃣ 词性标注:", pos_tags)
# 3. 命名实体识别(简化版:用规则识别人名、地名、机构名)
entities = []
for w, flag in pos_tags:
if flag in {'nr', 'ns', 'nt'}: # nr=人名, ns=地名, nt=机构名
entities.append((w, flag))
print("3️⃣ 命名实体识别:", entities if entities else "未识别出常见实体")
# 4. 情感分析
s = SnowNLP(text)
sentiment = s.sentiments
label = "正面" if sentiment > 0.6 else "负面" if sentiment < 0.4 else "中性"
print(f"4️⃣ 情感分析:{label}(置信度:{sentiment:.3f})")
return words, sentiment
# 测试两条评论
sample_texts = [
"华为 Mate60 太牛了,拍照清晰,续航也很顶!",
"这款手机发热严重,玩游戏卡得要命,后悔买了。",
]
sentiments = []
for t in sample_texts:
_, sent = pipeline_demo(t)
sentiments.append(sent)
# 5. 文本分类:用 TF-IDF + 朴素贝叶斯做一个情感分类器
# 训练集扩大一点,覆盖更多常用词
train_texts = [
# 正面样本
"这部电影真好看,演员演技在线",
"手机速度很快,体验非常棒",
"风景优美,适合拍照打卡",
"这家餐厅环境优雅,菜品精致",
"外卖准时送达,味道很好",
"客服态度很好,问题解决了",
"酒店干净整洁,住得很舒服",
"这本书内容丰富,推荐购买",
# 负面样本
"剧情拖沓,浪费了我两个小时",
"服务态度差,再也不来了",
"排队太久,体验很差",
"手机发热严重,玩游戏卡顿",
"外卖送了一个小时,饭都凉了",
"房间又脏又小,非常失望",
"这本书错别字太多,质量差",
"客服不理人,售后太糟糕",
]
train_labels = [1] * 8 + [0] * 8 # 1=正面, 0=负面
# 用 jieba 分词后再拼接成空格分隔的字符串
def tokenize(text):
return " ".join(jieba.lcut(text))
train_tokens = [tokenize(t) for t in train_texts]
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(train_tokens)
clf = MultinomialNB()
clf.fit(X_train, train_labels)
test_texts = ["这家新开的咖啡店环境优雅,蛋糕也很精致", "快递延迟了三天,包装还破损了"]
test_tokens = [tokenize(t) for t in test_texts]
X_test = vectorizer.transform(test_tokens)
preds = clf.predict(X_test)
print("\n" + "=" * 50)
print("🤖 文本分类结果:")
for t, p in zip(test_texts, preds):
print(f" {t} → {'正面' if p == 1 else '负面'}")
# 可视化情感分数
fig, ax = plt.subplots(figsize=(8, 5))
colors = ['#2ED573' if s > 0.5 else '#FF4757' for s in sentiments]
bars = ax.barh(range(len(sample_texts)), sentiments, color=colors, alpha=0.8)
ax.set_yticks(range(len(sample_texts)))
ax.set_yticklabels(sample_texts, fontsize=10)
ax.set_xlim(0, 1)
ax.set_xlabel('正面情感得分', fontsize=12)
ax.set_title('两条评论的情感分析对比', fontsize=14)
ax.axvline(x=0.5, color='gray', linestyle='--', linewidth=1)
for bar, s in zip(bars, sentiments):
ax.text(s + 0.02, bar.get_y() + bar.get_height()/2,
f'{s:.3f}', va='center', fontsize=10)
plt.tight_layout()
plt.show()
运行结果截图:
终端输出:

情感分析对比图:

运行效果:
这段代码会输出分词、词性、实体、情感分析结果,并弹出一个情感对比图。你可以看到:正面评论得分接近 1,负面评论得分接近 0,中间有一条 0.5 的分界线。
1.4 自然语言处理技术发展历史
NLP 的发展不是一蹴而就的。教材和 PPT 从"范式"和"表示方法"两个角度,把这段历史梳理得非常清晰。
1.4.1 两大范式:理性主义与经验主义
NLP 的发展经历了两次范式变迁:
| 范式 | 核心思想 | 代表人物/方法 | 优点 | 缺点 |
|---|---|---|---|---|
| 理性主义(Rationalism) | 专家总结符号逻辑规则 | 规则库、知识库、语法规则 | 可解释、可干预 | 规则难以覆盖所有现象,维护成本高 |
| 经验主义(Empiricism) | 从数据中自动学习规律 | 统计模型、机器学习、深度学习 | 可扩展、能处理大规模数据 | 需要大量数据和计算资源 |
🌰 类比:理性主义像"请老中医开药方",靠经验规则;经验主义像"用大数据训练 AI 诊断",靠统计规律。

图 6:理性主义 vs 经验主义------规则派与数据派两种研究范式。
1.4.2 表示方法的演进
NLP 的核心问题之一是:如何在计算机内部表示语义? 根据表示方法的不同,NLP 经历了四次关键演进:

图 7:从符号到向量,从离散到连续,从静态到上下文相关。
| 阶段 | 表示方法 | 方法/思想 | 代表技术 | 核心特点 |
|---|---|---|---|---|
| 符号表示 | 字符串、规则符号 | 专家规则 | 规则库、知识库 | 可解释,难维护 |
| 离散向量表示 | 高维、稀疏的 one-hot 向量 | 统计学习 | HMM、CRF、SVM | 可计算,但无法处理同义词 |
| 连续嵌入表示 | 低维、稠密的词嵌入向量 | 表示学习 | Word2Vec、GloVe | 语义相近的词向量也相近 |
| 上下文相关向量 | 预训练语言模型生成的动态向量 | 预训练 + 精调 | BERT、GPT、LLM | 同一词在不同上下文向量不同 |
💡 关键洞察:表示方法的演进,本质上是在回答"如何让机器更好地理解词与词之间的关系"。
1.4.3 四个发展阶段
结合时间线,NLP 大致经历了四个阶段:
| 阶段 | 时间 | 核心思想 | 代表技术 | 特点 |
|---|---|---|---|---|
| 规则时代 | 1950s--1990s | 专家写规则 | 正则表达式、语法规则、知识库 | 可解释强,但规则难以覆盖所有语言现象 |
| 统计时代 | 1990s--2010s | 从数据中学习概率 | HMM、CRF、SVM、n-gram 语言模型 | 需要大量标注数据,效果比纯规则好 |
| 神经网络时代 | 2010s--2017 | 用深度网络自动学特征 | RNN、LSTM、CNN、Word2Vec、Seq2Seq | 自动提取特征,上下文建模能力增强 |
| 大模型时代 | 2017--至今 | 预训练 + 微调 / 提示 | Transformer、BERT、GPT、LLaMA、ChatGLM | 通用性强,涌现能力强,但计算资源消耗大 |
1.4.4 预训练 + 精调:新范式
2018 年以后,NLP 进入了"预训练 + 精调"的新范式:
- 预训练(Pre-training):在大规模无标注文本上训练一个通用语言模型,让它学会语言的基本规律。
- 精调(Fine-tuning):在特定下游任务的小规模标注数据上继续训练,让模型适配具体任务。
🌰 类比:先让模型读遍互联网"上学"(预训练),再针对具体工作"实习"(精调)。

图 8:预训练 + 精调------先"上学"读遍互联网,再"实习"适配具体任务。
1.4.5 大模型时代:ChatGPT、提示工程与指令微调
2022 年 11 月 30 日,OpenAI 推出 ChatGPT,标志着大语言模型真正走进大众视野。ChatGPT 背后的关键技术包括:
-
大语言模型(LLM, Large Language Model):参数量巨大(数十亿到数千亿),在海量文本上预训练。
-
提示工程(Prompt Engineering):通过设计输入提示,引导模型生成期望的输出。
-
指令微调(Instruction Tuning):用人类指令数据对模型进行微调,让模型更好地遵循用户意图。
-
RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习):通过人类评分进一步优化模型回答质量。
💡 大模型之所以强大,是因为文本自身的顺序性就是天然标注数据:预测下一个词本身就是一个自监督任务,无需人工标注,因此可以利用几乎无限的互联网文本。

图 9:提示工程------通过设计输入提示,引导大模型生成期望输出。
1.4.6 从"专一工匠"到"通才学生"
🌰 类比:
规则时代:像请了一位老教授,他手写了一大堆语法书,遇到没写过的句子就懵了。
统计时代:像请了一位统计师,他读了大量语料,靠概率猜测最可能的意思。
神经网络时代:像请了一位实习生,他自动从数据里总结规律,但还需要大量训练。
大模型时代:像请了一位博览群书的通才,先读遍互联网,再针对你的任务稍微点拨一下就会了。
1.4.7 动手实验:可视化 NLP 发展历程
下面的代码用 matplotlib 画出一条 NLP 发展时间线,并用不同颜色标注每个阶段。
python
"""
实验 1.4:NLP 发展时间线可视化
目标:直观了解 NLP 从规则时代到大模型时代的演进
依赖:matplotlib(pip install matplotlib)
"""
import matplotlib.pyplot as plt
import numpy as np
# Mac 中文字体配置
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'Arial Unicode MS'
plt.rcParams['axes.facecolor'] = 'white'
# 定义阶段数据
stages = [
{"name": "规则时代", "start": 1950, "end": 1990, "color": "#74B9FF",
"keywords": "正则 / 知识库 / 专家规则"},
{"name": "统计时代", "start": 1990, "end": 2010, "color": "#55EFC4",
"keywords": "HMM / CRF / SVM / n-gram"},
{"name": "神经网络时代", "start": 2010, "end": 2017, "color": "#FDCB6E",
"keywords": "RNN / LSTM\nWord2Vec / Seq2Seq"},
{"name": "大模型时代", "start": 2017, "end": 2026, "color": "#FF7675",
"keywords": "Transformer\nBERT / GPT / LLM"},
]
milestones = [
(1950, "图灵测试提出"),
(1954, "首个机器翻译系统"),
(1990, "统计 NLP 兴起"),
(2013, "Word2Vec"),
(2017, "Transformer 架构"),
(2018, "BERT / GPT"),
(2022, "ChatGPT 发布"),
]
# 为每个里程碑设置不同高度,避免文字重叠
year_offsets = {
1950: 0.80,
1954: 0.55,
1990: 0.80,
2013: 1.00,
2017: 0.60,
2018: 0.95,
2022: 0.55,
}
fig, ax = plt.subplots(figsize=(13, 7))
# 画阶段条
for i, stage in enumerate(stages):
ax.barh(0, stage["end"] - stage["start"], left=stage["start"],
height=0.6, color=stage["color"], alpha=0.85,
edgecolor='white', linewidth=2)
mid = (stage["start"] + stage["end"]) / 2
ax.text(mid, 0, stage["name"], ha='center', va='center',
fontsize=12, fontweight='bold', color='#2D3436')
ax.text(mid, -0.50, stage["keywords"], ha='center', va='top',
fontsize=9, color='#636E72')
# 画里程碑
for year, event in milestones:
y_offset = year_offsets.get(year, 0.75)
ax.plot(year, 0.32, 'o', color='#2D3436', markersize=8)
ax.annotate(f"{year}\n{event}", xy=(year, 0.32),
xytext=(year, y_offset),
ha='center', fontsize=9,
arrowprops=dict(arrowstyle='->', color='#B2BEC3', lw=1))
ax.set_xlim(1945, 2028)
ax.set_ylim(-0.8, 1.25)
ax.axhline(y=0, color='#B2BEC3', linewidth=1, linestyle='-')
ax.set_xlabel('年份', fontsize=12)
ax.set_title('自然语言处理技术发展时间线', fontsize=15, pad=20)
ax.set_yticks([])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
plt.tight_layout()
plt.show()
运行结果截图:

效果说明:
运行后会看到一条彩色时间轴,蓝色代表规则时代,绿色代表统计时代,黄色代表神经网络时代,红色代表大模型时代。每个阶段的上方标注了里程碑事件,让你一眼看清 NLP 七十多年的演进脉络。
本章小结与动手练习
核心概念速记卡
| 概念 | 一句话理解 |
|---|---|
| NLP | 让机器理解、生成人类语言的技术 |
| NLU | 机器"听懂"人话 |
| NLG | 机器"说"人话 |
| CL | 计算语言学,计算机科学与语言学的交叉学科 |
| LLM | 大语言模型,能处理多种语言任务的通用模型 |
| 歧义 | 同一句话或词有多种理解方式 |
| 任务层级 | 字词级 → 句子级 → 篇章级 |
| 任务类别 | 回归、分类、匹配、解析、生成 |
| 研究层次 | 形式 → 语义 → 语用 |
| 两大范式 | 理性主义(规则) vs 经验主义(数据驱动) |
| 表示演进 | 符号 → 离散向量 → 词嵌入 → 上下文相关向量 |
| 新范式 | 预训练 + 精调 |
| 关键技术 | 提示工程、指令微调、RLHF |
推荐练习
- 把本章代码全部跑一遍,把
sample_texts换成你自己的朋友圈/评论,观察分词和情感分析结果。 - 尝试给 jieba 添加自定义词典(比如你学校的名字、专业术语),看看实体识别效果是否提升。
- 用本章的文本分类代码,收集 20 条你感兴趣的评论(电影/商品/餐厅),训练一个你自己的情感分类器。
写在最后
NLP 听起来高大上,其实就在你身边:
-
你每天用的输入法联想,是 NLP;
-
你问 Siri / 小爱 / 天猫精灵"今天天气怎样",是 NLP;
-
你看到的垃圾邮件过滤、文章推荐、智能客服,还是 NLP。
它并不遥远,它正在让机器一点点学会"说人话"。而我们这一章学的,就是理解这门技术的"地图"。🗺️
📌 版权声明 :本笔记为个人学习整理,内容参考电子工业出版社《自然语言处理:基于大语言模型的方法》第一章,仅供学习交流使用。
💬 欢迎交流:如果你也在读这本书,欢迎在评论区留言讨论~