大模型入门之数据预处理实践
原创 chal1ce 橙陈编程笔记 2024年11月16日 00:01 广东
数据预处理实践
吐槽一下,平台的代码兼容性真的差....
这部分内容我来给大家介绍一下数据预处理是怎么实现的。
YuLan-GARDEN
是一个集成的框架,它专门用来处理 YuLan 模型预训练过程中所需要的数据清洗和筛选。
简单来说,它有两个核心模块:
-
• 一个是分析模块,帮助我们了解数据的整体情况,比如数据里面有哪些字段、数据的平均长度、以及语言分布等信息;
-
• 另一个是处理模块,里面有各种不同的处理工具,可以根据需求进行数据的筛选和清理。
用户可以先通过分析模块对数据做个初步了解,然后根据需要修改一些配置文件,调整这些处理工具的顺序和参数,形成适合自己项目的定制化流程。通过这个流程,用户可以反复调整,直到数据质量达到预期,适合用来训练模型。
接下来,讲讲质量过滤这个环节。YuLan-GARDEN
在这个阶段分成了两个部分:过滤和清洗。过滤阶段就是把那些质量不高的数据直接丢掉,而清洗阶段则是把那些高质量的数据替换掉原来的数据。这个过程可以依赖一些简单的规则,比如根据数据的统计特征、正则表达式的匹配,或者使用一些模型来判断数据的质量。用户还可以对数据进行采样,灵活调整数据清理的顺序和方式。
质量过滤
举个例子,假设我们使用了 FastText
语言分类器来过滤数据。在这个过程中,我们首先加载一个预训练的语言分类器,然后对每一条输入的数据进行语言识别。如果数据的语言不符合我们设置的标准,它就会被过滤掉。这样可以确保我们的数据更加精准和符合需求。示例代码如下:
import logging
from utils.evaluator import LangIdentifier
# 设置日志
logging.basicConfig(level=logging.INFO)
class FilterPassageByLangs:
def __init__(self, model_path: str, reject_threshold: float = 0.5) -> None:
"""
初始化过滤器,加载预训练的 FastText 模型,并设置语言过滤的阈值。
:param model_path: 预训练模型的路径
:param reject_threshold: 语言识别置信度低于此值的文本会被认为是未知语言
"""
try:
# 加载 FastText 语言识别模型
self.language_identifier = LangIdentifier(model_path=model_path)
self.reject_threshold = reject_threshold
logging.info(f"成功加载 FastText 模型:{model_path}")
except Exception as e:
logging.error(f"加载模型失败: {e}")
raise
def filter_single_text(self, text: str, accept_lang_list: list) -> bool:
"""
根据文本的语言过滤文本,返回 True 表示该文本不符合要求(即需要丢弃),
返回 False 表示该文本符合要求(即保留)。
:param text: 输入的文本
:param accept_lang_list: 接受的语言列表(例如:['en', 'fr'])
:return: 是否丢弃该文本
"""
if not text:
logging.warning("空文本被跳过")
return True # 如果文本为空,直接丢弃
try:
# 使用 fasttext 模型给 text 打分,每种语言生成一个置信分数
labels, scores = self.language_identifier.evaluate_single_text(text)
# 检查模型返回的语言标签和分数
if not labels or not scores:
logging.warning(f"无法识别文本的语言: {text[:30]}...") # 仅显示文本的前30个字符
return True # 如果没有语言标签,认为无法识别,丢弃文本
# 如果所有语言的分数均低于 reject_threshold,则认为该文本是无法识别的语言
if scores[0] < self.reject_threshold:
logging.info(f"文本识别的最高语言分数低于阈值,文本被标记为未知语言: {text[:30]}...")
labels = ["uk"] # 将无法识别的语言标签设为 "uk"(未知语言)
# 将 accept_lang_list 中的语言统一转换为小写字母
accept_lang_list = [each.lower() for each in accept_lang_list]
# 如果分数最高的语言标签不在接受的语言列表中,则丢弃该文本
if labels[0] not in accept_lang_list:
logging.info(f"文本语言 '{labels[0]}' 不在接受的语言列表中,文本被丢弃: {text[:30]}...")
return True # 丢弃文本
# 如果通过所有过滤,保留该文本
logging.info(f"文本符合要求,保留: {text[:30]}...")
return False # 保留文本
except Exception as e:
logging.error(f"处理文本时出错: {e}")
return True # 如果处理出错,丢弃该文本
# 示例使用
if __name__ == "__main__":
# 假设模型路径是 "utils/models/fasttext/lid.176.bin"