自然语言处理学习笔记NLP
本文介绍了自然语言处理(NLP)的学习路径,分为四个阶段:1) NLP基础理论,包括文本预处理、词向量表示和基础任务;2) 统计语言模型与传统机器学习方法,如N-gram、HMM、CRF和主题模型;3) 深度学习在NLP中的应用,涵盖RNN、Transformer和预训练语言模型;4) 进阶与前沿技术,包括大模型、多模态和低资源NLP。文章详细讲解了每个阶段的核心概念、算法原理和实现方法,并提供了
第一阶段:NLP基础理论与入门
理解NLP的基本概念、常见的任务以及入门级的工具和技术。
1. NLP概述与发展史
- 什么是NLP?
- 定义:计算机如何理解、解释和生成人类语言。
- 重要性:为什么NLP如此关键(信息检索、机器翻译、智能助手、情感分析等)。
- 交叉学科:与语言学、AI、机器学习、统计学、心理学的关系。
- NLP的主要挑战:
- 歧义性(词汇、语法、语义)。
- 语言的动态性(新词、俚语、演变)。
- 上下文依赖。
- 噪声(拼写错误、不完整句子)。
- 语言的多样性(方言、口语)。
- NLP发展简史:
- 早期基于规则的方法。
- 统计语言模型。
- 机器学习方法的兴起。
- 深度学习时代的到来。
2. 语言学基础
虽然不需要成为一个语言学家,但了解一些基本概念对理解NLP至关重要。
- 语音学与音系学: 发音、语音单元(音素)。
- 形态学: 词的构成(词根、词缀、屈折)。
- 句法学: 句子的结构(词性、短语、句子成分、语法规则)。
- 词性标注(Part-of-Speech Tagging, POS Tagging): 识别单词的语法功能(名词、动词、形容词等)。
- 语义学: 词语和句子的意义。
- 词义消歧(Word Sense Disambiguation, WSD): 确定一个词在特定上下文中的确切含义。
- 语用学: 语言在特定语境下的使用(说话人的意图、隐含意义)。
3. 文本预处理(Text Preprocessing)
这是NLP中最基础也是非常关键的一步,直接影响后续模型的性能。
- 文本清洗:
- 去除HTML标签、特殊字符、URL等。
- 处理标点符号。
- 大小写转换(统一为小写)。
- 分词(Tokenization): 将文本分割成有意义的单元(词、短语、标点)。
- 中文分词: HMM, CRF, 基于词典(Jieba)、基于深度学习。
- 英文分词: 空格分割、标点分割。
- 停用词去除(Stop Word Removal): 删除常见但意义不大的词(如"the", "a", "is")。
- 词干提取(Stemming): 将词语还原到其词根形式(如"running" -> "run")。
- 词形还原(Lemmatization): 将词语还原到其基本形式(字典形式),通常需要考虑词性(如"better" -> "good")。
4. 文本表示(Text Representation)
如何将文本信息转化为计算机可以理解的数值形式。
- 独热编码(One-Hot Encoding): 将每个词表示为一个高维稀疏向量。
- 词袋模型(Bag-of-Words, BoW): 统计词语在文本中出现的频率,不考虑顺序。
- TF (Term Frequency)。
- IDF (Inverse Document Frequency)。
- TF-IDF:衡量一个词在文档中的重要性。
- N-grams: 考虑连续N个词的组合,捕捉局部词序信息。
- Bigrams, Trigrams。
- 词嵌入(Word Embeddings): 将词语映射到低维稠密向量空间,捕捉词语之间的语义关系。
- Word2Vec:
- Continuous Bag-of-Words (CBOW)。
- Skip-gram。
- 负采样(Negative Sampling)。
- 分层Softmax(Hierarchical Softmax)。
- GloVe (Global Vectors for Word Representation): 基于全局共现矩阵。
- FastText: 考虑词的子词信息,对罕见词和形态丰富的语言效果更好。
- Word2Vec:
5. 基础NLP任务介绍与入门
- 文本分类(Text Classification): 将文本分配到预定义的类别中。
- 情感分析(Sentiment Analysis)。
- 垃圾邮件检测(Spam Detection)。
- 新闻主题分类。
- 命名实体识别(Named Entity Recognition, NER): 识别文本中的命名实体(人名、地名、组织名等)。
- 词性标注(POS Tagging): (已在语言学基础中提及,这里是作为任务)。
- 句法分析(Syntactic Parsing): 构建句子的语法结构树。
- 依存句法分析(Dependency Parsing)。
- 成分句法分析(Constituency Parsing)。
- 机器翻译(Machine Translation, MT): 将一种语言翻译成另一种语言。
- 文本摘要(Text Summarization): 生成文本的简短版本。
- 问答系统(Question Answering, QA): 回答用户提出的问题。
6. 常用NLP工具与库
- Python: NLP的主流语言。
- NLTK (Natural Language Toolkit): 经典的NLP库,包含大量文本处理工具、语料库和算法。
- spaCy: 高效、易用的NLP库,特别适合工业级应用。
- Gensim: 专注于主题建模和词向量。
- Scikit-learn: 机器学习库,包含文本特征提取(TF-IDF)和分类器。
- jieba (中文分词): 广泛使用的中文分词库。
学习建议:
- 动手实践: 尝试使用NLTK或spaCy对中文和英文文本进行预处理。
- 理解Word2Vec原理: 尝试自己实现一个简单的Word2Vec模型(即使是概念性的)。
- 分类任务入门: 使用Scikit-learn实现一个简单的文本分类器,如垃圾邮件检测。
例1 尝试使用NLTK或spaCy对中文和英文文本进行预处理。
安装必要的库。
# 安装核心库
pip install nltk spacy
# 对于中文 NLTK 风格的处理,通常需要 Jieba
pip install jieba
# 下载 spaCy 的英文小模型
python -m spacy download en_core_web_sm
# 下载 spaCy 的中文小模型
python -m spacy download zh_core_web_sm
在 Python 中首次运行 NLTK 代码时,还需要下载一些数据包:
import nltk
# 只需运行一次
nltk.download('punkt') # 用于分词
nltk.download('stopwords') # 用于停用词
nltk.download('wordnet') # 用于词形还原
nltk.download('omw-1.4') # WordNet 的依赖
英文文本预处理
主要步骤: 小写化 -> 分词 -> 去除标点和数字 -> 去除停用词 -> 词干提取/词形还原。
输入文本:text_en = "Trying out NLTK and spaCy! It's amazing for NLP tasks, running on 2023 data. Better than before."
方法 1: 使用 NLTK (传统、更底层的控制)
NLTK 提供了很多独立的工具,你需要自己把它们串起来组成一个管道(Pipeline)。
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, WordNetLemmatizer
import string
import re
# 确保已下载必要数据 (如果上面已经运行过,这里可以注释掉)
# nltk.download('punkt')
# nltk.download('stopwords')
# nltk.download('wordnet')
# nltk.download('omw-1.4')
text_en = "Trying out NLTK and spaCy! It's amazing for NLP tasks, running on 2023 data. Better than before."
print(f"原始文本:\n{text_en}\n")
# --- NLTK 预处理管道 ---
# 1. 小写化 (Lowercase)
text_lower = text_en.lower()
# 2. 分词 (Tokenization)
tokens = word_tokenize(text_lower)
print(f"分词结果:\n{tokens}\n")
# 3. 加载停用词和标点符号
stop_words = set(stopwords.words('english'))
punctuation = set(string.punctuation)
# 4. 清洗:去除停用词、标点符号和纯数字
# 这里的逻辑是:如果token不是标点 AND 不是停用词 AND 是字母开头(去纯数字)
cleaned_tokens = [
token for token in tokens
if token not in punctuation
and token not in stop_words
and re.match(r'[a-zA-Z]', token)
]
print(f"清洗后 (去除停用词/标点/数字):\n{cleaned_tokens}\n")
# 5a. 词干提取 (Stemming) - 比较激进,截取词根
stemmer = PorterStemmer()
stemmed_tokens = [stemmer.stem(token) for token in cleaned_tokens]
print(f"词干提取 (Stemming):\n{stemmed_tokens}\n")
# 注意观察: 'amazing' -> 'amaz', 'running' -> 'run', 'tasks' -> 'task'
# 5b. 词形还原 (Lemmatization) - 更温和,还原为字典形式
# 注意:NLTK的Lemmatizer默认认为词性是名词(Noun)。
# 要准确还原动词(如 running -> run),需要先进行词性标注(POS Tagging),
# 这里为了简化第一阶段的演示,暂时不加入POS Tagging。
lemmatizer = WordNetLemmatizer()
lemmatized_tokens_noun = [lemmatizer.lemmatize(token) for token in cleaned_tokens]
# 尝试告诉它这些是动词 (Verb)
lemmatized_tokens_verb = [lemmatizer.lemmatize(token, pos='v') for token in cleaned_tokens]
print(f"词形还原 (默认名词):\n{lemmatized_tokens_noun}")
print(f"词形还原 (指定动词):\n{lemmatized_tokens_verb}\n")
# 注意观察:
# 默认下 'running' 还是 'running' (因为它也可以是名词)
# 指定动词后 'running' -> 'run', ' trying' -> 'try'
方法 2: 使用 spaCy (现代、工业级、一体化)
spaCy 的设计理念是“开箱即用”,它在后台自动为你完成了分词、词性标注、依赖分析等,你只需要根据属性进行过滤即可。它的词形还原(Lemmatization)效果通常比未配合 POS 的 NLTK 要好。
import spacy
# 加载英文小模型
# 需要先运行: python -m spacy download en_core_web_sm
nlp = spacy.load("en_core_web_sm")
text_en = "Trying out NLTK and spaCy! It's amazing for NLP tasks, running on 2023 data. Better than before."
print(f"原始文本:\n{text_en}\n")
# --- spaCy 预处理 ---
# 1. 处理文本 (这一步已经完成了分词、标注等所有工作)
doc = nlp(text_en)
# 2. 遍历 Token 并清洗
# spaCy 的 token 对象有很多属性:
# token.text: 原始文本
# token.lemma_: 词形还原后的形式 (自动小写化了)
# token.is_stop: 是否是停用词
# token.is_punct: 是否是标点
# token.is_alpha: 是否也是字母组成
# token.like_num: 是否像数字
cleaned_lemmas = []
for token in doc:
# 过滤条件:不是停用词 且 不是标点 且 是字母组成的(去除数字)
if not token.is_stop and not token.is_punct and token.is_alpha:
cleaned_lemmas.append(token.lemma_)
print("spaCy 处理结果 (清洗+自动词形还原):")
print(cleaned_lemmas)
# 注意观察: spaCy 自动正确处理了 'Trying'->'try', 'running'->'run', 'tasks'->'task'
# 并且去掉了 'It's', 'for', 'on', 'than', 'before' 等停用词
第二部分:中文文本预处理
主要挑战: 中文没有空格来分隔词语,因此分词 (Tokenization) 是最关键的一步。
输入文本:text_zh = "这是一个关于自然语言处理(NLP)的中文例子!我们在2023年学习如何使用NLTK和spaCy进行数据清洗,感觉非常棒。"
方法 1: NLTK 在中文处理中的局限性与替代方案 (Jieba)
关键点:NLTK 自身的 tokenizer 无法正确处理没有空格的中文。
如果你尝试用 NLTK 的 word_tokenize 处理中文,它会把整句话当成一个词,或者按字切分(取决于具体实现),这通常不是我们想要的。
中文分词的业界标准是 jieba (结巴分词)。 在“NLTK风格”的管道中,我们通常用 Jieba 替代 NLTK 的分词器,但可以继续使用 NLTK 的停用词列表功能(如果你有中文停用词表的话)。
import jieba
import re
text_zh = "这是一个关于自然语言处理(NLP)的中文例子!我们在2023年学习如何使用NLTK和spaCy进行数据清洗,感觉非常棒。"
print(f"原始中文:\n{text_zh}\n")
# --- 中文预处理 (Jieba 方式) ---
# 准备一个简单的中文停用词表 (实际项目中需要加载一个完整的停用词文件)
stop_words_zh = {"是", "一个", "关于", "的", "我们", "在", "如何", "使用", "进行", "了", "非常"}
punctuation_zh = set("!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏.")
# 1. 分词 (使用 jieba 精确模式)
# jieba.cut 返回的是一个生成器
tokens_zh = list(jieba.cut(text_zh, cut_all=False))
print(f"Jieba 分词结果:\n{tokens_zh}\n")
# 2. 清洗:去除停用词、标点、纯数字和空白字符
cleaned_tokens_zh = []
for token in tokens_zh:
# 去除两端空白
token = token.strip()
# 过滤条件:
# 长度大于0 且 不是标点 且 不是停用词 且 不是纯数字(使用正则)
if (len(token) > 0 and
token not in punctuation_zh and
token not in stop_words_zh and
not re.match(r'^[0-9]+$', token)):
cleaned_tokens_zh.append(token)
print(f"Jieba 清洗后:\n{cleaned_tokens_zh}\n")
# 注意:中文通常不做“词干提取”或“词形还原”,因为中文的形态变化很少。
方法 2: 使用 spaCy 中文模型
spaCy 的中文模型(zh_core_web_sm/md/lg)内部其实集成了类似的分词算法(有时直接就是包装了 Jieba 或类似机制),提供了统一的 API 体验。
import spacy
# 加载中文小模型
# 需要先运行: python -m spacy download zh_core_web_sm
try:
nlp_zh = spacy.load("zh_core_web_sm")
except OSError:
print("错误:请先下载中文模型: python -m spacy download zh_core_web_sm")
exit()
text_zh = "这是一个关于自然语言处理(NLP)的中文例子!我们在2023年学习如何使用NLTK和spaCy进行数据清洗,感觉非常棒。"
print(f"原始中文:\n{text_zh}\n")
# --- spaCy 中文预处理 ---
# 1. 处理文本
doc_zh = nlp_zh(text_zh)
# 2. 遍历与清洗
# spaCy 中文模型的 token.is_stop 已经包含了一些内置的中文停用词
cleaned_tokens_spaCy_zh = []
for token in doc_zh:
# 打印看看 spaCy 是怎么识别的
# print(f"Text: {token.text}, Is_stop: {token.is_stop}, Is_punct: {token.is_punct}, Like_num: {token.like_num}")
# 过滤条件:不是停用词 且 不是标点 且 不是数字 且 去除空白后不为空
if not token.is_stop and not token.is_punct and not token.like_num and token.text.strip():
# 对于中文,token.lemma_ 通常就是 token.text 本身
cleaned_tokens_spaCy_zh.append(token.text)
print("spaCy 中文处理结果:")
print(cleaned_tokens_spaCy_zh)
总结:
-
NLTK:像一个工具箱,你需要自己选择工具(分词器、停用词表、词干提取器)并组装它们。对英文支持很好,但对中文分词基本无能为力(需要配合 Jieba)。
-
spaCy:像一条自动化流水线。加载模型后,它自动完成大部分工作。API 统一,对多语言支持较好(只要有对应的模型),并且在词形还原等方面通常更准确。
第二阶段:统计语言模型与传统机器学习方法
这个阶段将深入学习如何使用统计方法和机器学习算法来解决NLP任务。
1. 统计语言模型(Statistical Language Models, SLMs)
-
N-gram模型:
- 最大似然估计(Maximum Likelihood Estimation, MLE)。
- 平滑技术(Smoothing):解决零概率问题。
- 加一平滑(Add-one Smoothing)。
- Lidstone平滑。
- Kneser-Ney平滑。
- 困惑度(Perplexity):衡量语言模型的好坏。
| 知识点 | 描述 | 示例/公式 |
| 定义 | 文本中连续出现的 N 个项目的序列(通常是单词)。N-gram 模型基于这些序列的统计频率来预测下一个词或评估句子概率。 |
N=1 (Unigram): "我", "爱", "NLP" N=2 (Bigram): "我爱", "爱NLP" N=3 (Trigram): "我爱NLP" |
| 核心思想 | 1. 链式法则: 计算整个句子概率 | |
| 参数估计 (MLE) | 使用最大似然估计,即通过语料库中的词频计数来估算条件概率。 | |
| 数据稀疏问题 | 在训练集中未出现过的 N-gram 在测试集中出现时,其概率为零。这会导致整个句子概率为零,不合理。 | 语料中从未出现 "美丽的红色法拉利" 这个 Trigram,模型会给它赋予 0 概率。 |
| 平滑技术 | 解决零概率问题,将观察到的 N-gram 的部分概率分给未观察到的 N-gram,使所有 N-gram 都有非零概率。 |
1. 加一平滑 (Add-1): 2. 加 k 平滑 (Add-k): 3. 回退 (Backoff): 高阶 N-gram 不存在时回退到低阶。 4. 插值 (Interpolation): 混合使用不同阶 N-gram 的概率。 |
| 模型评估 | 困惑度 (Perplexity, PPL):衡量模型在面对新数据时的“不确定性”或“惊讶”程度。困惑度越低,模型越好。 |
直观理解:模型预测下一个词时平均有多少个“可能”的选择。 |
| 优点 |
1. 简单直观: 易于理解和实现。 2. 训练速度快: 基于计数统计。 3. 特定任务有效: 适用于短文本、联想、拼写检查等。 |
- |
| 缺点 |
1. 长距离依赖: 无法捕捉超出 N-1 范围的上下文信息。 2. 数据稀疏: 严重依赖语料库大小,N 越大问题越严重。 3. 维度灾难: N 增大时参数空间爆炸,内存消耗大。 4. 缺乏语义泛化: 将词视为独立符号,不理解词之间的语义关系。 |
"The boy...is smart" (N=3 无法关联 boy 和 is) 在语料中没见过 "蓝色 大象" 无法估计其概率。 |
| N 的选择 | 通常在 1 到 5 之间。N 越大,模型能捕获的上下文信息越多,但数据稀疏和计算成本也越高。常用的有 Bigram (N=2) 和 Trigram (N=3)。 | - |
| 应用场景 |
1. 语音识别: 辅助声学模型识别词序列。 2. 机器翻译: 早期用于评估翻译结果流畅度。 3. 输入法/自动补全: 预测下一个词。 4. 拼写纠错: 评估修正后词序列的合理性。 5. 简单的文本生成: 基于概率选择下一个词。 |
1. 说 "你好" 后,输入法联想 "世界" 2. "我爱" 后,模型预测下一个词可能是 "你", "中国", "学习" 等。 |
-
隐马尔可夫模型(Hidden Markov Models, HMM):
- 用于词性标注、命名实体识别。
- 三个基本问题:评估、解码、学习。
- 前向算法、后向算法、维特比算法。
| 知识点 | 描述 | 示例/公式 |
| 定义 | 一种统计模型,用于描述一个含有隐藏状态的随机过程。这些隐藏状态不能直接观察到,但它们会通过可观察的输出符号表现出来。HMM 的核心在于假设观察序列的生成过程是由一个隐藏的马尔可夫链控制的。 |
天气与活动: 隐藏状态:晴天、阴天、雨天 (不可直接观测) 观察值:散步、购物、打扫 (可观测) HMM 试图通过观测到的活动序列来推断出隐藏的天气序列。 |
| 核心要素 (HMM 的五元组 λ) |
HMM 由五个要素(即模型参数集合λ=(A,B,Pi))定义: 1. 状态集合 (States S): 隐藏状态的有限集合。 2. 观察值集合 (Observations V): 可能的观察符号的有限集合。 3. 初始状态概率 (Start Probabilities pi): 模型在时间 t=1 时处于每个隐藏状态的概率。 4. 状态转移概率 (Transition Probabilities A): 从一个隐藏状态转移到另一个隐藏状态的概率。 5. 发射概率 (Emission Probabilities B): 在给定某个隐藏状态下,观察到某个特定符号的概率。 |
1. 状态 S: {High, Low} (股票涨跌) 2. 观察 V: {Up, Down, Flat} (股票收盘价表现) 3. 初始 p: pi_H=0.6, pi_L=0.4(第一天高位或低位)
5. 发射 B: $P(Up |
| 马尔可夫假设 |
1. 齐次马尔可夫性: 任意时刻 t 的状态只依赖于前一时刻 t-1 的状态。 2. 观测独立性: 任意时刻的观测值只依赖于该时刻的隐藏状态,与其他隐藏状态和观测值都无关。 |
齐次: $P(s_t |
| HMM 的三个基本问题 | 围绕 HMM 有三个核心的计算问题,也是 HMM 应用的基础: | - |
| 1. 评估问题 (Evaluation) | **给定模型 $\lambda=(A, B, \pi)$ 和一个观察序列 $O=(o_1, o_2, ..., o_T)$,计算这个观察序列出现的概率 $P(O |
\lambda)$。** 用于衡量一个模型对某个观察序列的匹配程度。 算法: 前向算法 (Forward Algorithm) 和 后向算法 (Backward Algorithm)。 |
| 2. 解码问题 (Decoding) |
给定模型 λ=(A, B, \pi) 和一个观察序列 O=(o_1, o_2, ..., o_T),找到最有可能生成这个观察序列的隐藏状态序列 S=(s_1, s_2, ..., s_T)。 这是 HMM 最常用的应用之一,例如词性标注、语音识别中的对齐。 算法: 维特比算法 (Viterbi Algorithm)。 |
场景 (词性标注): 给定句子 "I saw a saw",已知词性标注 HMM,找到最可能的词性序列:("I", "PRP"), ("saw", "VBD"), ("a", "DT"), ("saw", "NN")。 |
| 3. 学习问题 (Learning) | 给定一个观察序列 O=(o_1, o_2, ..., o_T) (或多个观察序列),调整模型参数 λ=(A, B, \pi),使得 $P(O\lambda)$ 最大化。 |
这是 HMM 的训练过程,通常没有直接的解析解,需要迭代优化。 算法: Baum-Welch 算法 (期望最大化 EM 算法的一种特例)。 |
| HMM 在 NLP 中的应用 |
1. 词性标注 (POS Tagging): 隐藏状态是词性,观察值是单词。 2. 命名实体识别 (NER) (早期): 隐藏状态是实体标签(如 B-PER, I-PER, O),观察值是单词。 3. 语音识别: 隐藏状态是音素,观察值是语音信号特征。 4. 中文分词 (早期): 隐藏状态是字在词中的位置(B-开始,M-中间,E-结束,S-单字词),观察值是汉字。 5. 序列标注任务: 任何需要从序列观测中推断隐藏序列的任务。 |
POS Tagging: 隐藏状态: {NN, VBD, DT, JJ, ...} 观测: {The, dog, barks, loudly, ...} |
| 优点 |
1. 模型成熟,理论基础扎实。 2. 参数较少,易于实现。 3. 维特比算法高效,解码速度快。 4. 适用于多种序列标注任务。 |
- |
| 缺点 |
1. 马尔可夫假设过于严格: a. 观测独立性假设:实际中观测值可能相互关联。 b. 齐次马尔可夫性:当前状态可能依赖于更早的历史。 2. 单向模型,无法利用未来信息 (Left-to-Right Model): 只能从左到右处理序列,不能利用后面的上下文信息。 3. 只能进行判别式学习的近似: 学习过程是生成式的 (最大化联合概率 $P(O,S)$),但很多任务更需要判别式学习 (最大化条件概率 $P(SO)$)。 4. 特征工程受限: 难以整合复杂的、长距离的特征。 |
-
条件随机场(Conditional Random Fields, CRF):
- 比HMM更强大的序列标注模型,解决HMM的独立性假设问题。
- 作为特征的函数。
- 用于NER、POS Tagging等。
| 知识点 | 描述 (专注于 NLP 应用) |
| 基本概念 | |
| 定义 | 条件随机场 (CRF) 是一种用于序列标注和分割的判别式概率模型。在 NLP 中,它建模了给定观测序列 (如句子中的词语) $X$ 的条件下,标记序列 (如词性、实体标签) $Y$ 的条件概率 $P(Y |
| 特点 | 判别式模型、无向图模型,能有效利用丰富的上下文特征,解决了传统生成式模型(如 HMM)的独立性假设问题,以及判别式局部归一化模型(如 MEMM)的标注偏置问题。 |
| CRF 在 NLP 中的优势 | |
| 特征灵活性 | 能够融合任意数量和类型的特征,包括词汇特征、上下文特征、形态特征、外部知识特征等,这些特征对 NLP 任务至关重要。 |
| 全局归一化 | 解决了 MEMM 的“标注偏置”问题,在预测时考虑整个序列的上下文信息,使得标记序列整体上更合理。 |
| 解决长距离依赖 | 能够更好地处理序列中的长距离依赖关系,这在许多 NLP 任务(如命名实体识别)中非常有用。 |
| 模型结构 (NLP 视角) | |
| 线性链 CRF | 在 NLP 中最常用,假设文本序列中的每个词语与其对应的标签以及相邻标签之间存在依赖关系,形成线性链结构。 |
| 特征函数 (针对 NLP) |
通常包含: - 状态特征函数:描述当前词语 $x_i$ 和当前标签 $y_i$ 之间的关系 (如 "如果词语是'北京',标签是'地名'" )。 - 转移特征函数:描述当前标签 $y_i$ 和前一个标签 $y_{i-1}$ 以及观测序列 $X$ 的关系 (如 "如果前一个标签是'形容词',当前标签是'名词'" )。 这些特征可以捕捉词性、词形、词典匹配、前后缀等信息。 |
| 与 HMM/MEMM 的对比 (NLP 视角) | |
| HMM (隐马尔可夫模型) | 生成式模型,假设观测值只依赖于当前状态,状态转移也只依赖于前一状态。在 NLP 中,对上下文特征利用不足,且有严格的独立性假设。 |
| MEMM (最大熵马尔可夫模型) | 判别式模型,考虑了更丰富的特征,但由于局部归一化,易产生“标注偏置”,即倾向于选择出度较少的路径。 |
| CRF | 判别式模型,通过全局归一化克服了 MEMM 的标注偏置问题,能够更好地利用整个观测序列的上下文信息。 |
| 关键算法 | |
| 学习算法 | 最大化条件对数似然函数,常用优化方法如 L-BFGS(受限内存BFGS算法)。 |
| 预测/解码算法 | 维特比算法:用于寻找给定观测序列下,具有最大条件概率的标记序列 $Y^*$。 |
| 主要 NLP 应用 | |
| 命名实体识别 (NER) | 识别文本中的专有名词(如人名、地名、组织名),是最典型的 CRF 应用之一。 |
| 词性标注 (POS Tagging) | 标注文本中每个词语的词性(如名词、动词、形容词)。 |
| 中文分词 | 将连续的汉字序列切分成词语,可以看作一个序列标注问题。 |
| 句法分析 (浅层) | 如组块分析(Chunking),识别短语块。 |
| 其他 | 槽填充 (Slot Filling)、信息抽取 (Information Extraction) 等。 |
| 实现工具 | |
| CRF++ | 最流行且高效的 CRF 开源工具包,广泛用于 NLP 任务。 |
| sklearn-crfsuite | 基于 Python scikit-learn 接口的 CRF 库,易于与 Python 生态系统集成。 |
2. 传统机器学习模型在NLP中的应用
-
朴素贝叶斯(Naive Bayes):
- 文本分类(如垃圾邮件检测)。
- 多项式模型、伯努利模型。
-
支持向量机(Support Vector Machines, SVM):
- 强大的文本分类器。
- 核函数。
-
逻辑回归(Logistic Regression):
- 常用的二分类模型,也可用于文本分类。
3. 概率图模型(Probabilistic Graphical Models)
- 贝叶斯网络(Bayesian Networks):
- 马尔可夫随机场(Markov Random Fields): (CRF的基础)
4. 主题模型(Topic Models)
- 潜在语义分析(Latent Semantic Analysis, LSA): 基于SVD。
- 潜在狄利克雷分配(Latent Dirichlet Allocation, LDA):
- 生成模型,将文档看作是词语的混合,主题是词语的混合。
- Gibbs Sampling等推断方法。
- 应用:文档聚类、信息检索。
学习建议:
- 深入理解HMM和CRF: 尝试用代码实现一个简单的HMM用于POS Tagging。
- 掌握TF-IDF与分类器结合: 使用Scikit-learn实现基于TF-IDF和SVM/Naive Bayes的文本分类。
- 了解LDA: 使用Gensim库尝试对一组文档进行主题建模,并分析主题。
第三阶段:深度学习在NLP中的应用
这是目前NLP最活跃、最主流的领域。
1. 深度学习基础回顾
- 神经网络(Neural Networks)。
- 反向传播算法(Backpropagation)。
- 激活函数(Activation Functions)。
- 损失函数(Loss Functions)。
- 优化器(Optimizers): SGD, Adam, RMSprop。
- 正则化(Regularization): Dropout, L2。
2. 循环神经网络(Recurrent Neural Networks, RNNs)
- 为什么需要RNN? 处理序列数据。
- 基本RNN结构: 隐藏状态。
- RNN的局限性: 梯度消失/爆炸问题。
- 长短期记忆网络(Long Short-Term Memory, LSTM):
- 门控机制(输入门、遗忘门、输出门)。
- 细胞状态。
- 门控循环单元(Gated Recurrent Unit, GRU):
- 比LSTM结构更简单。
- RNN/LSTM/GRU的应用:
- 序列标注(NER, POS Tagging)。
- 文本生成。
- 机器翻译(早期)。
- 情感分析。
3. 卷积神经网络(Convolutional Neural Networks, CNNs)
- CNN在NLP中的应用:
- 文本分类(通过卷积和池化提取文本特征)。
- 字符级CNN。
4. Transformer 模型与自注意力机制(Self-Attention)
- 为什么需要Attention? 解决RNN的长距离依赖问题,提高并行化。
- 自注意力机制:
- Query, Key, Value。
- Scaled Dot-Product Attention。
- 多头自注意力(Multi-Head Attention)。
- Transformer架构:
- Encoder-Decoder结构。
- 位置编码(Positional Encoding)。
- 残差连接(Residual Connections)。
- 层归一化(Layer Normalization)。
- Transformer的优势: 强大的并行计算能力,有效的长距离依赖捕捉。
5. 预训练语言模型(Pre-trained Language Models, PLMs)
- 背景: 从头训练大型模型成本高昂,利用大规模无标注数据预训练,再微调到下游任务。
- BERT (Bidirectional Encoder Representations from Transformers):
- 基于Transformer的Encoder。
- 预训练任务:Masked Language Model (MLM), Next Sentence Prediction (NSP)。
- 双向上下文理解。
- 微调(Fine-tuning)策略。
- GPT (Generative Pre-trained Transformer) 系列 (GPT-2, GPT-3, GPT-4):
- 基于Transformer的Decoder。
- 自回归(Autoregressive)的生成模型。
- 强大的文本生成能力。
- Few-shot / Zero-shot learning。
- 其他重要的PLMs:
- RoBERTa, XLNet, ELECTRA, T5, BART。
- PLMs在下游任务上的应用:
- 文本分类、NER、QA、摘要、翻译等。
- Prompt Engineering: 如何设计有效的Prompt来指导PLM完成任务。
6. 深度学习框架与库
- TensorFlow:
- PyTorch: 目前在学术界和研究中更受欢迎。
- Hugging Face Transformers: 提供了大量预训练模型和易于使用的API,是学习和应用PLMs的必备工具。
学习建议:
- 实现RNN/LSTM: 尝试用PyTorch或TensorFlow实现一个简单的RNN或LSTM模型。
- 理解Transformer的Attention机制: 仔细阅读Transformer的论文,理解其核心思想。
- Hugging Face上手: 学习使用Hugging Face Transformers库来加载和使用BERT、GPT等预训练模型,并进行微调。
- 尝试Prompt Engineering: 探索如何使用Prompt来解决一些NLP任务。
第四阶段:进阶与前沿NLP技术
在这个阶段,根据自己的兴趣和研究方向,深入探索更具体的领域。
1. 生成式AI与大模型
- 大型语言模型(LLMs)的原理与应用。
- Prompt Engineering 的进阶技巧。
- 指令微调(Instruction Tuning)。
- RLHF (Reinforcement Learning from Human Feedback)。
- 多模态模型(Multimodal Models): 结合文本、图像、音频等。
2. 特定NLP任务的深度研究
- 机器翻译(MT):
- 神经机器翻译(NMT)的演进。
- 评估指标(BLEU, ROUGE)。
- 文本摘要(Text Summarization):
- 抽取式摘要(Extractive Summarization)。
- 生成式摘要(Abstractive Summarization)。
- 问答系统(QA):
- 抽取式QA。
- 生成式QA。
- 知识图谱QA。
- 对话系统(Dialogue Systems):
- 任务型对话系统。
- 开放域对话系统。
- 对话管理(Dialogue Management)。
- 信息抽取(Information Extraction, IE):
- 关系抽取(Relation Extraction)。
- 事件抽取(Event Extraction)。
- 文本生成(Text Generation):
- 故事生成、代码生成、诗歌生成等。
- 自然语言理解(Natural Language Understanding, NLU)与自然语言生成(Natural Language Generation, NLG)。
- 低资源NLP(Low-Resource NLP): 如何在数据稀缺的情况下进行NLP任务。
- 跨语言NLP(Cross-lingual NLP):
3. NLP的评估与度量
- 不同任务的常用评估指标: 准确率、精确率、召回率、F1分数、BLEU、ROUGE、METEOR等。
- 人类评估的重要性。
4. NLP伦理与偏见
- 模型中的偏见来源(数据、算法)。
- 如何检测和缓解模型偏见。
- NLP的负责任使用。
5. 常用研究数据集
- GLUE Benchmark, SuperGLUE: 用于评估通用语言理解模型。
- SQuAD: 用于问答任务。
- WikiText-103: 用于语言模型。
- IMDB, AG News: 用于文本分类。
学习建议:
- 选择一个感兴趣的子领域: 深入阅读相关的论文和综述。
- 参与Kaggle等比赛: 实践和提升解决实际问题的能力。
- 阅读顶会论文: ACL, EMNLP, NAACL, ICLR, NeurIPS 等。
- 关注最新的技术进展: 了解ChatGPT等大模型的最新动态。

更多推荐




所有评论(0)