昇腾数据探险家:挖掘数据的隐藏宝藏
1.1 案例介绍
数据清洗(Data Cleansing)是指对数据进行处理和纠错,以去除或修复数据集中存在的错误、不一致、不完整和冗余的数据,从而使数据更加准确、可靠和可用。数据清洗是数据处理和数据分析中一个非常重要的步骤,它可以帮助我们提高数据的质量,从而提高数据分析和机器学习的准确性和可靠性。
本案例选择PyThon所及生成杂乱数据及清洗作为示例,通过实际操作,让大家深入了解如何利用Python中预装的库来进行数据清洗。在这个过程中,大家将学会从数据生成到数据清洗全流程。
1.2 适用对象
- 个人开发者
- 高校学生
1.3 案例时间
本案例总时长预计30分钟。
1.4 案例流程
说明:
- 用户进入开发者空间配置Notebook环境;
- 进入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界面。
3 数据清洗功能实现
3.1 数据集生成
打开Notebook后,点击笔记本下方的Python3,将以下代码复制到代码行中。
1. 导入必要的库,并配置日志记录,复制完毕后,点击上方三角运行符号运行代码。
import random
import string
import 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 re
from bs4 import BeautifulSoup
代码解释:
- re是Python的正则表达式模块,用于处理字符串的模式匹配和替换,后续会用它来去除文本中的特殊字符;
- BeautifulSoup是一个用于解析HTML和XML文档的库,这里会用它来去除文本中的HTML标签。
2. 定义停用词列表。
代码解释:
- 停用词是在文本处理中通常被忽略的常见词汇,因为它们对文本的语义理解贡献不大。这里定义一个停用词列表,后续会在清洗文本时移除这些词。
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. 清洗前后效果对比
清洗前:
清洗后:
- 点赞
- 收藏
- 关注作者
评论(0)