昇腾数据探险家:挖掘数据的隐藏宝藏

举报
技术火炬手 发表于 2025/05/13 10:45:07 2025/05/13
【摘要】 借助华为开发者空间提供的免费昇腾NPU资源的Notebook进行代码开发,深入了解如何利用Python中预装的库来进行数据清洗。
1 概述

1.1 案例介绍

数据清洗(Data Cleansing)是指对数据进行处理和纠错,以去除或修复数据集中存在的错误、不一致、不完整和冗余的数据,从而使数据更加准确、可靠和可用。数据清洗是数据处理和数据分析中一个非常重要的步骤,它可以帮助我们提高数据的质量,从而提高数据分析和机器学习的准确性和可靠性。

本案例选择PyThon所及生成杂乱数据及清洗作为示例,通过实际操作,让大家深入了解如何利用Python中预装的库来进行数据清洗。在这个过程中,大家将学会从数据生成到数据清洗全流程。

1.2 适用对象

  • 个人开发者
  • 高校学生

1.3 案例时间

本案例总时长预计30分钟。

1.4 案例流程

247f7413655f9df8d6b38667648f55b3.PNG

说明:

  1. 用户进入开发者空间配置Notebook环境;
  2. 进入Notebook进行数据清洗功能实现。

1.5 资源总览

本案例预计花费0元。

资源名称 规格 单价(元) 时长(分钟)
华为开发者空间-Notebook NPU basic · 1 * NPU 910B · 8v CPU · 16GB| euler2.9-py38-torch2.1.0-notebook 0 30

2 环境配置

2.1 开发者空间配置

面向广大开发者群体,华为开发者空间提供免费昇腾NPU资源的Notebook,方便开发者学习昇腾相关的专业知识以及配套实验。

开发者可以直接进入华为开发者空间工作台界面,找到右侧AI Notebook,点击立即前往> 立即启动>查看Notebook,进去到Notebook界面。

09329602ec000fe81faac006ed7069fa.20250430091218.94248898759837850034215614605688.png

09329602ec000fe81faac006ed7069fa.20250430091219.51305424936562667077827911428945.png

09329602ec000fe81faac006ed7069fa.20250430091221.48123764943275663991793870224695.png

3 数据清洗功能实现

3.1 数据集生成

打开Notebook后,点击笔记本下方的Python3,将以下代码复制到代码行中。

09329602ec000fe81faac006ed7069fa.20250430091222.21546411138581934117231388357285.png

1. 导入必要的库,并配置日志记录,复制完毕后,点击上方三角运行符号运行代码。

import random
import string
import logging

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

09329602ec000fe81faac006ed7069fa.20250430091223.34444642571147908205823132568467.png

代码解释:

  • random库用于生成随机数,在后续代码中会用于随机选择元素和确定长度等操作;
  • string库提供了字符串常量,如字母、标点符号等,方便开发者使用;
  • logging库用于记录程序运行过程中的信息,便于调试和监控。这里日志设置为INFO,并定义日志的输出格式。

2. 定义一些常见的列表。

# 定义一些常见的 HTML 标签
html_tags = ['<p>', '</p>', '<div>', '</div>', '<span>', '</span>', '<br>', '<h1>', '</h1>', '<h2>', '</h2>']
# 定义一些特殊字符
special_chars = string.punctuation + '¥@#&*'
# 定义一些停用词(简单示例)
stopwords = ['the', 'and', 'is', 'in', 'it', 'of', 'to']

09329602ec000fe81faac006ed7069fa.20250430091225.36524915927543579863424998575426.png

代码解释:

  • html_tags列表包含了一些常见的HTML标签,后续会在生成杂乱数据文本时使用;
  • special_chars包含了常见的标点符号以及一些自定义的特殊字符;
  • stopwords是一个简单的停用词列表。

3. 生成随机单词。

def generate_random_word(min_length=3, max_length=10):
    """
    生成指定长度范围内的随机单词。

    :param min_length: 单词的最小长度
    :param max_length: 单词的最大长度
    :return: 随机生成的单词
    """
    length = random.randint(min_length, max_length)
    return ''.join(random.choice(string.ascii_letters) for _ in range(length))

09329602ec000fe81faac006ed7069fa.20250430091226.40081855880649904941901535078039.png

代码解释:

  • 该函数接受两个参数min_length和max_length,分别表示单词的最小和最大长度,默认值分别为3和10;
  • 使用random.randint生成一个介于min_length和max_length之间的随机整数作为单词的长度;
  • 通过循环和random.choice从字母表中随机选择字符,最后使用join方法将这些字符组合成一个单词。

4. 生成随机句子。

def generate_random_sentence(min_words=3, max_words=15):
    """
    生成包含指定数量单词范围内的随机句子。

    :param min_words: 句子中单词的最小数量
    :param max_words: 句子中单词的最大数量
    :return: 随机生成的句子
    """
    num_words = random.randint(min_words, max_words)
    words = [generate_random_word() for _ in range(num_words)]
    sentence = ' '.join(words)
    return sentence

09329602ec000fe81faac006ed7069fa.20250430091228.59613787496290291775317264691588.png

代码解释:

  • 该函数接受两个参数min_words和max_words,分别表示句子中单词的最小和最大数量,默认值分别为3和15;
  • 使用random.randint生成一个介于min_words和max_words之间的随机整数作为句子中单词的数量;
  • 调用generate_random_word函数生成指定数量的随机单词,并将他们存储在列表words中;
  • 最后使用join方法将这些单词用空格连接成一个句子。

5. 为文本添加噪声。

def add_noise(text, num_extra_spaces=5):
    """
    为文本添加多余空格噪声。

    :param text: 输入的文本
    :param num_extra_spaces: 要添加的多余空格的最大数量
    :return: 添加噪声后的文本
    """
    num_extra = random.randint(0, num_extra_spaces)
    for _ in range(num_extra):
        index = random.randint(0, len(text))
        text = text[:index] + '  ' + text[index:]
    return text

09329602ec000fe81faac006ed7069fa.20250430091230.66488463136972893245722528342320.png

代码解释:

  • 该函数接受两个参数text和num_extra_spaces,分别表示输入的文本和要添加的多余空格的最大数量,默认值为5;
  • 使用random.randint生成一个介于0和num_extra_spaces之间的随机整数num_extra,表示要添加的多余空格数量;
  • 通过循环,每次随机选择一个位置,在该位置插入两个空格,从而为文本添加噪声。

6. 生成一条杂乱文本的函数。

def generate_messy_text():
    """
    生成一条杂乱文本。

    :return: 杂乱文本
    """
    text = ''
    num_parts = random.randint(1, 5)
    for _ in range(num_parts):
        part_type = random.choice(['word', 'sentence', 'html', 'special'])
        if part_type == 'word':
            text += generate_random_word() + ' '
        elif part_type == 'sentence':
            text += generate_random_sentence() + ' '
        elif part_type == 'html':
            text += random.choice(html_tags) + ' '
        elif part_type == 'special':
            text += random.choice(special_chars) + ' '
    text = add_noise(text)
    return text

09329602ec000fe81faac006ed7069fa.20250430091231.92841803886643263274350472360408.png

代码解释:

  • 该函数用于生成一条杂乱文本数据;
  • 首先随机确定·文本由多少各部分组成,范围是1到5个部分;
  • 对于每个部分,随机选择一种类型(单词、句子、HTML标签或特殊字符),并根据类型生成相应的内容添加到文本中;
  • 最后调用add_noise函数为文本添加多余空格噪声。

7. 生成指定数量的杂乱文本数量。

def generate_messy_texts(num_texts=500):
    """
    生成指定数量的杂乱文本。

    :param num_texts: 要生成的杂乱文本的数量
    :return: 包含杂乱文本的列表
    """
    return [generate_messy_text() for _ in range(num_texts)]

09329602ec000fe81faac006ed7069fa.20250430091233.11970999095169298086654998402252.png

  • 该函数接受一个参数num_texts,表示要生成的杂乱文本的数量,默认值为500;
  • 使用列表推导式调用generate_messy_text函数num_texts次,生成指定数量的杂乱文本,并将他们存储在一个列表中返回。

8. 将生成的文本列表保存到文件中。

def save_texts_to_file(texts, file_path):
    """
    将文本列表保存到文件中。

    :param texts: 文本列表
    :param file_path: 文件路径
    """
    try:
        with open(file_path, 'w', encoding='utf-8') as f:
            for text in texts:
                f.write(text.strip() + '\n')
        logging.info(f"成功将 {len(texts)} 条文本保存到 {file_path}")
    except Exception as e:
        logging.error(f"保存文件时出错: {e}")

09329602ec000fe81faac006ed7069fa.20250430091234.96309676601977054836821257153196.png

  • 该函数接受两个参数texts和file_path,分别表示文本列表和文件路径;
  • 使用with语句打开文件,以写入模式(w)和UTF-8编码打开文件;
  • 遍历文本列表,将每个文本去除首尾空格后写入文件,并在末尾添加换行符;
  • 如果保存成功,使用logging.info记录成功信息;如果出现异常,使用logging.error记录错误信息。

9. 设置主程序函数,运行完成后左侧会出现如图所示的保存列表文件。

if __name__ == "__main__":
    num_texts = 500
    file_path = 'mixed_messy_texts.txt'
    messy_texts = generate_messy_texts(num_texts)
    save_texts_to_file(messy_texts, file_path)

09329602ec000fe81faac006ed7069fa.20250430091235.11474278986992916733376612335813.png

09329602ec000fe81faac006ed7069fa.20250430091237.68685727606570046011979946011755.png

代码解释:

当脚本作为主程序运行时,会执行以下操作:

  • 设置要生成的杂乱文本的数量为500;
  • 设置保存文件的路径为mixed_messy_texts.txt;
  • 调用generate_messy_texts函数生成500条杂乱文本;
  • 调用save_texts_to_file函数将这些杂乱文本保存到指定文件中。

3.2 数据清洗代码编写

1.导入必要的库。

import re
from bs4 import BeautifulSoup

09329602ec000fe81faac006ed7069fa.20250430091238.70450457933612272292699774260716.png

代码解释:

  • re是Python的正则表达式模块,用于处理字符串的模式匹配和替换,后续会用它来去除文本中的特殊字符;
  • BeautifulSoup是一个用于解析HTML和XML文档的库,这里会用它来去除文本中的HTML标签。

2. 定义停用词列表。

09329602ec000fe81faac006ed7069fa.20250430091240.58657127212885376791600485265672.png

代码解释:

  • 停用词是在文本处理中通常被忽略的常见词汇,因为它们对文本的语义理解贡献不大。这里定义一个停用词列表,后续会在清洗文本时移除这些词。

3. 定义清洗文本函数。

# 清洗文本
def clean_text(text):
    # 去除 HTML 标签
    soup = BeautifulSoup(text, 'html.parser')
    text = soup.get_text()

    # 去除特殊字符
    text = re.sub(r'[^a-zA-Z0-9\s]', '', text)

    # 去除多余空格
    text = ' '.join(text.split())

    # 转换为小写
    text = text.lower()

    # 移除停用词
    words = text.split()
    filtered_words = [word for word in words if word not in stopwords]
    cleaned_text = ' '.join(filtered_words)

    return cleaned_text

09329602ec000fe81faac006ed7069fa.20250430091241.39109241269315895765087587939270.png

代码解释:

  • 去除HTML标签:使用BeautifulSoup解析输入的文本,然后通过get_text()方法提取纯文本内容,从而去除HTML标签;
  • 去除特殊字符:使用正则表达式[^a-Za-Z0-9\s]匹配所有非字母、非数字和非空字符,并将它们替换为空字符串;
  • 去除多余空格:先使用split()方法将文本按空格分割成单词列表,在使用join()方法将这些单词用单个空格连接起来,从而去除多余的空格;
  • 转换为小写:使用lower()方法将文本中所有字母转为小写,这样可以统一文本的大小写;
  • 移除停用词:将文本按空格分割成单词列表,然后使用列表推导式过滤掉在停用词列表中的单词,最后将过滤后的单词用空格连接成清洗后的文本。

4. 从文件读取数据并清洗保存。

# 从文件读取数据
try:
    with open('mixed_messy_texts.txt', 'r', encoding='utf-8') as f:
        messy_texts = f.readlines()
except FileNotFoundError:
    print("未找到 mixed_messy_texts.txt 文件,请先运行生成数据的脚本。")
else:
    # 清洗数据
    cleaned_texts = [clean_text(text.strip()) for text in messy_texts]

    # 保存清洗后的数据到文件
    with open('cleaned_texts.txt', 'w', encoding='utf-8') as f:
        for text in cleaned_texts:
            f.write(text + '\n')

09329602ec000fe81faac006ed7069fa.20250430091243.27896493378241313298647717393282.png

从文件中读取数据代码解释:

  • 使用try-except语句尝试打开名为mixed_messy_text.txt的文件,并以只读模式(’r’)和UTF-8编码读取文件内容;
  • readlines()方法将文件的每一行作为一个元素存储在列表messy_texts中,如果文件不存在,会捕获FileNotFoundError异常,并打印提示信息,提醒用户先运行生成数据的脚本。

清洗数据代码解释:

  • 清洗数据:使用列表推导式遍历mess_text列表中的每一行文本,调用clean_text()函数对每一行文本进行清洗,并将清洗后的文本存储在cleaned_texts列表中;
  • 保存清洗后的数据到文件:使用with语句写入模式(’w’)和UTF-8编码打开名为cleaned_texts.txt的文件,然后将cleaned_texts列表中的每一行文本写入文件,并在每行末尾添加换行符。

5. 清洗前后效果对比

清洗前:

09329602ec000fe81faac006ed7069fa.20250430091244.87961041998493248658753718587765.png

清洗后:

09329602ec000fe81faac006ed7069fa.20250430091246.76150586194492170877016423505678.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。