《自然语言处理:基于大语言模型的方法》第1章 绪论 读书笔记


目录

  • [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 系统可能要完成:

  1. 分词:这家 / 火锅店 / 排队 / 两 / 小时 / 但 / 真的 / 值
  2. 情感分析:整体是"正面"评价
  3. 实体识别:【火锅店】是商家,【两小时】是时间
  4. 信息抽取:可以提炼成"推荐某火锅店"

你看,一条随手发的动态,背后其实藏了一整套 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. 字词级:先认字、认词,知道"北京"是地名,"吃"是动词。
  2. 句子级:分析一句话的结构和情感,比如"这家店不错"是正面评价。
  3. 篇章级:把整篇文章读完,能回答"这篇文章主要讲了什么?"

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 进入了"预训练 + 精调"的新范式:

  1. 预训练(Pre-training):在大规模无标注文本上训练一个通用语言模型,让它学会语言的基本规律。
  2. 精调(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

推荐练习

  1. 把本章代码全部跑一遍,把 sample_texts 换成你自己的朋友圈/评论,观察分词和情感分析结果。
  2. 尝试给 jieba 添加自定义词典(比如你学校的名字、专业术语),看看实体识别效果是否提升。
  3. 用本章的文本分类代码,收集 20 条你感兴趣的评论(电影/商品/餐厅),训练一个你自己的情感分类器。

写在最后

NLP 听起来高大上,其实就在你身边:

  • 你每天用的输入法联想,是 NLP;

  • 你问 Siri / 小爱 / 天猫精灵"今天天气怎样",是 NLP;

  • 你看到的垃圾邮件过滤、文章推荐、智能客服,还是 NLP。

它并不遥远,它正在让机器一点点学会"说人话"。而我们这一章学的,就是理解这门技术的"地图"。🗺️


📌 版权声明 :本笔记为个人学习整理,内容参考电子工业出版社《自然语言处理:基于大语言模型的方法》第一章,仅供学习交流使用。

💬 欢迎交流:如果你也在读这本书,欢迎在评论区留言讨论~

相关推荐
我是大AI14 分钟前
实战解析:基于多源交叉验证的AI幻觉治理架构与GEO行业解决方
人工智能·架构
LTD营销SaaS17 分钟前
22站点智能成功申请“AI 创建业务型网站”发明专利
人工智能·ai建站·站点智能·22集团·ai创建业务型网站
EQUINOX120 分钟前
【论文精读】| LLaVA
论文阅读·人工智能·深度学习
2601_9578793320 分钟前
电商在用什么 AI 视频创作工具?2026年从“做视频”到“做素材库”的工具变化
大数据·人工智能
yangdaxiageo21 分钟前
AI搜索广告的商业化底座:GEO技术架构的三层模型详解
人工智能·架构
QZSJTR36 分钟前
2026年AI搜索引擎技术原理与GEO优化实战:从RAG到AI Agent
人工智能·搜索引擎·chatgpt
小白羊丨41 分钟前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
水獭比特1 小时前
Vercel AI SDK Files V4:把文件交付做成可验收闭环
人工智能
东方小月1 小时前
一篇文章带你深入拆解Skill的本质与工程实现,让你不再滥用Skill
前端·人工智能·后端