自然语言处理(NLP)概念

适用读者:零基础初学者。本文假设你没有任何NLP或机器学习背景,所有概念都会从最基础开始解释。

学习目标:理解NLP是什么、为什么需要它、它能做什么、以及它是如何一步步发展到今天的。

预计阅读时间:45-60分钟(包含思考题练习时间)


目录

  1. 前置知识:计算机如何"看"文字
  2. 一、NLP核心思想——让机器读懂人类语言
  3. 二、NLP发展历史——从幻想走向现实
  4. 三、NLP研究任务的完整分类体系
  5. 四、关键定理与公式详解
  6. 五、NLP的八大应用场景
  7. 六、NLP的优缺点深度剖析
  8. 七、NLP技术演进全景图
  9. 八、API调用实战示例
  10. 九、补充提升内容
  11. 十、本章总结与自测题

前置知识:计算机如何"看"文字

在深入学习NLP之前,我们需要先回答一个看似简单的问题:计算机真的能"理解"文字吗?

一个思维实验

假设你收到两条微信消息:

消息A:“我明天去北京。”

消息B:“Beijing go I tomorrow to.”

对于人来说,消息A一眼就能看懂,消息B虽然单词都认识但顺序混乱,需要费力猜测含义。但对于计算机来说,这两条消息没有任何区别——它们都只是一串字符(characters),计算机根本不"知道"每个词是什么意思。

计算机的"母语"是数字

计算机的CPU只能做一件事:对数字进行运算(加法、乘法、比较等)。它不认识中文汉字,不认识英文单词,只认识0和1组成的二进制数字。

因此,NLP要解决的第一个核心问题就是:如何把文字转换成数字,同时不丢失文字中蕴含的含义?

这就像你想让一个只会算数的朋友帮你整理书架,你得先把每本书的名字翻译成编号(比如《红楼梦》= 001,《三体》= 002),你朋友才能帮你排序。NLP的第一步,就是找到这种"把文字变成数字"的翻译方法。

文字的"含义"从何而来?

思考一个问题:"苹果"这个词的含义是什么?

  • 如果你脑海中浮现的是一种红色的水果,那"苹果"的含义来自你的生活经验
  • 如果你看过"一天一苹果,医生远离我"这句话,"苹果"的含义还来自它出现的上下文
  • 如果你看到"苹果发布了新iPhone",你就知道这里的"苹果"是一家公司

这说明:一个词的含义,取决于它周围出现了什么词(这是NLP最重要的思想之一,后文会反复出现)。

本节要点

概念 说明
计算机的语言 只有数字(0和1)
NLP的首要挑战 将文字转换为数字,同时保留语义
语义的来源 上下文(一个词周围的词决定了它的含义)

自检问题:为什么计算机不能直接"阅读"一段文字来理解它的意思?用你自己的话解释一下。


NLP核心思想——让机器读懂人类语言

什么是自然语言?

"自然语言"是相对于"编程语言"而言的。

维度 自然语言(如中文、英文) 编程语言(如Python、C++)
创造者 人类文明自然演化 人为设计
规则 模糊、有例外 严格、无歧义
表达方式 灵活多变,同一意思多种说法 精确唯一,每种语法只有一种含义
歧义性 极高("咬死了猎人的狗"谁死了?) 无歧义
容错性 高("我吃饭明天"能懂) 低(少一个分号就报错)

通俗比喻:编程语言像乐高积木的说明书——每一步都是确定的、不容置疑的;自然语言像朋友间聊天——充满暗示、省略、玩笑和言外之意。

NLP的完整定义

自然语言处理(Natural Language Processing,NLP)是人工智能的重要分支,旨在让计算机能够理解、解释和生成人类语言。NLP连接了计算机科学与语言学,使机器能够以有意义的方式处理人类语言数据。

让我们逐词拆解这个定义:

  • 自然语言:人类日常使用的语言,区别于编程语言
  • 处理:不只是"读",还包括分析、转换、生成等操作
  • 理解:不是简单的关键词匹配,而是真正把握含义(比如理解"我快饿死了"不是真的快死了)
  • 生成:不是从模板中拼凑,而是创造出从未有过的、自然流畅的句子

NLP的两大子领域:NLU与NLG

NLP可以被划分为两个互补的领域:

NLU(自然语言理解)——“读懂”

NLU让机器从文本中提取出结构化信息。这就像你读一篇文章后,能回答"谁、在哪儿、什么时候、做了什么"这些问题。

生活类比:NLU就像一个专业的阅读理解者。给他一篇新闻报道,他能帮你列出:事件是什么、涉及哪些人、发生在哪里、起因和结果是什么。

典型NLU任务

  • 情感分析:判断一段评价是好评还是差评
  • 命名实体识别:从"乔布斯于1976年在加州创立了苹果公司"中识别出人名、时间、地点、机构
  • 意图识别:判断用户说"我想订一张去上海的机票"的意图是"订机票"
NLG(自然语言生成)——“会写”

NLG让机器能写出人类读得懂的文本。这就像你脑子里有个想法,然后用语言表达出来。

生活类比:NLG就像一个能写的秘书。给他一组数据(比如今天的天气参数:温度25°C、湿度60%、风速3级),他能帮你生成一段天气播报:“今天天气晴好,气温25摄氏度,湿度适中,微风,非常适合户外活动。”

典型NLG任务

  • 文本摘要:把一篇5000字的文章压缩成200字的摘要
  • 机器翻译:把中文翻译成英文
  • 对话生成:像ChatGPT那样与用户对话
NLU与NLG的关系
                    ┌─────────────┐
    文字/语音  ───> │    NLU      │ ───> 结构化信息(意图、实体、情感等)
                    │  (理解)    │
                    └─────────────┘
                           │
                           ▼  (在更复杂的系统中,理解的结果驱动生成)
                    ┌─────────────┐
                    │    NLG      │ ───> 自然语言文本
                    │  (生成)    │
                    └─────────────┘

通俗比喻:NLU是"听明白对方在说什么",NLG是"想好自己要说什么"。一个好的聊天机器人需要两者兼备。

如何判断一个任务是NLU还是NLG?

一个简单的判断方法:

如果你… 那么这属于…
输入文本,输出标签/分类/提取信息 NLU(理解任务)
输入数据/指令,输出自然语言文本 NLG(生成任务)
输入文本,输出文本(如翻译) 两者结合

NLP为什么这么难?

初学者常常低估NLP的难度。以下是用一句话体现出的NLP挑战:

语言现象 例句 难点
歧义 “他吃食堂” 不是吃食堂这个建筑,而是在食堂吃饭
指代 “小明打了小王,他哭了” "他"指小明还是小王?
隐含含义 “你作业写完了吗?”(妈妈问) 这句话的意图不是询问,是催促
文化背景 “这波操作很诸葛亮” 需要知道诸葛亮的典故才能理解
新词/网络语 “YYDS”、“绝绝子” 词汇不断涌现,词典永远跟不上
语气/反讽 “你可真聪明啊!”(用于对方犯错时) 字面意思与实际含义相反

自检问题

  1. 用自己的话解释NLU和NLG的区别,并举出各自的一个生活例子。
  2. 为什么说"NLU比NLG更难"这个说法不完全正确?(提示:思考两者的挑战分别在哪里)

NLP发展历史——从幻想走向现实

为什么要了解发展史?

了解NLP的发展历史,就像学习物理要了解从亚里士多德到牛顿再到爱因斯坦的演进——你能明白:

  • 为什么今天的NLP是这个样子?
  • 每个技术解决了什么前辈的局限?
  • 当前技术的边界在哪里?

NLP的发展不是线性的,而是经历了多次"范式革命"。每一次革命都因为一种旧方法遇到了无法跨越的瓶颈,从而催生了新方法。

发展里程碑详解

1950年:图灵测试——NLP的哲学起点

阿兰·图灵(Alan Turing)发表了划时代论文《Computing Machinery and Intelligence》,提出了著名问题:“机器能思考吗?”

为了避免对"思考"定义的纠缠,图灵提出了一个可操作的判断标准——图灵测试

如果一个人类裁判通过文字聊天与对方交流,无法区分对方是人还是机器,那么这个机器就可以被称为具有智能。

为什么这很重要? 图灵测试确立了NLP的终极目标:让机器生成和使用语言的能力达到人类的水平。直到今天,这仍然是我们追求的方向。

生活类比:图灵测试就像"文字版的无表情陌生人测试"——只看发言内容,不看外表,能分辨出谁是机器人吗?

2013年:Word2Vec——词向量时代的开端

Google发布了Word2Vec,这是一个将词语转化为数字向量的工具。

之前的问题:计算机如何表示词语?最简单的办法是给每个词一个编号(比如"国王"=1,“王后”=2,“男人”=3,“女人”=4),但这种方法无法表达词与词之间的关系。编号1和编号2之间的差距,与编号1和编号3之间的差距一样大,可实际上"国王"和"王后"的关系(性别差异),与"国王"和"男人"的关系(身份差异)是不同的。

Word2Vec的突破:它将每个词表示为一个向量(一串数字),这样:

vec ( 国王 ) − vec ( 男人 ) + vec ( 女人 ) ≈ vec ( 王后 ) \text{vec}(\text{国王}) - \text{vec}(\text{男人}) + \text{vec}(\text{女人}) \approx \text{vec}(\text{王后}) vec(国王)vec(男人)+vec(女人)vec(王后)

这意味什么? 词的含义不再是一个孤立的编号,而是在一个多维"语义空间"中的位置。意思相近的词在这个空间中靠得更近。

生活类比:以前的词表示就像给每个人一个学号(1001、1002…),Word2Vec就像用多个维度描述一个人(身高、体重、年龄、爱好、性格…),两个人在某些维度上越相似,就越可能是"同类人"。

2017年:Transformer——注意力机制的崛起

Google在研究机器翻译时发表了论文《Attention Is All You Need》,提出了Transformer架构。

之前的问题:在处理文本时,RNN/LSTM等模型必须按顺序一个词一个词地读(就像人逐字阅读)。这种方式有两个缺陷:

  1. 速度慢,无法并行处理
  2. 处理长文本时,开头的词可能被"遗忘"

Transformer的突破:Attention机制让模型可以同时关注句子中的所有词,并为每个词分配不同"注意力权重"。

例句:"那只趴在沙发上的猫很可爱"

传统RNN阅读方式(顺序):
那 → 只 → 趴 → 在 → 沙 → 发 → 上 → 的 → 猫 → 很 → 可 → 爱
(需要12步,前面的词容易忘)

Transformer阅读方式(并行+注意力):
所有词同时看,但根据关系强弱分配注意力:
"猫" ← 给"趴"、"沙发"、"可爱"更多关注
"沙发" ← 给"趴"、"猫"更多关注
(所有词同时处理,关键关系通过注意力权重体现)

为什么叫"注意力"? 这就像人的注意力机制——当你听一句话时,你并不是对每个词平均分配脑力,而是重点关注那些承载主要信息的词。

生活类比:Transformer的Attention机制就像在一幅画中找人——你的眼睛并不是从左到右、从上到下扫描每个像素,而是直接注意到画面中的人脸区域。Attention让模型直接"注意到"句子中重要的词。

2018年至今:预训练时代——NLP的ChatGPT革命

2018年,Google发布BERT,OpenAI发布GPT,标志着NLP进入了"预训练+微调"的新范式。

核心思想:与其为每个任务从头训练一个模型,不如先在海量文本上训练一个"通才"模型(预训练),然后针对具体任务做少量调整(微调)。

生活类比

  • 传统方法:每次有新任务,就请一个"新手"从头学起(费时费力)
  • 预训练+微调:先培养一个"大学毕业生"(通识教育),然后根据具体岗位做"入职培训"(专业训练)。这个"毕业生"已经具备了语言理解的基本能力——他知道"苹果"可以是水果也可以是公司,他知道"打"在不同语境下的不同含义,他知道一句话的主谓宾结构。

关键变化:模型规模的飞跃:

年份 模型 参数量 类比
2013 Word2Vec ~1亿 一本小册子
2018 BERT-base 1.1亿 一套百科全书
2019 GPT-2 15亿 一个小型图书馆
2020 GPT-3 1750亿 一个大型图书馆
2023 GPT-4 未公开 一座城市图书馆系统

历史演进表

时间 里程碑 核心事件 意义
1950年 图灵测试提出 图灵发表《Computing Machinery and Intelligence》 为NLP奠定哲学基础,确立"机器理解语言"的目标
1954年 首次机器翻译实验 Georgetown-IBM实验,翻译60句俄语到英语 证明了机器翻译的可行性
1966年 ELIZA诞生 MIT的Weizenbaum创建首个聊天机器人 展示了简单模式匹配也能产生"智能"错觉
1980s-1990s 统计NLP时代 机器学习方法开始应用于NLP 从手写规则转向数据驱动
2013年 Word2Vec发布 Google开源词向量工具 开启词向量时代,让语义计算成为可能
2014年 Seq2Seq + Attention 序列到序列模型用于机器翻译 大幅提升了翻译质量
2017年 Transformer架构 Google发表《Attention Is All You Need》 NLP范式转变,几乎所有SOTA模型都基于此
2018年 BERT、GPT发布 预训练模型涌现 NLP进入大规模预训练时代
2022年 ChatGPT发布 OpenAI发布基于GPT-3.5的对话模型 NLP走向大众应用,全球日活用户破亿
2023年 GPT-4、开源LLM爆发 多模态大模型、开源模型(LLaMA等) NLP能力大幅提升,生态百花齐放

自检问题

  1. 为什么说Transformer是NLP历史上最重要的架构革新?
  2. "预训练+微调"范式相比传统方法的核心优势是什么?

NLP研究任务的完整分类体系

NLP的任务就像一棵大树——有粗壮的树干(基础任务),也有繁茂的枝叶(应用任务)。理解这个分类体系,你就能对任何NLP任务快速定位它属于哪个分支。

按语言层次划分——从浅到深

语言学将语言分为多个层次,NLP任务也相应地分布在这些层次上:

              ┌──────────────────┐
              │   语用分析 (Pragmatics)   │ ← 最深:上下文、意图、隐含含义
              │   篇章分析 (Discourse)    │
              ├──────────────────┤
              │   语义分析 (Semantics)    │ │ 理解含义
              ├──────────────────┤
              │   句法分析 (Syntax)       │ │ 理解结构
              ├──────────────────┤
              │   词法分析 (Morphology)   │ │ 理解词汇
              └──────────────────┘
               浅 ←─────────────────→ 深
层次一:词法分析——理解词汇本身

词法分析关注的是单个词的识别和标注。

(1) 分词(Word Segmentation)

做什么:将连续的文本切分成有意义的词语单元。

为什么需要:中文没有天然的空格分隔,计算机需要知道哪里是词的边界。

输入:"我爱自然语言处理"
输出:["我", "爱", "自然语言", "处理"]

错误分词的影响:
如果分词错误 → "南京市长江大桥" 被切成 ["南京", "市长", "江大桥"] 
实际应该是 → ["南京市", "长江大桥"]

生活类比:分词就像给一段没有标点符号和空格的英文句子加空格。“iloveyou” → “i love you”(而不是"il oveyou")。

(2) 词性标注(Part-of-Speech Tagging, POS Tagging)

做什么:给每个词打上语法类别的标签(名词、动词、形容词等)。

输入:["我", "爱", "自然语言", "处理"]
输出:[我/代词, 爱/动词, 自然语言/名词, 处理/动名词]

为什么重要:词性帮助消除歧义。"领导"在"他是领导"中是名词,在"他领导团队"中是动词,词性决定了语义。

(3) 命名实体识别(Named Entity Recognition, NER)

做什么:从文本中识别出人名、地名、机构名、时间、数字等实体。

输入:"乔布斯于1976年在美国加州创立了苹果公司"
输出:
  - 乔布斯 → PERSON(人物)
  - 1976年 → DATE(时间)
  - 美国加州 → LOCATION(地点)
  - 苹果公司 → ORGANIZATION(机构)

应用场景

  • 搜索引擎:“我想了解乔布斯” → 搜索引擎准确知道你在搜索一个人
  • 自动摘要:提取出新闻中的关键人物、地点、时间
  • 知识图谱构建:从海量文本中提取实体和关系

生活类比:NER就像你在读一本英文小说时用荧光笔标记——人名标黄色、地名标蓝色、日期标绿色。读完后,你一眼就能找到所有关键信息。

(4) 词义消歧(Word Sense Disambiguation, WSD)

做什么:当一个词有多个含义时,根据上下文确定它当前的真正含义。

"苹果很好吃" → 苹果 = 水果
"苹果发布了新手机" → 苹果 = Apple公司
"你真是个苹果" → 苹果 = ?(需要更多上下文)
层次二:句法分析——理解句子结构
(1) 句法结构分析(Constituency Parsing)

将句子分解为短语(名词短语NP、动词短语VP等),形成树状结构。

句子:"小明吃了红苹果"

语法树:
      S(句子)
     /    \
   NP     VP
   │     /  \
  小明   V    NP
        │    /  \
        吃   ADJ  N
             │    │
             红   苹果
(2) 依存关系分析(Dependency Parsing)

分析词与词之间的依存关系(谁修饰谁、谁是主语、谁是宾语)。

句子:"小明吃了红苹果"

依存关系(箭头从修饰词指向被修饰词):
  小明 ←nsubj← 吃 →dobj→ 苹果 →amod→ 红

nsubj = 名词性主语(nominal subject)
dobj  = 直接宾语(direct object)
amod  = 形容词修饰(adjectival modifier)

生活类比:句法分析就像你在初中语文课上做的"句子成分分析"——划分主谓宾定状补。只不过现在让计算机来做。

层次三:语义分析——理解含义
(1) 语义角色标注(Semantic Role Labeling, SRL)

识别"谁对谁做了什么、在哪儿、什么时候、为什么"。

句子:"小明昨天在学校用手机给小红发了消息"

  施事者(Agent):小明(谁做的?)
  时间(Time):昨天(什么时候?)
  地点(Location):学校(在哪里?)
  工具(Instrument):手机(用什么做的?)
  接受者(Recipient):小红(对谁做的?)
  动作(Action):发(做了什么?)
  客体(Theme):消息(动作的对象是什么?)
(2) 语义相似度计算

计算两段文本在语义上的相似程度。

文本A:"今天天气真好啊"
文本B:"今天风和日丽"
语义相似度:很高(虽然用词不同,但表达的意思相似)

文本A:"今天天气真好啊"
文本C:"昨天下雨了"
语义相似度:低
层次四:语用分析——理解言外之意

这是最深层次的语言理解,包括:

  • 指代消解:确定"他"、“它”、"这个"等指代词具体指向什么
  • 篇章分析:理解段落之间、句子之间的逻辑关系(因果、转折、并列等)
  • 隐含意图识别:理解字面之下的真实意图
句子:"你能把窗户关上吗?"
字面意思:询问对方是否具备关窗的能力
真实意图:请求对方把窗户关上

按任务形式划分——从应用角度

类别一:文本分类

输入一段文本,输出一个或多个标签。

子任务 说明 例子
情感分析 判断文本的情感倾向 “这家店太棒了!” → 正面
主题分类 判断文本属于哪个主题 一篇新闻 → “体育”
垃圾邮件检测 判断邮件是否为垃圾邮件 推广邮件 → 垃圾邮件
仇恨言论检测 检测有害内容 含侮辱性词汇的评论 → 有害
真假新闻鉴别 判断新闻是否可信 标题党文章 → 虚假

生活类比:文本分类就像分拣邮件——看到一个信封,网上订单放一堆,账单放一堆,广告传单丢垃圾桶。

类别二:序列标注

输入文本序列,为序列中的每个元素(词或字)输出一个标签。

子任务 说明 例子
分词 标注每个字是词的开始(B)、中间(I)还是单独成词(S) “我/S 爱/S 北/B 京/I”
词性标注 标注每个词的词性 “我/r 爱/v 北京/n”
NER 标注实体边界和类型 “乔/B-PER 布/I-PER 斯/I-PER”

序列标注的核心思想:标签不是孤立的,相邻标签之间存在约束关系。比如B-PER(人名开始)后面只能跟I-PER(人名内部)或O(非实体),不能跟B-LOC(地名开始),因为一个人名不可能突然变成地名。

类别三:序列生成

输入一段文本,输出另一段文本(长度可能不同)。

子任务 说明
机器翻译 中文 → 英文
文本摘要 长文章 → 短摘要
对话生成 用户输入 → 系统回复
问题生成 给定文章,生成相关问题
诗句生成 给定主题,生成诗句

序列生成为什么更难

  • 输出空间巨大:每个位置有词汇表大小(几万)种选择
  • 需要保持连贯性:生成的文本需要前后一致
  • 多样性要求:同样的输入可以有不同的合理输出
类别四:关系抽取与知识图谱
子任务 说明
关系抽取 从文本中提取实体之间的关系
事件抽取 识别事件触发词和事件要素
知识图谱构建 将抽取的实体和关系组织成图结构
文本:"乔布斯是苹果公司的联合创始人"
抽取结果:(乔布斯, 是...的联合创始人, 苹果公司)
三元组:(乔布斯, founder_of, 苹果公司)

任务分类总览表

NLP任务分类
│
├── 按语言层次
│   ├── 词法分析:分词、词性标注、NER、词义消歧
│   ├── 句法分析:句法结构分析、依存关系分析
│   ├── 语义分析:语义角色标注、语义相似度计算
│   └── 语用分析:指代消解、篇章分析
│
└── 按任务形式
    ├── 文本分类:情感分析、主题分类、垃圾邮件检测
    ├── 序列标注:分词、词性标注、NER
    ├── 序列生成:机器翻译、文本摘要、对话生成
    └── 关系抽取:知识图谱构建、信息抽取

自检问题

  1. "情感分析"按语言层次属于哪一层?按任务形式属于哪一类?
  2. 为什么说序列生成比序列标注更难?
  3. 举一个生活中用到NER的例子(提示:想想收到快递短信时,手机自动识别了什么)。

关键定理与公式详解

数学前置:本节需要理解概率(概率表示事件发生的可能性,范围0到1)、条件概率(在已知某事件发生的前提下,另一个事件发生的概率)、求和符号Σ(表示累加)和乘积符号Π(表示连乘)。如果你还不熟悉这些符号,建议先花10分钟了解一下。

语言模型基础——链式法则

为什么需要语言模型?

在NLP中,我们经常需要回答这样的问题:

  • "我今天坐公交车去上班"和"去公交车坐上班我今天"哪一句更像人说的话?
  • 给定上文"我昨天晚上吃了一碗…“,下一个词更可能是"面条"还是"汽车”?

语言模型就是用来计算"一段文本有多像人说的话"的数学工具。

链式法则公式

P ( w 1 , w 2 , . . . , w n ) = ∏ i = 1 n P ( w i ∣ w 1 , w 2 , . . . , w i − 1 ) P(w_1, w_2, ..., w_n) = \prod_{i=1}^{n} P(w_i \mid w_1, w_2, ..., w_{i-1}) P(w1,w2,...,wn)=i=1nP(wiw1,w2,...,wi1)

公式拆解(逐步理解)

第1步:理解符号

  • P ( w 1 , w 2 , . . . , w n ) P(w_1, w_2, ..., w_n) P(w1,w2,...,wn) 表示一个词序列 ( w 1 , w 2 , . . . , w n ) (w_1, w_2, ..., w_n) (w1,w2,...,wn) 作为一句"自然的话"出现的概率
  • ∏ \prod 是连乘符号,表示把后面的项全部乘起来
  • P ( w i ∣ w 1 , . . . , w i − 1 ) P(w_i \mid w_1, ..., w_{i-1}) P(wiw1,...,wi1) 表示"在前i-1个词已经出现的情况下,第i个词出现的概率"

第2步:用具体例子理解

假设句子是"我爱学习",我们想计算这个三词序列的概率:

P ( 我 , 爱 , 学习 ) = P ( 我 ) × P ( 爱 ∣ 我 ) × P ( 学习 ∣ 我 , 爱 ) P(\text{我}, \text{爱}, \text{学习}) = P(\text{我}) \times P(\text{爱} \mid \text{我}) \times P(\text{学习} \mid \text{我}, \text{爱}) P(,,学习)=P()×P()×P(学习,)

这个计算的逻辑是:

  1. 首先,"我"作为句子开头出现的概率是多少?
  2. 然后,在"我"已经出现的情况下,下一个词是"爱"的概率是多少?
  3. 最后,在"我爱"已经出现的情况下,下一个词是"学习"的概率是多少?

第3步:为什么它是对的?

根据条件概率的乘法公式:
P ( A , B ) = P ( A ) × P ( B ∣ A ) P(A, B) = P(A) \times P(B \mid A) P(A,B)=P(A)×P(BA)

推广到三个事件:
P ( A , B , C ) = P ( A ) × P ( B ∣ A ) × P ( C ∣ A , B ) P(A, B, C) = P(A) \times P(B \mid A) \times P(C \mid A, B) P(A,B,C)=P(A)×P(BA)×P(CA,B)

再推广到n个事件,就是链式法则。

生活类比:链式法则就像在一条路上选择岔路口。

起点 ─→ "我" (P=0.3) ─→ "爱" (P=0.1|"我") ─→ "学习" (P=0.4|"我爱")
                │
                ├─→ "吃" (P=0.2|"我")
                │        └─→ "饭" (P=0.5|"我吃")
                │
                └─→ "去" (P=0.3|"我")
                         └─→ "学校" (P=0.6|"我去")

整个句子"我爱学习"的概率 = 0.3 × 0.1 × 0.4 = 0.012

链式法则的问题

实际应用中,链式法则有一个致命问题:数据稀疏

对于"我明天要去天安门广场看升旗仪式",如果我们想用链式法则精确计算:
P ( 仪式 ∣ 我 , 明天 , 要 , 去 , 天安门 , 广场 , 看 , 升旗 ) P(\text{仪式} \mid \text{我}, \text{明天}, \text{要}, \text{去}, \text{天安门}, \text{广场}, \text{看}, \text{升旗}) P(仪式,明天,,,天安门,广场,,升旗)

这个条件概率几乎无法估计——因为语料库中很可能从未出现过完全相同的上文组合。即使语料库非常大,绝大多数词序列的组合也从未出现过。

这就是下一个概念n-gram要解决的问题。

n-gram与马尔可夫假设

马尔可夫假设的核心思想

马尔可夫假设(Markov Assumption)是一个简化策略

P ( w i ∣ w 1 , w 2 , . . . , w i − 1 ) ≈ P ( w i ∣ w i − n + 1 , . . . , w i − 1 ) P(w_i \mid w_1, w_2, ..., w_{i-1}) \approx P(w_i \mid w_{i-n+1}, ..., w_{i-1}) P(wiw1,w2,...,wi1)P(wiwin+1,...,wi1)

通俗理解:一个词的出现,只和它前面最近几个词有关,不需要看很远的上下文。

生活类比

  • 原始链式法则:你决定今天穿什么要参考从出生以来的每一天(不可行)
  • n-gram假设:你决定今天穿什么只参考最近几天的天气(可行且合理)
不同n值的n-gram

unigram(1-gram)——只看当前词

P ( w i ∣ w 1 , . . . , w i − 1 ) ≈ P ( w i ) P(w_i \mid w_1, ..., w_{i-1}) \approx P(w_i) P(wiw1,...,wi1)P(wi)

这等于完全忽略上下文,只看每个词自己出现的频率。

P("我爱学习") ≈ P(我) × P(爱) × P(学习)

这会导致"我爱学习"和"学习爱我"算出来概率一样!因为只是三个概率乘起来,顺序被忽略了。

bigram(2-gram)——看前一个词

P ( w i ∣ w 1 , . . . , w i − 1 ) ≈ P ( w i ∣ w i − 1 ) P(w_i \mid w_1, ..., w_{i-1}) \approx P(w_i \mid w_{i-1}) P(wiw1,...,wi1)P(wiwi1)

P("我爱学习") ≈ P(我) × P(爱|我) × P(学习|爱)
P("学习爱我") ≈ P(学习) × P(爱|学习) × P(我|爱)

这样"我爱学习"和"学习爱我"就会算出不同的概率了。

trigram(3-gram)——看前两个词

P ( w i ∣ w 1 , . . . , w i − 1 ) ≈ P ( w i ∣ w i − 2 , w i − 1 ) P(w_i \mid w_1, ..., w_{i-1}) \approx P(w_i \mid w_{i-2}, w_{i-1}) P(wiw1,...,wi1)P(wiwi2,wi1)

P("我爱学习") ≈ P(我) × P(爱|我) × P(学习|我, 爱)
n的选择是一个权衡
n 优点 缺点
1 (unigram) 统计简单,不会遇到数据稀疏 完全忽略语序,“我爱你”=“你爱我”
2 (bigram) 捕捉到了基本语序信息 无法处理长距离依赖
3 (trigram) 捕捉更多上下文 数据稀疏开始显现
4-5 更强的上下文建模 严重的数据稀疏问题

实际应用中,n=2(bigram)和n=3(trigram)是最常用的选择。

n-gram的局限性(为什么最终被神经网络取代)
例句:"我把刚从图书馆借的那本关于机器学习的书放在了桌子上"

使用trigram:
P(桌子上|我,把) → 完全无关!
P(桌子上|在,桌子) → 有用的信息
P(桌子上|放了,在) → 有一定关联

"书"和"桌子"之间的关键关系被中间的长定语隔断了,
n-gram很难捕捉到这种长距离的依赖关系。

这就是为什么后来需要Transformer这种能建模任意距离依赖的架构。

困惑度(Perplexity)

为什么需要困惑度?

困惑度是衡量语言模型好坏的最常用指标。它回答了一个直觉问题:这个模型对接下来会看到什么词有多"惊讶"?

困惑度公式

P P L = exp ⁡ ( − 1 N ∑ i = 1 N log ⁡ P ( w i ∣ c o n t e x t ) ) PPL = \exp\left(-\frac{1}{N}\sum_{i=1}^{N} \log P(w_i \mid context)\right) PPL=exp(N1i=1NlogP(wicontext))

直观理解

困惑度的本质是:模型平均在每个位置上需要从多少个等可能的候选中做出选择

困惑度值 含义
1 完美模型,每次都100%确定下一个词(实际不可能)
10 好模型,平均每次从10个词中猜一个
100 一般模型,把握不大
1000+ 差模型,几乎在乱猜

生活类比:困惑度就像猜谜游戏的难度。

  • 猜一个朋友下一句会说什么 → 低困惑度(因为了解他的说话习惯)
  • 猜一个陌生人的下一句 → 高困惑度(完全不熟悉)
为什么用困惑度而不是别的指标?

困惑度的优点:

  1. 与概率直接相关:困惑度低 = 模型对真实文本赋予了高概率
  2. 跨任务可比:不同的NLP任务可以用同一个困惑度指标比较模型质量
  3. 直观可解释:困惑度从500降到100 = 模型从在500个词中猜对了目标词,到在100个词中就猜对了

自检问题

  1. 用你自己的话解释链式法则的含义,并举一个三词句子的计算例子。
  2. 为什么n-gram的n越大,数据稀疏越严重?
  3. 如果语言模型A的困惑度是50,语言模型B的困惑度是200,哪个模型更好?为什么?

NLP的八大应用场景

机器翻译

代表产品:Google翻译、DeepL、百度翻译、有道翻译

工作原理简述:现代机器翻译通常使用Transformer的Encoder-Decoder架构。Encoder将源语言句子编码为一个语义表示,Decoder将这个表示解码为目标语言句子。

发展阶段

  1. 基于规则的翻译:人工编写语法规则和词典(效果差,无法处理复杂的语言现象)
  2. 统计机器翻译(SMT):基于大量平行语料(中英对照文本)学习翻译概率(效果中等)
  3. 神经机器翻译(NMT):使用深度神经网络端到端学习(当前主流,效果好)

用户故事:小明想去日本旅游,用Google翻译App把菜单拍下来,App自动识别日语并翻译成中文,小明顺利地点了菜。

智能客服

代表产品:淘宝小蜜、京东JIMI、银行自助客服

工作流程

用户问题:"我的快递到哪儿了?"
     ↓
意图识别 → 识别为"查询物流"
     ↓
槽位填充 → 提取关键信息(订单号、手机号等)
     ↓
知识库检索 → 根据意图和槽位查找答案
     ↓
生成回复 → "您的快递目前在【北京分拣中心】,预计明天送达。"

搜索引擎

代表产品:Google、百度、Bing

NLP在搜索中的作用

  • 查询理解:正确理解用户搜索意图(你搜"苹果"是想买水果还是查手机?)
  • 文档理解:分析网页内容的主题和质量
  • 语义匹配:即使搜索词和网页用词不同,也能匹配到相关内容
  • 排序:根据相关性对搜索结果排序

社交媒体分析

应用场景

  • 舆情监控:实时分析微博、Twitter上的公众情绪走势
  • 品牌口碑分析:汇总用户对品牌的评价倾向
  • 热点发现:自动发现正在快速传播的话题

实际案例:某电影上映后,通过分析微博评论的情感分布(正面70%、中性20%、负面10%),制片方可以快速了解观众反响,决定是否需要调整宣传策略。

语音助手

代表产品:Siri、Alexa、小爱同学、天猫精灵、小度

技术流程

语音 → ASR(语音识别,转文字)→ NLP(理解意图)→ 执行动作 → NLG(生成回复)→ TTS(文字转语音)

NLP在其中承担了核心的理解和生成任务。当你说"帮我定明天早上8点的闹钟",NLP需要:

  1. 识别意图:设定闹钟
  2. 提取参数:时间=明天早上8点
  3. 确认并执行

内容审核

应用场景

  • 社交媒体平台自动检测违规内容(色情、暴力、仇恨言论)
  • 电商平台过滤虚假评论
  • 新闻平台识别标题党和假新闻

为什么需要AI:内容审核无法纯靠人工完成。以微博为例,每天产生的评论数以亿计,人工审核不仅成本高昂,而且审核人员会受到心理创伤(长时间接触负面内容)。

医疗NLP

应用场景

  • 电子病历分析:自动从病历中提取关键医学信息(诊断、用药、手术史)
  • 药物发现:从海量生物医学文献中挖掘潜在的药物-疾病关联
  • 辅助诊断:分析医生问诊记录,提示可能的诊断方向
  • 医患对话总结:自动将医生的语音问诊记录转为结构化病历

法律NLP

应用场景

  • 合同审查:自动检查合同中的关键条款和潜在风险
  • 法律文书分析:从判决书中提取案件要素
  • 法规检索:根据案件描述智能检索相关法律条文和判例
  • 审前文档整理:自动分类和摘要大量案件相关文档

自检问题

  1. 除了上述8个场景,你还能想到哪些NLP的应用?
  2. 语音助手中最核心的NLP任务是哪些?

NLP的优缺点深度剖析

优点

处理海量文本数据,效率远超人工

一个熟练的阅读者每分钟可以阅读约300字,一天8小时大约处理14万字。而现代NLP模型可以在几分钟内处理上亿字的文本。

实际对比

人工阅读100万篇新闻找热点需要的时间:约2000人 × 8小时
NLP模型处理100万篇新闻找热点需要的时间:约30分钟
可7 × 24小时持续工作

模型不需要休息、不会疲劳、不会因为情绪波动影响判断质量。这对于需要持续监控的应用(如内容审核、舆情监控)至关重要。

能发现人类难以察觉的语言模式

NLP模型可以从文本中发现一些人类直觉难以捕捉的统计模式。比如:

  • 从数十万篇论文中自动发现新兴研究趋势
  • 从消费者评论中发现细微的情感变化
多语言支持能力不断增强

现代多语言预训练模型(如mBERT、XLM-R)可以同时处理100多种语言,并实现跨语言的迁移学习——在英语上训练的情感分析能力,可以零样本迁移到没有训练数据的语言上。

不断降低的使用门槛

通过API服务,即使是没有任何NLP背景的开发者,也可以在几分钟内集成文本分析功能。

缺点

对语境和常识理解有限

NLP模型虽然可以生成流畅的文本,但缺乏真正的"世界知识"和常识推理能力。

例子

人类:如果一个杯子掉在地上,会发生什么?
模型:杯子会掉在地上。(虽然语法正确,但缺乏因果推理)
人类应该的回答:杯子可能会摔碎,液体可能会洒出来。
数据偏见问题

NLP模型从人类写的数据中学习,因此也会学到人类数据中的偏见。

例子

训练数据中,"医生"更多与"他"共现,"护士"更多与"她"共现
→ 模型可能学到一个偏见:医生更可能是男性,护士更可能是女性
→ 当输入"这个医生..."时,模型可能更倾向于使用"他"来指代
→ 这种偏见会进一步被模型的输出所放大

为什么这是个严重问题

  • 招聘系统可能对某些群体产生不公
  • 内容审核可能对不同群体采用不同标准
  • 搜索引擎可能强化已有的刻板印象
对低资源语言支持不足

目前最好的NLP模型主要支持英语、中文等大语种。全世界约7000种语言中,绝大多数缺乏NLP工具支持。

为什么?

  • 缺乏足够的标注数据
  • 缺乏足够的无标注文本用于预训练
  • 缺乏懂这些语言的技术研究者
可解释性差(黑盒问题)

现代NLP模型(尤其是大模型)做出决策的过程很难被人类理解。

例子

输入:"这部电影太无聊了,我差点睡着了"
模型输出:负面情感,置信度0.97

人类理解:因为"无聊"和"差点睡着"表示不满意
模型理解:... ? (我们只能推测它可能学到了这些负面词汇的组合模式)

但这只是推测。对于大型神经网络中万亿级的参数,
我们无法精确追踪"从这个输入到那个输出"的推理路径。

为什么可解释性重要

  • 医疗诊断中,医生需要知道模型为什么做出某个诊断
  • 法律文书中,法官需要了解AI辅助判断的依据
  • 金融审核中,需要解释为什么某笔交易被标记为可疑
对抗性样本的脆弱性

对抗性攻击是指对输入进行微小的、人眼不可察觉的修改,使其完全改变模型的输出。

原始输入:"这家餐厅的服务很好" → 模型输出:正面

对抗输入:"这家餐厅的服务很好"(将"服务"替换为同义词"侍应")
→ 模型输出:负面(??)

这种看似相同的输入不应该改变判断结果,
但模型可能因为训练数据中没见过这种组合而出错。

生活类比:模型的脆弱性就像一个人只看过红色苹果,当你给他看一个绿色苹果时,他就不知道这是什么了——虽然他应该知道"苹果和颜色没关系"。

自检问题

  1. 你认为NLP模型的数据偏见问题应该如何解决?
  2. 列举一个"可解释性差"可能造成严重后果的场景。

NLP技术演进全景图

四次范式革命

NLP的发展经历了四次重大的范式转变,每一次都是因为旧方法遇到了无法逾越的瓶颈。

第一代:基于规则(1950s-1990s)

核心思想:语言学家手写规则来教计算机处理语言。

工作方式

IF 句子包含"你好" THEN 回复"你好!"
IF 句子包含"谢谢" THEN 回复"不客气!"

代表系统:ELIZA(1966年)——世界上第一个聊天机器人

为什么被淘汰

  • 规则永远写不完(语言太灵活)
  • 规则之间会互相冲突
  • 无法处理没见过的情况

生活类比:基于规则的方法就像在教一个外国人中文时,告诉他"只要在句尾加’吗’就是疑问句"——这个规则大部分时候对,但"你喜欢吃什么的吗"就不对了。

第二代:统计方法(1990s-2013)

核心思想:不再手写规则,而是从大量数据中自动学习统计规律。

工作方式

不是写规则"动词前面的是主语",
而是统计:在100万句话中,"小明吃了"这个组合出现了多少次
vs "吃了小明"出现了多少次 → 用频率决定正确性

代表技术:n-gram语言模型、隐马尔可夫模型(HMM)、条件随机场(CRF)

为什么被超越

  • 数据稀疏(绝大多数词组合从未出现)
  • 无法捕捉深层语义关系
  • 特征工程依赖大量人工设计
第三代:神经网络(2013-2017)

核心思想:用神经网络自动学习文本的表示,不再需要人工设计特征。

代表技术:Word2Vec、RNN、LSTM、Seq2Seq

关键突破

  • Word2Vec使语义计算成为可能
  • RNN/LSTM可以处理变长序列
  • Seq2Seq实现了端到端的翻译

为什么被超越

  • RNN无法并行训练(必须按顺序处理)
  • LSTM虽然缓解了梯度消失,但在500+步的序列上仍然力不从心
  • 训练速度慢,难以扩展到更大数据
第四代:预训练+Transformer(2017-至今)

核心思想:先在大规模无标注文本上预训练一个通用语言模型,再针对具体任务微调。

代表技术:Transformer、BERT、GPT系列、T5、LLaMA

为什么这是革命性的

  • Transformer的Self-Attention机制解决了长距离依赖问题
  • 预训练让模型学会了通用的语言知识
  • 微调让模型能快速适应各种下游任务

演进路线图

1950s━━━━━━1990s━━━━━━2013━━━━━2017━━━━━━2018━━━━━━━━━━━→ 未来

基于规则 ─→ 统计方法 ─→ 神经网络 ─→ Transformer ─→ 预训练时代 ─→ ?
(手写规则)  (n-gram,    (Word2Vec,  (Attention)   (BERT, GPT,
            HMM, CRF)   RNN, LSTM)                  ChatGPT)

每次演进的关键突破:
规则→统计:      从"人教"到"数据教"
统计→神经网络:  从"统计频率"到"学习语义表示"
RNN→Transformer:从"顺序处理"到"并行注意力"
训练→预训练:    从"新兵培训"到"名校毕业+岗位实习"

未来趋势

方向一:多模态融合

不仅处理文本,还融合图像、语音、视频等信息。这是通向"通用智能"的重要一步。

例子

输入:一张菜的照片 + "这怎么做?"
多模态NLP:识别出这是鱼香肉丝 → 搜索相关菜谱 → 用文字回复做菜步骤

GPT-4已经展示了这个能力——它可以"看"一张图表然后分析数据趋势。

方向二:更高效的模型架构

当前大模型虽然有强大的能力,但也面临严峻问题:

  • GPT-3训练一次的电费约数百万美元
  • 推理时每生成一个词都需要海量计算
  • 无法在手机等设备上本地运行

因此,研究的重点方向包括:

  • 稀疏注意力:不是所有词对之间都计算注意力,减少计算量
  • MoE(混合专家):模型由多个"专家子模型"组成,每次只激活一部分
  • 量化:将模型参数从32位浮点数压缩到8位甚至4位,大幅减小模型体积
  • 知识蒸馏:用大模型"教"小模型,让小模型也有接近大模型的能力
方向三:可控生成与安全性

随着模型生成能力越来越强,如何控制生成内容变得至关重要:

关键挑战

  • 如何防止模型生成有害内容(仇恨言论、虚假信息)?
  • 如何让模型遵循人类的价值观和偏好?
  • 如何确保模型的回答是真实、可靠的(而不是"一本正经地胡说八道")?

现有方法

  • RLHF(基于人类反馈的强化学习):让人类标注员对模型的输出打分,用这些反馈来训练模型
  • 内容过滤器:在输出呈现给用户之前,用另一个模型检查是否有问题
  • 红队测试:专门找人尝试"攻破"模型,发现安全漏洞
方向四:通用人工智能方向

NLP研究的终极目标之一是让机器拥有与人类一样的语言理解和生成能力。当前的大语言模型(LLM)已经展示了令人惊叹的涌现能力——很多能力并不是被专门训练出来的,而是当模型大到一定程度后自然出现的。

涌现能力(Emergent Abilities)

  • 思维链推理:模型学会"一步一步想"来解复杂问题
  • 少样本学习:只看几个示例就能掌握新任务
  • 指令遵循:理解并执行用自然语言描述的指令
  • 工具使用:学会调用计算器、搜索引擎等外部工具

自检问题

  1. 用自己的话描述四次范式革命,每次都说明"为什么旧方法不够好"。
  2. 你认为NLP的下一个重大突破会在哪个方向?为什么?

API调用实战示例

前置知识:本节需要Python基础(安装包、import、函数调用)和HTTP请求的基本概念。如果你还不熟悉,建议先花15分钟了解一下。

使用Hugging Face Transformers Pipeline

Hugging Face是什么?

Hugging Face是一个NLP领域的"应用商店"。它汇集了成千上万个预训练好的NLP模型,你不需要自己训练,直接下载使用即可。而且,它提供了一个非常简单的API——Pipeline(流水线),让你用几行代码就完成复杂的NLP任务。

生活类比:Hugging Face就像NLP领域的"淘宝"——全世界的研究者把自己训练好的模型上架到这个平台上,你需要什么模型直接"下单"(下载)就行了。

代码示例与详解
# ============================================================
# 第1步:导入Pipeline类
# ============================================================
# transformers 是 Hugging Face 的核心库
# pipeline 是其中最常用的"一键调用"工具
from transformers import pipeline

# ============================================================
# 第2步:情感分析——判断文本是正面还是负面
# ============================================================
# 创建情感分析流水线
# pipeline("sentiment-analysis") 会自动下载一个默认的情感分析模型
# 第一次运行会下载模型文件(约几百MB),请确保网络畅通
classifier = pipeline("sentiment-analysis")

# 对一段英文文本进行情感分析
# 这里输入"I love this movie!"(我爱这部电影!)
result = classifier("I love this movie!")
print(result)
# 预期输出:[{'label': 'POSITIVE', 'score': 0.9998}]
# 解读:模型高度确信(99.98%)这段文本传达的是正面情感

# 试试中文(需要切换到支持中文的模型,默认模型只支持英文)
# classifier = pipeline("sentiment-analysis", model="uer/roberta-base-finetuned-jd-binary-chinese")
# result = classifier("这个产品质量太差了!")
# print(result)  # 预期输出:[{'label': 'negative', 'score': 0.99xxx}]

# ============================================================
# 第3步:文本生成——让AI写文本
# ============================================================
# 创建文本生成流水线,指定使用GPT-2模型
# GPT-2是OpenAI在2019年发布的语言模型,可以生成流畅的英文文本
# model="gpt2" 表示使用GPT-2的base版本(最小的GPT-2)
generator = pipeline("text-generation", model="gpt2")

# 给定开头"The future of AI is",让模型完成后续文本
# max_length=30 表示生成的总长度(包含输入)最多30个token
# token(词元)是模型处理文本的最小单位,英文中大约是3/4个单词
result = generator("The future of AI is", max_length=30, num_return_sequences=1)
print(result)
# 预期输出示例:
# [{'generated_text': 'The future of AI is bright and full of potential...'}]
# 注意:每次运行可能生成不同结果,因为模型有随机性

# ============================================================
# 第4步:命名实体识别——找出文本中的人名、地名、机构名
# ============================================================
# ner = Named Entity Recognition
# 默认使用dbmdz/bert-large-cased-finetuned-conll03-english模型
ner = pipeline("ner", aggregation_strategy="simple")

# 对一段包含实体的英文文本进行分析
# aggregation_strategy="simple" 会将属于同一实体的子词合并
result = ner("Apple was founded by Steve Jobs in California.")
print(result)
# 预期输出类似:
# [
#   {'entity_group': 'ORG', 'word': 'Apple', ...},       # 机构:苹果公司
#   {'entity_group': 'PER', 'word': 'Steve Jobs', ...},  # 人物:史蒂夫·乔布斯
#   {'entity_group': 'LOC', 'word': 'California', ...}   # 地点:加利福尼亚
# ]

# ============================================================
# 第5步:文本摘要——将长文本压缩为短摘要
# ============================================================
# 创建摘要流水线
summarizer = pipeline("summarization")

# 假设有一段长文本 long_text(这里用占位符,实际使用时替换为真实文本)
long_text = """
The Apollo program, also known as Project Apollo, was the third United States
human spaceflight program carried out by NASA, which succeeded in landing the
first humans on the Moon from 1969 to 1972. It was first conceived during
Dwight D. Eisenhower's administration as a three-person spacecraft to follow
the one-person Project Mercury. Apollo was later dedicated to President John F.
Kennedy's national goal of "landing a man on the Moon and returning him safely
to the Earth" by the end of the 1960s.
"""

# max_length=50 表示摘要最长50个token
# min_length=25 表示摘要至少25个token(避免摘要在过于短)
result = summarizer(long_text, max_length=50, min_length=25)
print(result)
# 预期输出:[{'summary_text': 'The Apollo program landed the first humans on
#  the Moon from 1969 to 1972...'}]

# ============================================================
# 常见错误与注意事项
# ============================================================
# 1. 模型下载失败:检查网络,可以尝试使用镜像源
# 2. 中文任务使用英文模型:需要明确指定支持中文的模型
# 3. GPU内存不足:可以指定 device=-1 使用CPU(速度慢但不会OOM)
#    pipeline("sentiment-analysis", device=-1)
# 4. 大文件警告:某些模型文件很大(几GB),请确保有足够的磁盘空间

使用有道翻译API

有道翻译API是什么?

有道翻译提供了一个HTTP接口,你可以通过网络请求来获得翻译服务。这是一种轻量级的方式来实现翻译功能,不需要下载任何模型。

适用场景:简单的翻译需求、原型验证、学习API调用

# ============================================================
# 使用有道翻译API进行中英文互译
# ============================================================

# 导入requests库(用于发送HTTP请求)
# 如果未安装,先执行: pip install requests
import requests

# ============================================================
# 有道翻译API免费接口
# ============================================================
# 注意:这是一个演示用的免费接口,有调用频率限制
# 生产环境请使用有道官方的付费API以获得更好的稳定性和服务质量

# 定义API地址
url = 'http://fanyi.youdao.com/translate'

# ------ 翻译任务1:中文翻译成英文 ------
# 准备请求参数
text1 = '你好世界'  # 待翻译的文本
data1 = {
    'from': 'zh-CHS',   # 源语言:简体中文
    'to': 'en',         # 目标语言:英文
    'i': text1,         # 待翻译文本(i = input)
    'doctype': 'json'   # 返回格式:JSON(结构化数据,方便程序读取)
}

# 发送POST请求
# requests.post 向指定URL发送POST请求
# url=url:指定请求的URL
# params=data:请求参数(会被附加到URL后面)
response1 = requests.post(url=url, params=data1)

# 解析返回的JSON数据
res1 = response1.json()
print("中文→英文翻译结果:")
print(res1)
# 预期输出格式:
# {'translateResult': [[{'tgt': 'Hello World', 'src': '你好世界'}]], ...}
# tgt = target(翻译结果), src = source(原文)


# ------ 翻译任务2:英文翻译成中文 ------
text2 = 'The price is very cheap'  # 待翻译的英文文本
data2 = {
    'from': 'en',        # 源语言:英文
    'to': 'zh-CHS',      # 目标语言:简体中文
    'i': text2,          # 待翻译文本
    'doctype': 'json'    # 返回JSON格式
}

response2 = requests.post(url=url, params=data2)
res2 = response2.json()
print("\n英文→中文翻译结果:")
print(res2)
# 预期输出包含翻译后的中文文本


# ============================================================
# 扩展:优雅的错误处理版本
# ============================================================
def translate(text, from_lang='zh-CHS', to_lang='en'):
    """
    使用有道API翻译文本的封装函数
    
    参数:
        text (str): 待翻译的文本
        from_lang (str): 源语言代码
        to_lang (str): 目标语言代码
    
    返回:
        str: 翻译结果,失败时返回None
    
    常用语言代码:
        zh-CHS: 简体中文
        en:     英文
        ja:     日语
        ko:     韩语
        fr:     法语
    """
    url = 'http://fanyi.youdao.com/translate'
    data = {
        'from': from_lang,
        'to': to_lang,
        'i': text,
        'doctype': 'json'
    }
    
    try:
        # 设置超时时间,防止请求卡住
        response = requests.post(url=url, params=data, timeout=5)
        response.raise_for_status()  # 如果返回状态码不是200,抛出异常
        
        result = response.json()
        # 从复杂的嵌套结构中提取翻译结果
        translated = result['translateResult'][0][0]['tgt']
        return translated
    
    except requests.exceptions.Timeout:
        print("[错误] 请求超时,请检查网络连接")
        return None
    
    except requests.exceptions.RequestException as e:
        print(f"[错误] 请求失败: {e}")
        return None
    
    except (KeyError, IndexError) as e:
        print(f"[错误] 解析返回数据失败: {e}")
        print(f"原始返回: {response.text}")
        return None

# 使用封装好的函数
zh_to_en = translate('你好世界')
print(f"\n封装函数测试(中→英): {zh_to_en}")

en_to_zh = translate('The price is very cheap', from_lang='en', to_lang='zh-CHS')
print(f"封装函数测试(英→中): {en_to_zh}")

两种API方式对比

维度 Hugging Face Pipeline 有道翻译API
运行方式 本地运行(需下载模型) 云端API调用
功能范围 全面的NLP任务 仅翻译
隐私 数据不离开本地 数据发送到云端
性能 依赖本地硬件 依赖网络和服务器
上手难度 中等 简单
适用场景 研究、离线应用 快速原型、产品集成

自检问题

  1. pipeline("sentiment-analysis") 背后发生了什么?试着描述从调用到返回结果的整个过程。
  2. 什么情况下用本地模型(Hugging Face Pipeline)更好?什么情况下用云API(有道翻译)更好?

补充提升内容

NLP vs NLU vs NLG 详细对比

这三个缩写在NLP文献中经常出现,初学者容易混淆。下面做一个全面的对比:

维度 NLP NLU NLG
全称 Natural Language Processing Natural Language Understanding Natural Language Generation
中文 自然语言处理 自然语言理解 自然语言生成
定义 所有涉及计算机处理人类语言的技术总和 让机器理解文本的含义、意图和情感 让机器生成人类可读的自然语言文本
范围 最广(包含NLU和NLG) 是NLP的一个子领域 是NLP的一个子领域
输入 文本/语音 文本/语音 数据/指令/结构化信息
输出 因任务而异 结构化信息(标签、关系、实体) 自然语言文本
典型任务 所有语言相关任务 情感分析、问答题、NER、意图识别 翻译、摘要、对话生成、故事写作

关系图

┌──────────────────────────────────────────────┐
│                   NLP (自然语言处理)            │
│                                              │
│  ┌─────────────────┐  ┌──────────────────┐  │
│  │      NLU        │  │      NLG         │  │
│  │  (自然语言理解)  │  │  (自然语言生成)  │  │
│  │                 │  │                  │  │
│  │ · 情感分析      │  │ · 机器翻译       │  │
│  │ · 命名实体识别  │  │ · 文本摘要       │  │
│  │ · 意图识别      │  │ · 对话生成       │  │
│  │ · 关系抽取      │  │ · 故事写作       │  │
│  │ · 文本分类      │  │ · 诗歌生成       │  │
│  └────────┬────────┘  └────────┬─────────┘  │
│           │                    │             │
│           └────────┬───────────┘             │
│                    │                         │
│              两者结合的典型任务:               │
│              机器翻译 = NLU解读原文 + NLG生成译文│
│              智能客服 = NLU理解问题 + NLG生成回复│
└──────────────────────────────────────────────┘

记忆口诀

  • NLP是"总称"(P = Processing = 处理 = 包含一切)
  • NLU是"听"(U = Understanding = 理解 = 接收信息)
  • NLG是"说"(G = Generation = 生成 = 产出信息)

NLP中的数据标注格式

数据标注是监督学习的基础——你需要告诉模型"正确答案"是什么,模型才能学习。不同的任务有不同的标注格式。

BIO标注体系(用于NER等序列标注任务)

BIO是序列标注中最常用的格式。每个词被标记为B(Begin,实体的开始)、I(Inside,实体的内部)或O(Outside,非实体)。

例句:"乔布斯在苹果公司工作"

标注结果:
乔  → B-PER  (B-PER = Begin of Person, 人名的开始)
布  → I-PER  (I-PER = Inside of Person, 人名的内部)
斯  → I-PER  (I-PER = Inside of Person, 人名的内部)
在  → O      (不是实体)
苹  → B-ORG  (B-ORG = Begin of Organization, 机构名的开始)
果  → I-ORG  (I-ORG = Inside of Organization, 机构名的内部)
公  → I-ORG
司  → I-ORG
工  → O
作  → O

可以解读为:
- 实体1:乔布斯(人物),位置1-3
- 实体2:苹果公司(机构),位置5-8

为什么需要BIO格式?

考虑这个问题:如果我们只用"PER"标记人物,那么"乔布斯"三个字都被标为PER。模型对每个字独立判断,可能会识别出"乔"是一个人名,"布"是另一个地名,“斯"是另一个地名。但实际上这三个字属于同一个实体,BIO格式中的B-I-I结构告诉模型"这是一个连续实体的内部”。

BIOES标注体系(BIO的增强版)

在BIO的基础上增加了E(End,结束)和S(Single,单个字/词就是一个完整实体):

乔 → B-PER    布 → I-PER    斯 → E-PER     (多词人名)
在 → O
苹果 → S-ORG  (单个词构成的机构名)
标签 含义 示例
B-XX 某类实体的开始 “乔” 是 人名 的开始
I-XX 某类实体的内部 “布” 是 人名 的内部
E-XX 某类实体的结束 “斯” 是 人名 的结束
S-XX 单个词就是完整实体 “苹果” 单独构成机构名
O 非实体 “在” 不是实体
分类标注(TSV/CSV格式)

对于文本分类任务,最简单的格式是"标签 + 分隔符 + 文本":

格式:label\ttext  (TSV,制表符分隔)
示例:
1\t这部电影太好看了,特效震撼,剧情紧凑
0\t太烂了,浪费我的钱和时间
1\t推荐大家去看,绝对值回票价
0\t看了一半就睡着了

如果使用CSV格式:

label,text
1,这部电影太好看了特效震撼剧情紧凑
0,太烂了浪费我的钱和时间

评估指标速查表

在NLP中,不同的任务使用不同的评估指标来衡量模型的好坏:

任务 主要指标 指标含义 备注
分类 Accuracy 预测正确的比例 样本不均衡时不适用
分类 F1-Score 精确率和召回率的调和平均 样本不均衡时使用
分类 Precision 预测为正的样本中真正为正的比例 关注"查得准不准"
分类 Recall 真正为正的样本中被预测出来的比例 关注"查得全不全"
翻译 BLEU 翻译结果与参考翻译的n-gram重叠度 0-100,越高越好
翻译 METEOR 考虑同义词和词形变化的BLEU改进版 对中文效果更好
摘要 ROUGE-N 摘要与参考摘要的n-gram重叠度 ROUGE-1, ROUGE-2, ROUGE-L最常用
对话 Perplexity 模型对回复语料的"困惑度" 越低越好
对话 BLEU 生成回复与真实回复的重叠度 用于有参考回复的场景
NER F1(实体级别) 按完整实体匹配计算的F1 比token级别更严格
F1-Score详解(为什么需要它)

假设我们在做垃圾邮件检测:

全部邮件:100封
  - 真正垃圾邮件:10封
  - 正常邮件:90封

模型A的策略:把所有邮件都判定为正常邮件
  - Accuracy = 90/100 = 90%(看起来不错!)
  - 但实际上一封垃圾邮件都没检测出来!
  - F1-Score = 0(因为Recall = 0)

这说明了为什么只看Accuracy不够:
当类别不均衡时,要综合看Precision和Recall,F1-Score是两者的平衡指标。

自检问题

  1. "今天是星期日"用BIO格式应该如何标注(假设"星期日"是日期实体)?
  2. 为什么类别不均衡时不能用Accuracy?(用上述垃圾邮件检测的例子解释)

本章总结与自测题

核心概念回顾

概念 一句话总结
NLP 让计算机理解和生成人类语言的技术总和
NLU NLP中"理解"的部分(文本 → 结构化信息)
NLG NLP中"生成"的部分(结构化信息 → 文本)
语言模型 计算一段文本"有多像自然语言"的数学模型
n-gram 简化语言模型的假设:一个词只和前面n-1个词有关
困惑度 衡量语言模型好坏的指标,越低越好
Transformer 当前NLP的主流架构,核心是Attention机制
预训练+微调 当前NLP的主流范式:先通才教育,后专业训练

本章自测题

基础题

  1. 名词解释:用自己的话解释以下概念:

    • 自然语言处理(NLP)
    • NLU和NLG的区别
    • 图灵测试
  2. 历史排序:将以下事件按时间排序:Transformer发布、Word2Vec发布、BERT发布、图灵测试提出。

  3. 任务分类:判断以下NLP任务属于哪一类:

    • 将"今天天气真好"翻译成英文
    • 判断"这部电影太棒了"的情感倾向
    • 从"乔布斯创立了苹果公司"中找出人名和机构名
    • 将一篇5000字的论文压缩为300字摘要

进阶题

  1. 语言模型计算:使用bigram模型,计算句子"我爱学习"的概率(假设你知道所有需要的条件概率)。

  2. 困惑度理解:模型A对某个测试集的困惑度是30,模型B对同一测试集的困惑度是150。请问:

    • 哪个模型更好?为什么?
    • 困惑度30意味着什么?(用直观的语言描述)
  3. 思路分析:有一个公司想要自动分析用户产品评价的情感(好评/差评)。请设计一个完整的解决方案,包括:

    • 需要什么数据?
    • 使用什么类型的NLP任务?
    • 可能遇到哪些挑战?
    • 如何评估效果?

思考题

  1. 伦理思考:如果NLP技术变得极其强大,可以完美模拟任何人的语言风格,你认为可能带来哪些社会问题?应该如何防范?

  2. 未来展望:你认为10年后的NLP技术会在哪些方面超越今天的ChatGPT?具体会有什么能力?


学习建议

  1. 不要试图一次记住所有概念,先理解"大框架",细节在后续实践中慢慢熟悉
  2. 手动复述一遍每个核心概念——如果能用自己的话讲清楚,才算真正理解了
  3. 尝试运行本章的代码示例,哪怕只是改几个参数看看输出变化
  4. 带着问题读下一章:文本预处理是NLP的第一步,它要解决的核心问题是什么?
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐