第1章:引言(Introduction)
一、导读
1.1 本章学习目标
第1章是整本《语音与语言处理》的开篇之作,它为读者勾勒出自然语言处理(NLP)领域的全貌。在你深入学习每一个具体技术之前,有必要先理解这个领域究竟在研究什么、为什么重要、以及它是如何发展到今天的。
本章的核心学习目标包括:
- 理解自然语言处理的定义与范围:NLP 究竟研究什么问题?它与计算语言学、文本挖掘等相关领域有何区别与联系?
- 掌握 NLP 的主要任务类型:从文本分类、信息抽取到机器翻译、对话系统,NLP 的任务谱系是怎样的?
- 了解 NLP 的发展历程:从规则方法到统计方法再到深度学习方法,NLP 经历了哪些范式转变?
- 理解 NLP 的核心挑战:歧义性、上下文依赖、常识推理等问题为何使 NLP 如此困难?
- 认识 NLP 的实际应用:搜索引擎、智能助手、机器翻译等应用如何改变了我们的生活?
- 建立对 NLP 技术栈的整体认知:从数据预处理到模型训练再到部署,一个完整的 NLP 系统包含哪些环节?
1.2 为什么第一章如此重要
很多初学者急于跳入具体的算法细节——正则表达式怎么写、N-gram 怎么算、Transformer 怎么实现——而忽视了第一章的导论内容。这种想法是短视的。正如 CSAPP 的第一章带你漫游计算机系统一样,本章将帮助你建立对 NLP 领域的全局认知。
自然语言处理是人工智能最核心的分支之一。语言是人类智能的最高级表现形式之一,理解语言、生成语言、进行语言推理,这些能力长期以来被视为区分人类与机器的标志。从 1950 年图灵提出"机器能思考吗?"这个问题开始,NLP 就处于人工智能研究的前沿。
在过去的十年间,NLP 经历了前所未有的变革。2017 年 Transformer 架构的提出、2018 年 BERT 的发布、2020 年 GPT-3 的问世、2022 年 ChatGPT 的爆发,这些里程碑事件彻底改变了 NLP 的技术格局,也深刻影响了整个科技产业。理解这些发展的脉络和背后的技术逻辑,对于每一个从事或即将从事 NLP 相关工作的人来说都至关重要。
本章将为你提供一张"地图",帮助你在后续章节的深入学习中始终保持方向感。
1.3 核心问题引导
在阅读本章时,请带着以下问题思考:
什么是自然语言处理?它与计算语言学、人工智能的关系是什么?
NLP 有哪些主要的应用场景?这些应用背后的核心技术分别是什么?
为什么自然语言处理如此困难?语言中有哪些特殊的复杂性?
NLP 的发展经历了哪几个阶段?每个阶段的代表性方法是什么?
深度学习为什么能 revolutionize NLP?它相比传统方法有什么根本优势?
大语言模型(如 GPT-4)的出现对 NLP 领域意味着什么?
二、核心概念详解
2.1 什么是自然语言处理
自然语言处理(Natural Language Processing, NLP) 是研究计算机与人类语言交互的学科。它试图让计算机能够理解、解释和生成人类的自然语言(如中文、英文、法文等),从而实现人机之间的有效沟通。
NLP 处于语言学、计算机科学和人工智能的交叉地带。它与以下相关领域有密切联系:
- 计算语言学(Computational Linguistics):更偏重语言学理论,关注如何用计算方法建模语言现象
- 文本挖掘(Text Mining):从大规模文本数据中提取有价值的信息和模式
- 信息检索(Information Retrieval):从文档集合中查找满足用户需求的信息
- 人机交互(Human-Computer Interaction):研究人与计算机之间的交互方式
NLP 的核心任务可以分为两大类:
语言理解(Natural Language Understanding, NLU):从文本中提取语义信息。例如,判断一段文本的情感倾向、识别文本中的人名和地名、理解一个问题的含义。
语言生成(Natural Language Generation, NLG):将结构化数据或语义表示转换为自然语言文本。例如,将天气数据转换为天气预报文本、根据对话历史生成回复。
现代 NLP 系统通常需要同时具备理解和生成的能力。例如,机器翻译需要先理解源语言文本的含义,然后生成目标语言的对应表达。
2.2 NLP 的任务谱系
NLP 包含丰富的任务类型,它们构成了一个层次化的任务谱系:
2.2.1 基础文本处理
分词(Tokenization/Word Segmentation):将连续的文本切分为有意义的语言单元(词或子词)。对于英文等以空格分隔的语言,分词相对简单;对于中文等没有显式词边界的语言,分词是一个重要的基础任务。
# 英文分词示例
text = "Natural language processing is fascinating."
tokens = text.split()
# ['Natural', 'language', 'processing', 'is', 'fascinating.']
# 中文分词示例
import jieba
text = "自然语言处理很有趣"
tokens = jieba.lcut(text)
# ['自然语言', '处理', '很', '有趣']词性标注(Part-of-Speech Tagging):为每个词标注其词性(名词、动词、形容词等)。这是句法分析的基础。
词干提取与词形还原(Stemming & Lemmatization):将词还原为其基本形式。例如,"running" → "run","better" → "good"。
from nltk.stem import PorterStemmer, WordNetLemmatizer
stemmer = PorterStemmer()
print(stemmer.stem("running")) # run
print(stemmer.stem("better")) # better (词干提取不知道 better 的原形是 good)
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize("running", pos="v")) # run2.2.2 文本分类与分析
情感分析(Sentiment Analysis):判断文本表达的情感倾向(正面、负面、中性)。广泛应用于产品评论分析、社交媒体监控、舆情分析等场景。
主题分类(Topic Classification):将文本归类到预定义的主题类别中。例如,将新闻文章分类为体育、科技、政治等。
垃圾邮件检测(Spam Detection):识别不请自来的垃圾邮件。这是 NLP 最早的成功应用之一。
2.2.3 信息抽取
命名实体识别(Named Entity Recognition, NER):从文本中识别出人名、地名、机构名、日期等实体。
# 使用 spaCy 进行命名实体识别
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Apple was founded by Steve Jobs in Cupertino, California.")
for ent in doc.ents:
print(ent.text, ent.label_)
# Apple ORG
# Steve Jobs PERSON
# Cupertino GPE
# California GPE关系抽取(Relation Extraction):识别文本中实体之间的关系。例如,从"马云创办了阿里巴巴"中抽取关系(创始人, 马云, 阿里巴巴)。
事件抽取(Event Extraction):识别文本中发生的事件及其参与者、时间、地点等要素。
2.2.4 句法与语义分析
句法分析(Parsing):分析句子的语法结构,生成句法树。包括成分句法分析(Constituency Parsing)和依存句法分析(Dependency Parsing)。
语义角色标注(Semantic Role Labeling):识别句子中的谓词-论元结构,即"谁对谁做了什么"。
语义解析(Semantic Parsing):将自然语言转换为形式化的语义表示,如逻辑表达式或 SQL 查询。
2.2.5 生成类任务
机器翻译(Machine Translation):将一种语言的文本自动翻译为另一种语言。
文本摘要(Text Summarization):将长文本压缩为简短的摘要,保留核心信息。
问答系统(Question Answering):根据给定的上下文或知识库回答用户的问题。
对话系统(Dialogue Systems):与用户进行多轮自然语言交互。
2.3 NLP 的核心挑战
自然语言处理之所以困难,是因为人类语言具有独特的复杂性:
2.3.1 歧义性(Ambiguity)
歧义是自然语言最显著的特征之一。同一个词、短语或句子可能有多种含义:
词法歧义:一个词有多个含义。例如,"bank"可以指银行,也可以指河岸。"苹果"可以指水果,也可以指公司。
# 词义消歧示例
# "I deposited money at the bank." → bank = 金融机构
# "We sat on the bank of the river." → bank = 河岸句法歧义:一个句子可以有多种句法结构。经典的例子:"I saw the man with the telescope."——是我用望远镜看到了那个人,还是那个人拿着望远镜?
语义歧义:句子的语义解释依赖于上下文。"他给我打了一个电话"——"打"的含义需要根据上下文理解。
2.3.2 上下文依赖(Context Dependence)
语言的含义高度依赖上下文:
指代消解:"小明告诉小红他明天要出差。"——"他"指的是小明还是小红?
省略与隐含:"你去哪?""图书馆。"——"图书馆"是一个完整的回答,但省略了"我去"。
语用推理:"你能把窗户关上吗?"——字面上是一个询问能力的问题,但实际上是一个请求。
2.3.3 语言的创造性与开放性
人类语言是一个开放系统——人们可以创造和理解从未听过的新句子。这意味着 NLP 系统不能简单地记忆所有可能的句子,而必须掌握语言的生成规则。
2.3.4 常识推理
很多语言理解需要世界知识和常识推理:
"他把水倒在桌上,水洒了。"——理解"洒"需要知道水在桌面上的物理行为。
"医生开了药,病人吃了药,病好了。"——理解因果关系需要医学常识。
2.3.5 语言多样性
全球有超过 7000 种语言,每种语言都有独特的语法、词汇和文化背景。构建多语言 NLP 系统面临巨大挑战:
- 低资源语言缺乏足够的训练数据
- 不同语言的语法结构差异巨大
- 文化差异影响语义理解
2.4 NLP 的发展历程
NLP 的发展大致经历了三个阶段:
2.4.1 规则方法时代(1950s-1980s)
早期的 NLP 研究基于手工编写的规则。语言学家将语言的语法规则、词汇知识编码为计算机程序。
代表性工作:
- ELIZA(1966):Weizenbaum 开发的早期聊天程序,通过模式匹配模拟心理治疗师
- SHRDLU(1970):Winograd 开发的积木世界理解程序,能在限定域内理解自然语言指令
- 基于规则的机器翻译系统
优点:可解释性强,在限定域内效果不错
缺点:规则编写成本高、覆盖面窄、难以处理歧义和例外
# ELIZA 风格的简单模式匹配
import re
def eliza_response(user_input):
patterns = [
(r'I need (.*)', lambda m: f"Why do you need {m.group(1)}?"),
(r'I feel (.*)', lambda m: f"Why do you feel {m.group(1)}?"),
(r'Yes', "That's interesting. Can you tell me more?"),
(r'No', "Why not?"),
(r'(.*)', lambda m: "I see. Please continue."),
]
for pattern, response in patterns:
match = re.match(pattern, user_input, re.IGNORECASE)
if match:
if callable(response):
return response(match)
return response
return "I'm not sure I understand."2.4.2 统计方法时代(1990s-2010s)
随着大规模语料库的出现和计算能力的提升,统计方法逐渐成为主流。研究者开始使用概率模型从数据中自动学习语言模式。
代表性方法:
- N-gram 语言模型:用 n 个连续词的共现频率建模语言
- 隐马尔可夫模型(HMM):用于词性标注、命名实体识别等序列标注任务
- 条件随机场(CRF):更强大的序列标注模型
- 朴素贝叶斯分类器:用于文本分类
- 支持向量机(SVM):用于各种分类任务
- 统计机器翻译(SMT):基于平行语料库的翻译方法
优点:自动从数据中学习、覆盖面广、鲁棒性好
缺点:依赖手工特征工程、难以捕捉深层语义
# 简单的 N-gram 语言模型
from collections import Counter, defaultdict
class BigramLM:
def __init__(self):
self.counts = defaultdict(Counter)
self.context_counts = Counter()
def train(self, tokens):
for i in range(len(tokens) - 1):
self.counts[tokens[i]][tokens[i+1]] += 1
self.context_counts[tokens[i]] += 1
def probability(self, word, context):
if self.context_counts[context] == 0:
return 0
return self.counts[context][word] / self.context_counts[context]
# 训练
lm = BigramLM()
lm.train(["I", "love", "NLP", "I", "love", "coding"])
print(lm.probability("love", "I")) # 1.0
print(lm.probability("NLP", "love")) # 0.52.4.3 深度学习时代(2013-至今)
深度学习的引入彻底改变了 NLP 的技术格局。神经网络能够自动学习数据的分布式表示,避免了繁琐的特征工程。
关键里程碑:
- 2013 年 Word2Vec:Mikolov 等人提出高效的词向量学习方法,开启了 NLP 的表示学习时代
- 2014 年 Seq2Seq + Attention:编码器-解码器架构配合注意力机制,在机器翻译上取得突破
- 2017 年 Transformer:Vaswani 等人提出自注意力机制,完全抛弃了循环结构
- 2018 年 BERT:双向编码器表示,刷新了多项 NLP 任务的记录
- 2018-2020 年 GPT 系列:自回归语言模型展示了强大的文本生成能力
- 2020 年 GPT-3:1750 亿参数,展示了少样本学习和上下文学习的涌现能力
- 2022 年 ChatGPT:通过 RLHF 对齐技术,使大语言模型能够遵循指令
- 2023 年 GPT-4:多模态能力,在多项专业考试中达到人类水平
深度学习的核心优势:
- 自动特征学习:无需手工设计特征
- 分布式表示:语义相近的词在向量空间中距离相近
- 端到端训练:从输入到输出直接优化
- 强大的泛化能力:在大规模数据上训练后,可以迁移到各种下游任务
2.5 NLP 的技术栈
一个完整的 NLP 系统通常包含以下环节:
2.5.1 数据收集与预处理
- 文本清洗:去除噪声、HTML 标签、特殊字符
- 分词与标注:将文本切分为语言单元
- 数据增强:通过回译、同义词替换等方法扩充训练数据
2.5.2 特征工程与表示学习
- 传统方法:TF-IDF、词袋模型、n-gram 特征
- 深度学习:词嵌入(Word2Vec、GloVe)、上下文表示(BERT、GPT)
2.5.3 模型训练
- 选择模型架构:CNN、RNN、Transformer 等
- 定义损失函数和优化目标
- 训练策略:学习率调度、早停、正则化
2.5.4 评估与部署
- 评估指标:准确率、精确率、召回率、F1、BLEU、ROUGE 等
- 模型压缩:量化、剪枝、知识蒸馏
- 部署方案:API 服务、边缘部署、模型缓存
三、实战案例
3.1 简单的文本分类管道
下面是一个完整的文本分类示例,使用 TF-IDF 特征和逻辑回归分类器:
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# 准备数据
texts = [
"这部电影太好看了,剧情紧凑,演员演技在线",
"非常棒的体验,推荐给大家",
"浪费时间和金钱,剧情拖沓无聊",
"失望透顶,完全不值得一看",
"演员表演自然,故事感人至深",
"特效很震撼,但剧情有些薄弱",
"一部让人深思的好电影",
"烂片无疑,导演水平太差",
"温馨感人的故事,值得一看",
"节奏太慢,看得昏昏欲睡",
]
labels = [1, 1, 0, 0, 1, 1, 1, 0, 1, 0] # 1=正面, 0=负面
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
texts, labels, test_size=0.3, random_state=42
)
# 提取 TF-IDF 特征
vectorizer = TfidfVectorizer(max_features=1000)
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
# 训练分类器
classifier = LogisticRegression(random_state=42)
classifier.fit(X_train_tfidf, y_train)
# 预测和评估
y_pred = classifier.predict(X_test_tfidf)
print(classification_report(y_test, y_pred, target_names=["负面", "正面"]))
# 测试新文本
new_texts = ["这部电影真的很精彩", "完全看不下去"]
new_tfidf = vectorizer.transform(new_texts)
predictions = classifier.predict(new_tfidf)
for text, pred in zip(new_texts, predictions):
print(f"'{text}' → {'正面' if pred == 1 else '负面'}")3.2 基于预训练模型的文本分类
使用 Hugging Face Transformers 库进行更强大的文本分类:
from transformers import pipeline
# 使用预训练的情感分析管道
classifier = pipeline("sentiment-analysis")
texts = [
"This movie is absolutely wonderful!",
"Terrible experience, would not recommend.",
"The acting was decent but the plot was weak.",
]
results = classifier(texts)
for text, result in zip(texts, results):
print(f"Text: {text}")
print(f"Sentiment: {result['label']}, Score: {result['score']:.4f}")
print()
# 使用中文模型进行情感分析
# classifier_zh = pipeline("sentiment-analysis", model="uer/roberta-base-finetuned-jd-binary-chinese")
# result = classifier_zh("这个产品非常好用,推荐购买")3.3 简单的命名实体识别
使用 spaCy 进行信息抽取的完整示例:
import spacy
from collections import defaultdict
# 加载英文模型
nlp = spacy.load("en_core_web_sm")
def extract_entities(text):
doc = nlp(text)
entities = defaultdict(list)
for ent in doc.ents:
entities[ent.label_].append(ent.text)
return dict(entities)
# 测试文本
text = """
Apple Inc. was founded by Steve Jobs, Steve Wozniak, and Ronald Wayne
on April 1, 1976 in Los Altos, California. The company is currently
led by CEO Tim Cook, who took over from Jobs in 2011. Apple's
headquarters is in Cupertino, California.
"""
entities = extract_entities(text)
for label, values in entities.items():
print(f"{label}: {values}")
# 输出:
# ORG: ['Apple Inc.', 'Apple']
# PERSON: ['Steve Jobs', 'Steve Wozniak', 'Ronald Wayne', 'Tim Cook', 'Jobs']
# DATE: ['April 1, 1976', '2011']
# GPE: ['Los Altos', 'California', 'Cupertino', 'California']四、本章小结
本章为读者提供了自然语言处理领域的全景概览:
NLP 的定义与范围:自然语言处理研究计算机与人类语言的交互,涵盖语言理解和语言生成两大方向。
任务谱系:从基础的分词、词性标注,到高级的机器翻译、对话系统,NLP 拥有丰富的任务类型。
核心挑战:歧义性、上下文依赖、常识推理和语言多样性是 NLP 面临的主要困难。
发展历程:NLP 经历了规则方法→统计方法→深度学习方法三个阶段。每次范式转变都带来了性能的显著提升。
技术栈:一个完整的 NLP 系统包含数据预处理、特征工程、模型训练、评估与部署等环节。
未来方向:大语言模型正在重塑 NLP 的格局,多模态、长上下文、高效推理是重要的发展方向。
理解 NLP 的全貌,有助于你在后续章节中把握每个技术点在整体框架中的位置。从下一章开始,我们将深入具体的技术方法,从最基础的正则表达式开始,逐步构建完整的 NLP 知识体系。
五、思考与练习
思考题
试比较规则方法和统计方法在 NLP 中的优缺点。为什么统计方法最终取代了规则方法?
深度学习相比传统统计方法,在 NLP 中的核心优势是什么?它是否完全取代了传统方法?
选择你日常使用的一个 NLP 应用(如搜索引擎、智能助手、翻译软件),分析它可能用到了哪些 NLP 技术。
大语言模型(如 GPT-4)是否真正"理解"语言?请从技术和哲学两个角度讨论这个问题。
编程练习
使用 Python 和 NLTK/spaCy 库,对一段中文文本进行分词、词性标注和命名实体识别。分析结果中的错误。
实现一个简单的关键词提取系统:给定一篇新闻文章,提取最重要的 5 个关键词。可以使用 TF-IDF 或 TextRank 算法。
使用 ELIZA 的思路,实现一个基于规则的模式匹配聊天机器人。它能处理哪些类型的对话?局限性在哪里?