英译法案例 - 数据预处理函数
1 课程概览
本课讲解数据预处理函数 my_get_data,读取原始文件数据并清洗文本、构建双语句子对。使用 with open 读取文件,readlines 一次性读取所有行,split('\t') 分割英文和法文,normalizeString 清洗文本。
2 核心概念与定义
- my_get_data:数据预处理函数,读取并清洗数据。
- readlines:一次性读取所有行,格式为列表,最后有
\n。 - split('\t'):按制表符分割英文和法文。
- normalizeString:字符串规范化处理函数。
- 双语句子对(pairs):
[英文, 法文]的列表。
3 模型与算法详解
数据预处理步骤
第一步:读取原始文件数据
with open(path, 'r', encoding='utf-8') as f:
lines = f.readlines()
readlines:一次性读取所有行- 格式为列表,每行末尾有
\n
第二步:清洗文本并构建双语句子对
pairs = [[normalizeString(s) for s in line.split('\t')] for line in lines]
line.split('\t'):按制表符分割英文和法文normalizeString(s):清洗每个句子- 列表推导式:构建
[[英文, 法文], ...]
数据格式
原始数据:I am a student\tJe suis un étudiant\n
分割后:['I am a student', 'Je suis un étudiant\n']
清洗后:['i am a student', 'je suis un étudiant']
列表推导式解析
# 嵌套列表推导式
pairs = [[normalizeString(s) for s in line.split('\t')] for line in lines]
# 等价于
pairs = []
for line in lines:
pair = []
for s in line.split('\t'):
pair.append(normalizeString(s))
pairs.append(pair)
4 数学原理与推导
本课为数据处理,无数学原理。
5 代码示例
import re
# 特殊 token 定义
SOS = 0 # Start of Sentence
EOS = 1 # End of Sentence
MAX_LENGTH = 10 # 最大句子长度
# 数据文件路径
path = './data/eng-fra.txt'
def normalizeString(s):
"""字符串规范化处理函数"""
s = s.lower().strip()
s = re.sub(r"([.!?])", r" \1", s)
s = re.sub(r"[^a-zA-Z.!?]+", r" ", s)
return s
def my_get_data(path):
"""
数据预处理函数
读取原始文件数据,清洗文本并构建双语句子对
:param path: 数据文件路径
:return: 双语句子对 [[英文, 法文], ...]
"""
# 第一步:读取原始文件数据
print("1.1 打开文件并读取")
with open(path, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 第二步:清洗文本并构建双语句子对
print("1.2 清洗文本并构建双语句子对")
pairs = [[normalizeString(s) for s in line.split('\t')] for line in lines]
return pairs
# 测试
if __name__ == "__main__":
pairs = my_get_data(path)
# 查看前 5 条数据
print("前 5 条数据:")
for i in range(5):
print(f"英文: {pairs[i][0]}")
print(f"法文: {pairs[i][1]}")
print("-" * 50)
print(f"总数据量: {len(pairs)}")
6 重难点与易错提醒
- ❗重点:
readlines一次性读取所有行,格式为列表,最后有\n。 - ❗重点:
split('\t')按制表符分割英文和法文。 - ⚠️易错:嵌套列表推导式不是普通的嵌套,是构建二维列表。
- ⚠️易错:
normalizeString要对每个句子都调用。 - 💡深入理解:数据格式为
[[英文, 法文], ...]的双语句子对。
7 课堂问答精选
Q1:my_get_data 函数做了哪些事?
A:①读取原始文件数据(with open + readlines);②清洗文本并构建双语句子对(split('\t') + normalizeString)。
Q2:readlines 的返回格式是什么?
A:返回一个列表,每个元素是一行(包含 \n)。例如 ['I am a student\tJe suis un étudiant\n', ...]。
Q3:如何分割英文和法文?
A:用 split('\t') 按制表符分割。例如 'I am a student\tJe suis un étudiant\n'.split('\t') 得到 ['I am a student', 'Je suis un étudiant\n']。
Q4:嵌套列表推导式是什么意思?
A:[[normalizeString(s) for s in line.split('\t')] for line in lines] 是构建二维列表。外层遍历每行,内层遍历每行分割后的句子,构建 [[英文, 法文], ...]。
8 本课小结
my_get_data函数:读取数据并清洗。- 第一步:
with open+readlines读取所有行。 - 第二步:
split('\t')+normalizeString清洗并构建句子对。 - 数据格式:
[[英文, 法文], ...]。 - 嵌套列表推导式:构建二维列表。
9 延伸思考
- 如何过滤过长的句子?
- 如何构建词汇表?