大模型入门之数据预处理实践

大模型入门之数据预处理实践

原创 chal1ce 橙陈编程笔记 2024年11月16日 00:01 广东

数据预处理实践

吐槽一下,平台的代码兼容性真的差....

这部分内容我来给大家介绍一下数据预处理是怎么实现的。

YuLan-GARDEN 是一个集成的框架,它专门用来处理 YuLan 模型预训练过程中所需要的数据清洗和筛选。

简单来说,它有两个核心模块:

  • • 一个是分析模块,帮助我们了解数据的整体情况,比如数据里面有哪些字段、数据的平均长度、以及语言分布等信息;

  • • 另一个是处理模块,里面有各种不同的处理工具,可以根据需求进行数据的筛选和清理。

用户可以先通过分析模块对数据做个初步了解,然后根据需要修改一些配置文件,调整这些处理工具的顺序和参数,形成适合自己项目的定制化流程。通过这个流程,用户可以反复调整,直到数据质量达到预期,适合用来训练模型。

接下来,讲讲质量过滤这个环节。YuLan-GARDEN 在这个阶段分成了两个部分:过滤和清洗。过滤阶段就是把那些质量不高的数据直接丢掉,而清洗阶段则是把那些高质量的数据替换掉原来的数据。这个过程可以依赖一些简单的规则,比如根据数据的统计特征、正则表达式的匹配,或者使用一些模型来判断数据的质量。用户还可以对数据进行采样,灵活调整数据清理的顺序和方式。

质量过滤

举个例子,假设我们使用了 FastText 语言分类器来过滤数据。在这个过程中,我们首先加载一个预训练的语言分类器,然后对每一条输入的数据进行语言识别。如果数据的语言不符合我们设置的标准,它就会被过滤掉。这样可以确保我们的数据更加精准和符合需求。示例代码如下:

import loggingfrom 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"   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

医疗AI强化曾小健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值