【自然语言处理】文本规范化知识点梳理与习题总结
目录
一、正则表达式:文本模式匹配的 “精准工具”
1. 核心语法要素
(1)字符类:定义 “能匹配哪些字符”
(2)量词:定义 “匹配次数”
(3)匹配范围:完全匹配 vs 部分匹配
2. 应用场景
二、BPE 分词:子词粒度的 “平衡艺术”
1. 核心原理:从字符到子词的迭代合并
(1)分词流程(以“together” 为例)
(2)词表构建逻辑
2. BPE 的核心特性
三、文本预处理:让文本 “更易被模型理解”
1. 词干还原(Stemming)
2. 词目还原(Lemmatization)
3. 大小写折叠(Case Folding)
4. 三者对比
四、习题整理
五、习题解答
六、总结
一、正则表达式:文本模式匹配的 “精准工具”
正则表达式(Regex)通过预定义语法描述字符串的 “合法模式”,是 NLP 中文本清洗、特定格式提取(如缩写、日期、邮箱)的核心工具。
1. 核心语法要素
(1)字符类:定义 “能匹配哪些字符”
-
\w
(单词字符)- 匹配范围:大小写字母(
a-z
/A-Z
)、数字(0-9
)、下划线(_
),等价于[a-zA-Z0-9_]
。
- 匹配范围:大小写字母(
-
[a-z]
(小写字母集)- 匹配范围:仅
a-z
的小写字母,不包含数字、大写字母或符号。 - 扩展:若需匹配大小写,需写为
[a-zA-Z]
;若排除某些字母,用[^...]
(如[^aeiou]
匹配非元音字母)。
- 匹配范围:仅
-
\d
(数字字符)- 匹配范围:
0-9
的数字,等价于[0-9]
。
- 匹配范围:
(2)量词:定义 “匹配次数”
-
*
(零次或多次)- 逻辑:允许前面的元素 “出现 0 次、1 次或多次”,包含 “空匹配”。
- 示例:
[a-z]*
可匹配""
(空)、"a"
、"abc"
。
-
+
(一次或多次)- 逻辑:要求前面的元素 “至少出现 1 次”,不允许空匹配。
- 示例:
[a-z]+
必须匹配"a"
、"abc"
等,不匹配""。
(3)匹配范围:完全匹配 vs 部分匹配
- 完全匹配:正则表达式需覆盖字符串 “所有字符”,从首字符到尾字符无遗漏。
- 关键:默认正则可匹配 “部分片段”,若需完全匹配,需隐含 “从头到尾” 的约束(或显式用
^
(开头)和$
(结尾)锚点)。
- 关键:默认正则可匹配 “部分片段”,若需完全匹配,需隐含 “从头到尾” 的约束(或显式用
2. 应用场景
- 文本清洗:剔除不符合格式的字符串;
- 模式提取:提取特定格式文本(如英文缩写、日期、邮箱);
- 规则验证:检查字符串是否符合预设格式。
二、BPE 分词:子词粒度的 “平衡艺术”
BPE(Byte Pair Encoding)是解决 “词表过大” 与 “未登录词(OOV)” 矛盾的子词分词算法,被 GPT、BERT 等大模型广泛采用。
1. 核心原理:从字符到子词的迭代合并
(1)分词流程(以“together” 为例)
给定词表:{_, t, o, g, e, h, r, he, the, er, r_, er_, to, ge, get}
,分词遵循 “最长子词匹配”:
- 拆分目标词:
together
→ 初始字符序列(含词尾_
):t o g e t h e r _
; - 从左到右找最长子词:
- 首字符
t
:检查词表中以t
开头的最长子词→to
(词表存在),匹配to
,剩余序列:g e t h e r _
; - 剩余首字符
g
:检查最长子词→ge
(词表存在),匹配ge
,剩余序列:t h e r _
; - 剩余首字符
t
:后续字符为h e
,组合the
(词表存在),匹配the
,剩余序列:r _
; - 剩余
r _
:词表中r_
存在,直接匹配;
- 首字符
- 最终分词结果:
to ge the r_
。
(2)词表构建逻辑
- 初始化:词表为 “所有单个字符 + 词尾标记
_
”; - 迭代合并:统计语料中 “相邻子词对” 的频率,每次合并最高频对为新子词(如
t
和o
高频→合并为to
),直至达到预设词表大小; - 核心:子词的 “频率” 决定合并优先级,高频组合优先成为长子词。
2. BPE 的核心特性
- 词表依赖性:词表越小,子词越短(接近字符);词表越大,子词越长(接近完整词)。
- 训练语料依赖性:词表基于训练语料的子词频率构建,对 “训练外文本” 分词时,因子词频率未知,易拆分为更短的子词。
- OOV 处理优势:稀有词可拆分为常见子词(如
"fluffernutter"
拆为"fluff"+"er"+"nut"+"ter"
),避免词表膨胀。
3. 应用场景
- 大模型预处理:平衡词表大小与语义完整性(如 GPT 用 BPE 处理多语言文本);
- 低资源语言处理:通过子词复用减少稀有词影响;
- OOV 问题解决:将未见过的词拆分为已知子词,避免模型 “未知 token” 错误。
三、文本预处理:让文本 “更易被模型理解”
文本预处理是 NLP 流水线的第一步,通过标准化文本格式减少噪声,有三种核心技术:词干还原、词目还原、大小写折叠。
1. 词干还原(Stemming)
- 定义:通过简单规则截断词尾,将词简化为 “词干”(可能不是合法单词),追求速度而非精准。
- 核心逻辑:基于 “形态变化规律” 去除常见后缀(如
-s
/-ing
/-tion
),不考虑语法或词典。 - 示例:
"television"
→ 截断-ion
→"televis"
(非词典词);"was"
→ 截断-s
→"wa"
(非词典词)。
- 工具:NLTK 的 PorterStemmer、LancasterStemmer。
2. 词目还原(Lemmatization)
- 定义:基于词典和语法规则,将词还原为 “词目(基础形式)”(一定是合法单词),追求精准但速度较慢。
- 核心逻辑:需结合词性(POS)判断还原方向(同一词不同词性可能有不同词目)。
- 示例:
"was"
(动词,be 的过去式)→ 词目"be"
;"found"
(动词,find 的过去分词)→ 词目"find"
。
- 工具:NLTK 的 WordNetLemmatizer(需指定词性,否则可能不准确)。
3. 大小写折叠(Case Folding)
- 定义:将文本统一为小写(或大写),消除 “大小写差异” 对模型的干扰(模型默认大小写为不同 token,语义上通常一致)。
- 核心逻辑:仅改变字符大小写,不修改词形或结构。
- 示例:
"Kitty's"
→ 小写 →"kitty's"
;"Television"
→ 小写 →"television"
。
- 应用:几乎所有 NLP 任务的基础步骤(除需区分大小写的场景,如命名实体识别)。
4. 三者对比
技术 | 核心目标 | 结果特性 | 速度 | 典型应用场景 |
---|---|---|---|---|
词干还原 | 快速简化词形 | 可能非合法单词 | 快 | 搜索引擎索引、快速文本聚类 |
词目还原 | 精准还原词基 | 一定是合法单词 | 慢 | 语法分析、精准语义匹配 |
大小写折叠 | 消除大小写差异 | 仅改变大小写 | 极快 | 几乎所有 NLP 基础预处理 |
四、习题整理
1.以下哪个正则表达式可匹配英文缩写 “×××n't”(××× 为任意字母组合)?结合表 1(输入与匹配情况:don't
匹配,n't
/can'tdo
/c9n't
不匹配),选项为:
输入 | 是否匹配 | 说明 |
don't | 是 | - |
n't | 否 | n't之前没有××× |
can'tdo | 否 | n't不是结尾 |
c9n't | 否 | 不能包含数字 |
A. \w*n't
B. [a-z]*n't
C. [a-z]+n't
D. [a-z][a-z]*n't
2.
下列选项中哪些字符串可以被对应的正则表达式完全匹配?完全匹配是指字符串的所有字符被匹配。例如,对于正则表达式 “abc”,字符串 “abc123” 不符合匹配要求,因为 “123” 没有被匹配。
A. 正则表达式 “(\w+)(\d+(.\d+)?)”,字符串 “DongshouxueNLP10.0”
B. 正则表达式 “abc+”,字符串 “abcccc”
C. 正则表达式 “(abc)+”,字符串 “abcccc”
D. 正则表达式 “f\d+:\d+(.\d+)?”,字符串 “f1:99.0”
3.假设有一个基于 BPE 的词元分词器,所使用的词表是:{, t, o, g, e, h, r, he, the, er, r, er_, to, ge, get},那么 “together” 将被分词为:
A. t o g e t h e r _
B. to get he r_
C. to ge the r_
D. to ge th er_
4.假设有一个基于 BPE 的词元分词器 A,其训练语料是由基于空格的分词器 B 在某个语料库 C 上分词所得的词元集合。请问以下哪一项陈述不正确?
A. 当 A 的词表大小不受限制时,A 在语料库 C 上产生与 B 相同的分词
B. 当 A 的词表大小不受限制时,A 在任意语料库上产生与 B 相同的分词
C. 与 B 相比,A 可以通过将稀有词元分词成常见的子词来减小词表大小
D. A 可以根据不同的词表大小和不同的训练语料库产生不同的分词结果,B 则不受不同训练语料库的影响
5.对于输入句子 “Kitty's cat was found behind the television.”,以下 3 个输出分别是采用什么方法的处理结果?
1)Kitti cat wa found behind the televis
2)Kitty's cat be find behind the television
3)kitty's cat was found behind the television
A. 词干还原
B. 词目还原
C. 大小写折叠
五、习题解答
1.要求匹配 “×××n't”,其中 ××× 是任意字母组合,结合示例分析选项:
- 选项 A:
\w*n't
。\w
匹配字母、数字、下划线,而示例中 “c9n't”(包含数字)不匹配,所以 A 不符合,因为它会匹配数字的情况。 - 选项 B:
[a-z]*n't
。*
表示前面的字符(小写字母)出现 0 次或多次。但 “n't”(前面 0 个字母)会被匹配,而示例中 “n't” 是不匹配的,所以 B 不符合。 - 选项 C:
[a-z]+n't
。+
表示前面的小写字母出现 1 次或多次,这样就要求 “n't” 前面必须有至少 1 个小写字母,符合 “×××”(任意字母组合,至少一个)的要求。同时,只匹配字母,不会匹配数字(如 “c9n't”),且要求 “n't” 在结尾(因为正则到 n't 结束),符合示例中 “can'tdo”(n't 不是结尾,不匹配)的情况。 - 选项 D:
[a-z][a-z]*n't
。这和[a-z]+n't
其实是等价的(因为[a-z][a-z]*
就是至少一个小写字母),所以这里可能需要再仔细看,不过通常这种题选 C 或 D 中更简洁的,或者看题干的 “×××” 是否允许构造方式。不过再仔细想,[a-z]+
已经涵盖了 “一个或多个”,而 D 的写法是 “一个字母 followed by 零个或多个字母”,和 C 是一样的效果。但再看示例,“don't” 是匹配的,“n't” 不匹配(因为前面没有字母),所以需要前面至少一个字母。现在看选项,C 和 D 都满足前面至少一个字母,但再看选项的差异,可能题目中的选项 C 是正确的,因为更直接表示 “一个或多个字母然后 n't”。
答案:C
2.“完全匹配” 指整个字符串被正则表达式匹配:
- 选项 A:正则
"(\w+)(\d+(\.\d+)?)"
,字符串 “DongshouxueNLP10.0”。\w+
匹配字母、数字、下划线,但 “DongshouxueNLP” 是字母,然后\d+(\.\d+)?
需要匹配数字(如 10.0),但字符串中 “NLP” 是字母,出现在数字前面,所以正则中的\w+
会匹配到 “DongshouxueNLP”,然后剩下的 “10.0” 可以被\d+(\.\d+)?
匹配,所以整个字符串是否被完全匹配?正则是两个分组,\w+
匹配前面的字母部分,\d+(\.\d+)?
匹配后面的数字部分,所以整个字符串 “DongshouxueNLP10.0” 可以被完全匹配,因为\w+
匹配 “DongshouxueNLP”,\d+(\.\d+)?
匹配 “10.0”,所以 A 符合。 - 选项 B:正则
"abc+"
,表示 “ab” 后面跟着一个或多个 “c”。字符串 “abcccc”,“abc+” 会匹配 “abcccc”(a、b、然后多个 c),所以完全匹配,B 符合。 - 选项 C:正则
"(abc)+"
,表示 “abc” 这个组出现一次或多次。字符串 “abcccc”,“abc” 需要是连续的 “a b c”,但字符串是 “a b c c c c”,没有多个 “abc”,且第一个部分是 “abc”,但后面是 “ccc”,所以正则(abc)+
需要至少一个 “abc”,但字符串 “abcccc” 中 “abc” 之后是 “ccc”,不是 “abc”,所以整个字符串不能被(abc)+
完全匹配,因为(abc)+
要求是 “abcabc...” 这样的形式,所以 C 不符合。 - 选项 D:正则
"f\d+:\d+(\.\d+)?"
,字符串 “f1:99.0”。f
匹配开头的 f,\d+
匹配 1,然后:
,接着\d+
匹配 99,然后(\.\d+)?
匹配.0,所以整个字符串 “f1:99.0” 被完全匹配,D 符合。
答案:ABD
3.BPE(字节对编码)的分词是基于词表中最频繁的子词合并,从左到右匹配最长可能的子词。词表是:{, t, o, g, e, h, r, he, the, er, t, er_, to, ge, get}。
现在分词 “together”:
- 首先看最长匹配,“to” 在词表中,所以先分 “to”。
- 剩下的 “gether”,再看 “ge” 在词表中,分 “ge”。
- 剩下的 “ther”,“the” 在词表中,分 “the”。
- 剩下的 “r”,加上可能的结尾(这里词表中有 “r_” 吗?或者看选项,选项 C 是 “to ge the r_”,符合 BPE 的最长匹配,因为 “to”、“ge”、“the”、“r_”(假设结尾用_表示)。
所以 “together” 分词为 “to ge the r_”。
答案:C
4.BPE 分词器 A 是基于训练语料(由分词器 B 在语料库 C 上分词的词元集合)训练的。分析选项:
- 选项 A:当 A 的词表大小不受限制时,A 会不断合并直到所有可能的子词都被合并,最终会还原成分词器 B 的分词结果(因为训练语料来自 B 在 C 上的分词),所以 A 在语料库 C 上产生与 B 相同的分词,正确。
- 选项 B:当 A 的词表大小不受限制时,A 在任意语料库上产生与 B 相同的分词。错误,因为 A 是在语料库 C 上训练的,当换其他语料库时,B 的分词方式可能不同(B 是基于空格的分词器,不同语料库的空格分词结果可能因文本不同而不同),且 A 的训练是基于 C 的,所以在其他语料库上不一定和 B 相同。
- 选项 C:与 B(基于空格的分词器,词表是所有空格分隔的词,稀有词多)相比,A 可以将稀有词分成常见的子词(如把 “uncommon” 分成 “un” 和 “common”),从而减小词表大小,正确。
- 选项 D:A 的分词结果依赖于词表大小(词表小则合并少,词表大则合并多)和训练语料库(不同语料库的子词频率不同,合并顺序不同);而 B 是基于空格的分词器,分词只看空格,不受训练语料库的影响(只要文本的空格一致,分词就一致),正确。
答案:B
5.分析三个输出和方法(词干还原、词目还原、大小写折叠):
- 词干还原(Stemming):将单词还原为词干,可能会产生不规范的形式(如去掉词尾)。输出 1)“Kitti cat wa found behind the televis” 中,“Kitty's” 变成 “Kitti”,“was” 变成 “wa”,“found” 可能还原,“television” 变成 “televis”,这些是词干还原的特征(粗糙的词尾截断)。
- 词目还原(Lemmatization):将单词还原为词典中的基本形式(词目),更准确。输出 2)“Kitty's cat be find behind the television” 中,“was” 变成 “be”,“found” 变成 “find”,这是词目还原(如 “was” 的词目是 “be”,“found” 的词目是 “find”)。
- 大小写折叠(Case Folding):将所有字母转为同一大小写(通常小写)。输出 3)“kitty's cat was found behind the television” 中,“Kitty's” 变成 “kitty's”,是大小写折叠(首字母小写)。
所以对应关系:
1)→ 词干还原(A);
2)→ 词目还原(B);
3)→ 大小写折叠(C)。
六、总结
本文系统介绍了NLP中的三项基础技术:
1)正则表达式作为文本模式匹配工具,重点解析字符类、量词等核心语法;
2)BPE分词算法通过子词合并解决词表膨胀问题,分析其词表构建和分词逻辑;
3)文本预处理技术(词干还原、词目还原、大小写折叠)的对比与应用场景。
文章通过典型示例和习题解析,阐明各项技术的核心原理与适用条件,构建了从文本清洗到模型输入的完整技术链条。这些基础技术直接影响NLP任务的输入质量与模型性能,是深入理解复杂NLP系统的前提。