Fasttext 优化 - 数据预处理
1 课程概览
本课讲解 Fasttext 优化手段一:数据预处理。原始数据存在问题:大小写混合、符号与单词未分离。处理方法:统一小写、符号与单词分离。使用处理后的数据集(cooking_pre_train.txt 和 cooking_pre_validate.txt)。精度从 0.14 提升到 0.17。快捷键 Ctrl+Shift+U 切换大小写。
2 核心概念与定义
- 数据预处理:统一小写、符号与单词分离。
- 大小写混合:ADD、add、Add 被程序认为是不同的词。
- 符号切割:符号与单词之间加空格。
3 模型与算法详解
原始数据存在的问题
| 问题 | 说明 | 示例 |
|---|---|---|
| 大小写混合 | 程序认为不同 | ADD、add、Add |
| 符号未分离 | 符号与单词连在一起 | "add?" 被认为是一个整体 |
处理方法
| 方法 | 说明 |
|---|---|
| 统一小写 | 所有单词转成小写 |
| 符号切割 | 符号与单词之间加空格 |
数据集对比
| 文件 | 说明 |
|---|---|
| cooking_train.txt | 未处理的训练集 |
| cooking_validate.txt | 未处理的验证集 |
| cooking_pre_train.txt | 处理后的训练集 |
| cooking_pre_validate.txt | 处理后的验证集 |
优化效果
| 指标 | 处理前 | 处理后 | 提升 |
|---|---|---|---|
| Precision | 0.14 | 0.17 | +0.03 |
快捷键
| 快捷键 | 作用 |
|---|---|
Ctrl+Shift+U | 切换大小写 |
4 数学原理与推导
数据预处理对精度的影响
统一小写和符号切割后,词汇表更小,特征更集中,精度提升。
- 大小写统一:减少词汇表大小
- 符号切割:正确分离单词和符号
- 特征更集中,精度提升
5 代码示例
import fasttext
def dm02_data_preprocess():
"""数据预处理优化"""
# 1. 使用处理后的数据训练模型
model = fasttext.train_supervised(
input="data/cooking_pre_train.txt", # 处理后的训练数据
epoch=25,
lr=1.0,
wordNgrams=2
)
# 2. 预测(注意:预测时也要处理数据)
# 方法1:使用处理后的句子
result = model.predict("which baking dish is best to bake a banana bread ?")
print(f"预测结果: {result}")
# 方法2:手动处理句子(Ctrl+Shift+U 转小写,符号前加空格)
# sentence = "Which baking dish is best to bake a banana bread?"
# sentence = sentence.lower() # 转小写
# sentence = sentence.replace("?", " ?") # 符号前加空格
# 3. 评估
metrics = model.test("data/cooking_pre_validate.txt")
print(f"样本数: {metrics[0]}")
print(f"Precision@1: {metrics[1]}")
print(f"Recall@1: {metrics[2]}")
return model
def preprocess_text(text):
"""
文本预处理函数
:param text: 原始文本
:return: 处理后的文本
"""
# 1. 统一小写
text = text.lower()
# 2. 符号与单词分离(在符号前加空格)
punctuation = ".,!?;:"
for p in punctuation:
text = text.replace(p, f" {p}")
return text
# 测试
if __name__ == "__main__":
# 测试预处理函数
original = "Which baking dish is best to bake a banana bread?"
processed = preprocess_text(original)
print(f"原始文本: {original}")
print(f"处理后文本: {processed}")
# 训练模型
print("\n训练模型...")
model = dm02_data_preprocess()
代码说明
| 代码 | 说明 |
|---|---|
cooking_pre_train.txt | 处理后的训练数据 |
cooking_pre_validate.txt | 处理后的验证数据 |
text.lower() | 统一小写 |
text.replace(p, f" {p}") | 符号前加空格 |
6 重难点与易错提醒
- ❗重点:数据预处理包括统一小写和符号切割。
- ❗重点:预测时也要对输入数据做同样的预处理。
- ⚠️易错:大小写混合会导致程序认为 ADD、add、Add 是不同的词。
- 💡技巧:快捷键
Ctrl+Shift+U切换大小写。
7 课堂问答精选
Q1:原始数据存在什么问题?
A:①大小写混合(ADD、add、Add 被程序认为是不同的词);②符号与单词未分离("add?" 被认为是一个整体)。
Q2:如何进行数据预处理?
A:①统一小写:所有单词转成小写;②符号切割:符号与单词之间加空格。
Q3:数据预处理的效果如何?
A:精度从 0.14 提升到 0.17,提升 0.03。
Q4:预测时需要做数据预处理吗?
A:需要。预测时也要对输入数据做同样的预处理(统一小写、符号切割),否则会影响预测效果。
8 本课小结
- 数据预处理:统一小写、符号切割。
- 使用处理后的数据集(cooking_pre_train.txt)。
- 精度从 0.14 提升到 0.17。
- 预测时也要做同样的预处理。
- 快捷键
Ctrl+Shift+U切换大小写。
9 延伸思考
- 如何进一步调整训练轮数和学习率?
- 如何调整 n-gram 和损失函数?