英译法案例 - 数据清洗函数
1 课程概览
本课讲解数据清洗函数 normalizeString 的实现。对字符串进行规范化处理:①转小写并去除首尾空白;②在特殊符号(.!?)前加空格,方便后续裁剪。使用正则表达式的捕获组(小括号)和 re.sub 进行替换。
2 核心概念与定义
- normalizeString:字符串规范化处理函数。
- lower():将字符串转成小写。
- strip():去除首尾空白字符。
- re.sub:正则表达式替换函数。
- 捕获组:正则表达式中用小括号
()分组,用\1引用。
3 模型与算法详解
数据清洗步骤
第一步:转小写并去除首尾空白
s = s.lower().strip()
lower():转成小写strip():去除首尾空格
第二步:在特殊符号前加空格
s = re.sub(r"([.!?])", r" \1", s)
- 正则表达式
([.!?]):匹配.、!、?中的任意一个 - 小括号
():捕获组 \1:引用第一组的内容- 替换为
\1:在符号前加空格
re.sub 函数详解
re.sub(pattern, repl, string)
| 参数 | 说明 |
|---|---|
| pattern | 正则表达式(要被替换的内容) |
| repl | 替换的内容 |
| string | 要操作的字符串 |
示例:
- 输入:
"Hello!How are you?" - 输出:
"Hello ! How are you ?"
正则表达式捕获组
正则表达式:([.!?])
- () :小括号代表分组
- [.!?] :匹配 . ! ? 中的任意一个
- \1 :引用第一组的内容
4 数学原理与推导
本课为字符串处理,无数学原理。
5 代码示例
import re
# 特殊 token 定义
SOS = 0 # Start of Sentence
EOS = 1 # End of Sentence
MAX_LENGTH = 10 # 最大句子长度
def normalizeString(s):
"""
字符串规范化处理函数
用于文本的预处理
:param s: 需要处理的字符串
:return: 处理后的字符串
"""
# 第一步:将字符串转成小写形式并去除首尾空白字符
s = s.lower().strip()
# 第二步:在 . ! ? 前加一个空格
# 使用正则表达式的捕获组
# ([.!?]) 匹配 . ! ? 中的任意一个,小括号是捕获组
# r" \1" 在匹配到的符号前加一个空格,\1 引用第一组
s = re.sub(r"([.!?])", r" \1", s)
# 第三步:将非字母字符替换为空格(可选)
s = re.sub(r"[^a-zA-Z.!?]+", r" ", s)
return s
# 测试
if __name__ == "__main__":
# 测试数据
test_string = "Hello!How are you?I'm fine."
result = normalizeString(test_string)
print("原始字符串:", test_string)
print("处理后字符串:", result)
# 输出: hello ! how are you ? i m fine .
6 重难点与易错提醒
- ❗重点:
normalizeString函数两步处理——转小写去空白、特殊符号前加空格。 - ❗重点:
re.sub三个参数——正则表达式、替换内容、操作字符串。 - ⚠️易错:正则表达式中
()是捕获组,\1引用第一组。 - ⚠️易错:
[.!?]中的.在中括号内是普通字符,不是通配符。 - 💡深入理解:在特殊符号前加空格是为了方便后续裁剪。
7 课堂问答精选
Q1:normalizeString 函数做了哪些处理?
A:①将字符串转成小写形式并去除首尾空白字符(s.lower().strip());②在 .、!、? 前加一个空格(re.sub(r"([.!?])", r" \1", s))。
Q2:re.sub 的三个参数分别是什么?
A:①正则表达式(要被替换的内容);②替换的内容;③要操作的字符串。例如 re.sub(r"([.!?])", r" \1", s) 把字符串 s 中的 .、!、? 前加一个空格。
Q3:正则表达式中 () 和 \1 是什么意思?
A:() 是捕获组,将匹配的内容分组;\1 引用第一组的内容。例如 ([.!?]) 匹配 .、!、?,\1 引用匹配到的符号。
Q4:为什么要在特殊符号前加空格?
A:为了方便后续做裁剪(split)。加空格后,特殊符号会作为独立的 token,便于分词。
8 本课小结
normalizeString函数:字符串规范化处理。- 第一步:
s.lower().strip()转小写去空白。 - 第二步:
re.sub(r"([.!?])", r" \1", s)特殊符号前加空格。 re.sub三参数:正则、替换、字符串。- 捕获组:
()分组,\1引用。
9 延伸思考
- 如何处理其他特殊字符?
- 如何限制句子长度?