NLP07-朴素贝叶斯问句分类之数据集加载(1/3)

news/2025/2/27 6:16:55

一、概述

数据集加载(Dataset Loading)是机器学习、自然语言处理(NLP)等领域中的一个重要步骤,指的是将外部数据(如文件、数据库、网络接口等)加载到程序中,以便进行后续处理、分析或模型训练。数据集加载通常是数据预处理的第一步,之后可能还会进行数据清洗、转换等处理。

(一)目的

数据集加载的主要目的是获取数据,将存储在外部来源(如文本文件、CSV文件、数据库、API等)中的信息导入到程序中,转换为适合处理的格式。

(二)步骤

(1)选择数据源

  • 数据可以来自文件系统(如 .csv、.txt 文件)或远程数据库/API。
  • 选择合适的数据源和格式(例如,CSV 格式适合结构化数据,JSON 格式适合层级数据)。

(2)加载数据

  使用适当的库和函数将数据从文件或数据库中加载到内存中。常见的库包括:

  • pandas:适用于 CSV、Excel、JSON 等格式的数据。(详见 库学习02-Pandas库)
  • open():适用于文本文件。 (本文使用)
  • sqlite3:适用于从 SQLite 数据库加载数据。

(3)数据转换和格式化

  • 数据加载后,可能需要将数据转换成合适的格式。例如,转换字符串为数值、日期格式化等。
  • 可能需要将数据从列表转换为 DataFrame(例如使用 pandas),或者从字典转换为列表等。

二、数据集加载

目的:从一个文件夹中读取所有文本文件,提取每个文件的标签(从文件名中获取),然后将文件内容进行分词处理,并保存并返回为训练数据和标签。

(一)从文件夹读取文件列表

数据存储在不同的文本文件中,每个文件名中包含类别标签(如“question_1.txt"表示类别 1)。

这里定义一个读取文件列表的函数,作用是 遍历指定路径(source_path)下的所有文件,并返回两个列表:一个是文件名列表 file_name,另一个是文件路径列表 file_path_list。(os.walk函数的用法详见库学习03-os库(持续更新))

python">def get_file_list(source_path):
    # 从文件夹读取到文件列表
    file_path_list = []
    file_name = []
    walk = os.walk(source_path)
    # print(walk)
    for root, dirs, files in walk:
        for name in files:
            filepath = os.path.join(root, name)
            file_name.append(name)
            file_path_list.append(filepath)
            # print(name)
            # print(filepath)
            # print("---")
    return file_name, file_path_list

(二) 遍历文件列表,获取数据

2.1 从文件名中用正则获取到标签

python">dir_name, file_name = os.path.split(file_item)
label_str = re.sub(r'\D', "", file_name)
  1. os.path.split 函数的用法详见库学习03-os库(持续更新) 
  2. label_str = re.sub(r'\D', "", file_name)

     提取标签:这一行通过正则表达式从文件名中提取出标签。具体来说:

  • r'\D' 是一个正则表达式,表示“非数字字符”。
  • re.sub(r'\D', "", file_name) 会将 file_name 中所有非数字字符替换为空字符串,从而提取出文件名中的数字部分。
  • 例如,如果 file_name = "file12.txt",则label_str = "12"

2.2 遍历每一行标签获取数据

python">        if label_str.isnumeric(): # 判断是否是数字
            label = int(label_str)
            with (open(file_item, "r", encoding="utf-8")) as file:
                lines = file.readlines()
                for line in lines:
                    # print(line)
                    # 分词
                    word_list = list(jieba.cut(line))
                    train_x.append(" ".join(word_list))
                    train_y.append(label)

代码重点解析:

文件操作块:

python">with open(file_item, "r", encoding="utf-8") as file:
    # 在这里可以操作文件,读取文件内容等
  •  with 是 Python 中的上下文管理器(Context Manager)。它通常用于管理需要显式清理的资源,比如文件、数据库连接、网络请求等。一大好处是它会自动管理资源,无需你显式地调用 file.close() 来关闭文件,减少了因忘记关闭文件而导致的资源泄露问题。
  •  as file:as file 是 with 语句中的一个关键部分,它为文件对象起了个别名 file。你可以在 with 语句块内部使用 file 来操作文件。

jieba分词:

python">word_list = list(jieba.cut(line))
train_x.append(" ".join(word_list))
train_y.append(label)
  • jieba分词详见 jieba分词
  • train_x存储每行的分词结果(列表形式)
  • train_y存储该行对应的问句类别(如“question_1.txt"表示类别 1)

最终 train_x 和 train_y 大概长这样:

一个分词后的问句对应一个类别。

数据加载模块完整代码:

python">import os
import re
import jieba
from common import constant


def load_train_data():
    train_x = []
    train_y = []
    question_dir = os.path.join(constant.DATA_DIR, "question")
    # 从文件夹读取文件列表
    file_name_list, file_path_list = get_file_list(question_dir)
    # 遍历文件列表
    for file_item in file_path_list:
        # 从文件名中用正则获取到标签
        # 拆分路径获取文件名
        dir_name, file_name = os.path.split(file_item)
        label_str = re.sub(r'\D', "", file_name)
        # 读取每一行作为训练数据
        if label_str.isnumeric():
            label = int(label_str)
            with (open(file_item, "r", encoding="utf-8")) as file:
                lines = file.readlines()
                for line in lines:
                    # print(line)
                    # 分词
                    word_list = list(jieba.cut(line))
                    train_x.append(" ".join(word_list))
                    train_y.append(label)

    return train_x, train_y


def get_file_list(source_path):
    # 从文件夹读取到文件列表
    file_path_list = []
    file_name = []
    walk = os.walk(source_path)
    # print(walk)
    for root, dirs, files in walk:
        for name in files:
            filepath = os.path.join(root, name)
            file_name.append(name)
            file_path_list.append(filepath)
            # print(name)
            # print(filepath)
            # print("---")
    return file_name, file_path_list


if __name__ == "__main__":
    ""
    # question_dir = os.path.join(constant.DATA_DIR, "question")
    # get_file_list(question_dir)
    load_train_data()


http://www.niftyadmin.cn/n/5869624.html

相关文章

PydanticToolsParser 工具(tool call)把 LLM 生成的文本转成结构化的数据(Pydantic 模型)过程中遇到的坑

PydanticToolsParser 的作用 PydanticToolsParser 是一个工具,主要作用是 把 LLM 生成的文本转成结构化的数据(Pydantic 模型),让代码更容易使用这些数据进行自动化处理。 换句话说,AI 生成的文本通常是自然语言&…

SAP Webide系列(7)- 优化FreeStyle新建项目预设模板

目录 一、背景 二、优化目标 三、定位调整点 四、调整步骤 五、效果展示 六、附言 一、背景 在每次通过Webide进行FreeStyle方式自开发SAP UI5应用的时候,新建项目,得到的模板文件都是只有很少的内容(没有路由配置、没有设置默认全屏等…

27.[前端开发-JavaScript基础]Day04-函数基本使用-递归-变量作用域-函数式编程

一、JavaScript函数 1 认识JavaScript函数 程序中的foo、bar、baz 认识函数 函数使用的步骤 2 函数的声明和调用 声明和调用函数 函数的参数 有参数的函数练习 函数的返回值 函数的练习 arguments参数(JS高级再学习) 3 函数的递归调用 函数中…

本地大模型编程实战(24)用智能体(Agent)实现智能纠错的SQL数据库问答系统(3)

本文将实现这样一个 智能体(Agent) : 可以使用自然语言对 SQLite 数据库进行查询。即:用户用自然语言提出问题,智能体也用自然语言根据数据库的查询结果回答问题。增加一个自动对查询中的专有名词进行纠错的工具,这将明显提升查询…

CAS (Compare and swap “比较和交换“) [ Java EE 初阶 ]

目录 什么是 CAS CAS 是怎么实现的 CAS 有哪些应用 1. 实现原子类 2. 实现自旋锁 3. CAS 的 ABA 问题 什么是 CAS // 能够比较和交换某个寄存器中的值和内存中的值, 看是否相等, 如果相等, 则把另一个寄存器中的值和内存中的值进行交换 // CAS伪代码 boolean CAS(addres…

微信小程序数据缓存与本地存储:优化用户体验

在前几篇文章中,我们学习了微信小程序的基础知识、数据绑定、事件处理、页面导航与路由、网络请求与API调用以及组件封装与复用。这些知识帮助我们构建了具备基本功能的小程序。然而,在实际开发中,如何高效地管理数据、提升用户体验是一个重要课题。本文将深入探讨微信小程序…

大白话css第一章基础入门

大白话css第一章基础入门 了解CSS基本概念 CSS是干啥的:就好比你装修房子,HTML呢是把房子的框架、房间布局都搭好了,像客厅、卧室、厨房都有了,但是房子里面空空的,啥都没装饰。这时候CSS就上场啦,它就是…

【Win10】Anaconda + Pycharm 环境搭建教程

一、 Anaconda 安装包下载 1. Anaconda官方 https://www.anaconda.com/ 下载较慢, 页面直观 2. 清华镜像站 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 二、 Pycharm 安装包下载 https://www.jetbrains.com/pycharm/ 进入官网后,点击此处的Do…