写点什么

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

  • 2025-08-22
    中国香港
  • 本文字数:4771 字

    阅读完需:约 16 分钟

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

1 概述

1.1 案例介绍

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


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

1.2 适用对象

  • 个人开发者

  • 高校学生

1.3 案例时间

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

1.4 案例流程


说明:


  1. 用户进入开发者空间配置 Notebook 环境;

  2. 进入 Notebook 进行数据清洗功能实现。

1.5 资源总览

本案例预计花费 0 元。


昇腾数据探险家:挖掘数据的隐藏宝藏👈👈👈体验最新完整版案例,请点击这里。

2 环境配置

2.1 开发者空间配置

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


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




3 数据清洗功能实现

3.1 数据集生成

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



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


import randomimport stringimport logging
# 配置日志记录logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
复制代码



代码解释:


  • 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']
复制代码



代码解释:


  • 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))
复制代码



代码解释:


  • 该函数接受两个参数 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
复制代码



代码解释:


  • 该函数接受两个参数 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
复制代码



代码解释:


  • 该函数接受两个参数 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
复制代码



代码解释:


  • 该函数用于生成一条杂乱文本数据;

  • 首先随机确定·文本由多少各部分组成,范围是 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)]
复制代码



  • 该函数接受一个参数 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}")
复制代码



  • 该函数接受两个参数 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)
复制代码




代码解释:


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


  • 设置要生成的杂乱文本的数量为 500;

  • 设置保存文件的路径为 mixed_messy_texts.txt;

  • 调用 generate_messy_texts 函数生成 500 条杂乱文本;

  • 调用 save_texts_to_file 函数将这些杂乱文本保存到指定文件中。

3.2 数据清洗代码编写

1.导入必要的库。


import refrom bs4 import BeautifulSoup
复制代码



代码解释:


  • re 是 Python 的正则表达式模块,用于处理字符串的模式匹配和替换,后续会用它来去除文本中的特殊字符;

  • BeautifulSoup 是一个用于解析 HTML 和 XML 文档的库,这里会用它来去除文本中的 HTML 标签。


2. 定义停用词列表。


# 定义一些停用词(简单示例)stopwords = ['the', 'and', 'is', 'in', 'it', 'of', 'to']
复制代码



代码解释:


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


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
复制代码



代码解释:


  • 去除 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')
复制代码



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


  • 使用 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. 清洗前后效果对比。


清洗前:



清洗后:



清洗前数据中存在异常值和一些特殊符号,在经过数据清洗后,只剩下文本内容,将异常值和特殊符号进行清洗,还同意大小写字母格式。


至此,昇腾数据探险家之挖掘数据的隐藏宝藏内容结束。


用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
昇腾数据探险家:挖掘数据的隐藏宝藏_数据清洗_华为云开发者联盟_InfoQ写作社区