欢迎光临
我们一直在努力

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


img

目录

  • 1.1 自然语言处理的概念

  • 1.2 自然语言处理的难点

  • 1.3 自然语言处理任务体系

    • 1.3.1 任务层级

    • 1.3.2 任务类别

    • 1.3.3 层次 × 任务 二维表

    • 1.3.4 研究对象与层次

    • 1.3.5 语言学知识库与语料库

  • 1.4 自然语言处理技术发展历史

    • 1.4.1 两大范式:理性主义与经验主义

    • 1.4.2 表示方法的演进

    • 1.4.3 四个发展阶段

    • 1.4.4 预训练 + 精调:新范式

    • 1.4.5 大模型时代:ChatGPT、提示工程与指令微调

  • 本章小结与动手练习


1.1 自然语言处理的概念

1.1.1 一句话解释:让机器“听懂人话”

想象一下,你对着手机说:“帮我查一下明天去北京的高铁。”

手机没有长耳朵,但它要把你的一串声音变成文字,再理解“明天”“北京”“高铁”这些词,最后调用订票 App。这一整套“人话 → 机器能懂的信息 → 机器动作”的过程,就是 NLP(Natural Language Processing,自然语言处理) 在做的事。

再打个比方:

NLP 就像一位“人机翻译官”。人类说的是充满省略、歧义、情绪的“自然语言”,机器只认识 0 和 1。NLP 的任务,就是在这两种“语言”之间搭一座桥。

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 代码。运行后,你会看到一句话被切分成一个个“词块”,这就是机器理解中文的第一步。

    """
    实验 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.1 运行结果

    🤔 想一想:为什么中文需要分词?因为中文不像英文那样有空格隔开。机器看到的“我去北京”是一个连续字符串,必须先切开才知道“北京”是一个地名。


    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 进化性:语言是“活的”

    任何一种“活着”的语言都在不断发展变化。新词层出不穷,旧词也被赋予新含义:

    • 新词:超女、非典、新冠、内卷、躺平

    • 旧词新义:腐败(原指食物变质 → 也指贪污)、杯具(谐音“悲剧”)

    机器学的是“过去的语料”,但人类每天都在创造新说法。

    进化性卡通图:时间轴上冒出“内卷”“躺平”“YYDS”等新词,老词典一脸问号

    图 2-4:进化性——语言不断产生新词和新义,老词典跟不上节奏。

    1.2.5 非规范性:网络文本的“放飞自我”

    互联网上,尤其是用户产生的内容里,经常出现非规范文本:

    • 音近词:“为什么” → “为森么”

    • 简写变形:please → pls,cool → coooooooool

    • 新造词:喜大普奔、不明觉厉

    • 错别字:各种手误

    这些对机器来说都是“噪声”。

    非规范性卡通图:手机聊天框里飞出“为森么”“plz”“cooooool”“喜大普奔”“不明觉厉”,小机器人满头问号

    图 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 用户可直接运行,中文显示已配置好。

    """
    实验 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()

    运行结果截图:

    实验 1.2 “苹果”歧义可视化结果

    效果说明:

    运行后会出现一张柱状对比图。你会清楚看到:同样两个字“苹果”,在不同句子里“水果含义”和“品牌含义”的概率此消彼长。这就是 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 任务分为五大类,形成一个更完整的任务谱系:

    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 中反复强调的“层次 × 任务”二维表:

    NLP 层次×任务二维表卡通图:字词级/句子级/篇章级与回归/分类/匹配/解析/生成交叉组合

    图 4:同一任务在不同层级上有不同表现;同一层级也可做多种任务。

    层级分类匹配解析生成回归
    字词级 词性标注、NER 词语相似度 分词、词性标注 文本纠错
    句子级 情感分析 句子相似度 句法分析、SRL 机器翻译、摘要 句子打分
    篇章级 文档分类 文档相似度 篇章结构分析 多文档摘要

    💡 这个二维表的意义:它告诉我们 NLP 任务不是杂乱无章的,而是可以从“处理粒度”和“任务目标”两个维度系统梳理。

    1.3.4 研究对象与层次

    从研究对象看,NLP 又分为几个层次:

    层次研究内容关键词
    形式(Form) 文本的字面形态 字符、词、句法结构
    意义(Meaning) 文本表达的意思 语义、逻辑、知识
    语境/语用(Context/Pragmatics) 谁在什么场景下说的 指代消解、对话状态、背景知识

    NLP 研究对象层次卡通图:从文字形式到语义理解,再到真实语境的三层阶梯

    图 5:NLP 研究对象——从语音文字形式,到语义,再到语用语境。

    🌰 生活化类比:

    • 形式层:听到一句话“你吃了吗?”——先识别出这几个字。

    • 语义层:理解字面意思是询问是否吃饭。

    • 语用层:知道在中国这可能是打招呼,不一定真问你吃没吃。

    1.3.5 语言学知识库与语料库

    NLP 的发展离不开两类基础资源:

    ① 语言学知识库

    包括词典、规则库等。词典不仅提供词语的读音、词性、语义解释,还提供词语之间的关系信息,如:

    • 上下位关系:狗 → 哺乳动物 → 动物

    • 同义反义关系:高兴 ↔ 快乐,高 ↔ 低

    ② 语料库资源

    指面向某一 NLP 任务所标注的数据集。例如:

    • 分词语料库(标注了词边界)

    • 情感分析语料库(标注了情感标签)

    • 命名实体识别语料库(标注了实体类型)

    💡 关系:知识库是“人工整理的语言知识”,语料库是“真实文本+人工标注”。统计方法和深度学习方法都需要大量语料库来训练模型。

    1.3.6 动手实验:搭建一条完整的 NLP 流水线

    下面这个实验把分词、词性标注、命名实体识别、情感分析、文本分类串起来,让你体验 NLP 的“全流程”。

    """
    实验 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.3 终端输出

    情感分析对比图:

    实验 1.3 情感分析对比图

    运行效果:

    这段代码会输出分词、词性、实体、情感分析结果,并弹出一个情感对比图。你可以看到:正面评论得分接近 1,负面评论得分接近 0,中间有一条 0.5 的分界线。


    1.4 自然语言处理技术发展历史

    NLP 的发展不是一蹴而就的。教材和 PPT 从“范式”和“表示方法”两个角度,把这段历史梳理得非常清晰。

    1.4.1 两大范式:理性主义与经验主义

    NLP 的发展经历了两次范式变迁:

    范式核心思想代表人物/方法优点缺点
    理性主义(Rationalism) 专家总结符号逻辑规则 规则库、知识库、语法规则 可解释、可干预 规则难以覆盖所有现象,维护成本高
    经验主义(Empiricism) 从数据中自动学习规律 统计模型、机器学习、深度学习 可扩展、能处理大规模数据 需要大量数据和计算资源

    🌰 类比:理性主义像“请老中医开药方”,靠经验规则;经验主义像“用大数据训练 AI 诊断”,靠统计规律。

    理性主义与经验主义卡通图:老中医手写规则书 vs 大数据自动学习

    图 6:理性主义 vs 经验主义——规则派与数据派两种研究范式。

    1.4.2 表示方法的演进

    NLP 的核心问题之一是:如何在计算机内部表示语义? 根据表示方法的不同,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 发展时间线,并用不同颜色标注每个阶段。

    """
    实验 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()

    运行结果截图:

    实验 1.4 NLP 发展时间线

    效果说明:

    运行后会看到一条彩色时间轴,蓝色代表规则时代,绿色代表统计时代,黄色代表神经网络时代,红色代表大模型时代。每个阶段的上方标注了里程碑事件,让你一眼看清 NLP 七十多年的演进脉络。


    本章小结与动手练习

    核心概念速记卡

    概念一句话理解
    NLP 让机器理解、生成人类语言的技术
    NLU 机器“听懂”人话
    NLG 机器“说”人话
    CL 计算语言学,计算机科学与语言学的交叉学科
    LLM 大语言模型,能处理多种语言任务的通用模型
    歧义 同一句话或词有多种理解方式
    任务层级 字词级 → 句子级 → 篇章级
    任务类别 回归、分类、匹配、解析、生成
    研究层次 形式 → 语义 → 语用
    两大范式 理性主义(规则) vs 经验主义(数据驱动)
    表示演进 符号 → 离散向量 → 词嵌入 → 上下文相关向量
    新范式 预训练 + 精调
    关键技术 提示工程、指令微调、RLHF

    推荐练习

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

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

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

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

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

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


    📌 版权声明:本笔记为个人学习整理,内容参考电子工业出版社《自然语言处理:基于大语言模型的方法》第一章,仅供学习交流使用。 💬 欢迎交流:如果你也在读这本书,欢迎在评论区留言讨论~

    赞(0)
    未经允许不得转载:171主机测评 » 《自然语言处理:基于大语言模型的方法》第1章 绪论 读书笔记
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址