文章目录
3. 数据清洗
由于之前从各旅游网站爬取的数据中包含很多非文本信息,比如表情,空格等,还有很多重复信息,比如转载的旅游文章等,因此,数据清洗是数据处理过程中极其重要的一环,数据清理程序能够处理TXT和JSON文件,移除无关字符、表情符号,并过滤包含广告关键词的文本。旨在提高数据的质量和一致性,从而为后续的数据分析、建模和决策提供可靠的基础。具体目的如下:
- 提高数据质量:通过删除无效数据、重复数据和不完整数据,确保数据的准确性和一致性。
- 去除噪声:去除无关字符、表情符号和广告信息,使数据更为简洁、纯净,有助于后续的文本分析和自然语言处理。
- 格式统一:统一数据格式,确保所有数据符合预期格式,从而便于进一步处理和分析。
- 减少误差:通过清洗数据,减少由于数据问题导致的分析误差,提高分析结果的可靠性和有效性。
- 提高效率:清洗后的数据更易于管理和处理,提升数据处理和分析的效率。
3.1 导入必要模块
import json
import re
import emoji
from collections import defaultdict
json
:用于处理JSON格式的数据。re
:正则表达式模块,用于文本模式匹配和替换。emoji
:用于处理表情符号。defaultdict
:从collections
模块中导入的字典子类,用于处理键值不存在的情况。
3.2 移除表情符号的函数
def remove_emoji(text):
"""Remove emoji from text."""
return emoji.replace_emoji(text, replace='')
emoji.replace_emoji(text, replace='')
:替换文本中的所有表情符号为空字符串,从而移除表情符号。
3.3 仅保留文本字符的函数
def only_text(text):
"""Remove all non-text characters, keeping only letters, numbers, common punctuation, and Chinese characters."""
return re.sub(r'[^\u4e00-\u9fa5A-Za-z0-9,.!?;:\s]', '', text)
r'[^\u4e00-\u9fa5A-Za-z0-9,.!?;:\s]'
:这段正则表达式匹配非中文字符(Unicode范围:\u4e00-\u9fa5)、非英文字母、非数字及非常见标点符号的字符,并将这些字符替换为空字符串。
3.4 过滤包含广告关键词的文本
下面是完整的代码块,然后我们将逐段进行分析:
def filter_ads(text, ad_keywords):
"""Filter out texts that contain any of the ad keywords."""
for keyword in ad_keywords:
if keyword.lower() in text.lower():
return False
return True
遍历广告关键词
for keyword in ad_keywords:
if keyword.lower() in text.lower():
return False
这一部分代码遍历广告关键词列表ad_keywords
。对于每个关键词,检查它是否出现在文本text
中。为了实现不区分大小写的比较,使用lower()
方法将关键词和文本都转换为小写。
for keyword in ad_keywords:
遍历ad_keywords
中的每个关键词。if keyword.lower() in text.lower():
检查关键词是否存在于文本中。如果存在,则返回False
,表示该文本包含广告关键词,不应被保留。
返回过滤结果
return True
如果遍历完所有关键词后,没有任何关键词出现在文本中,则返回True
,表示该文本不包含广告关键词,可以被保留。
通过这种方式,filter_ads
函数可以有效过滤包含任何广告关键词的文本。
3.5 综合清理文本的函数
以下是完整的代码块,随后将逐段进行详细分析:
def clean_text(text, ad_keywords):
"""Clean the text by removing emoji, keeping only text, and filtering ads."""
text = remove_emoji(text)
text = only_text(text)
if not filter_ads(text, ad_keywords):
return None
return text
去除表情符号
text = remove_emoji(text)
这行代码调用remove_emoji
函数,从文本中去除所有的表情符号。remove_emoji
函数的具体实现可能是使用正则表达式或其他方法来识别并移除文本中的表情符号。
保留纯文本
text = only_text(text)
这行代码调用only_text
函数,从文本中保留只有文字部分,去除所有非文字字符。only_text
函数的具体实现可能涉及正则表达式或其他文本处理技术。
过滤广告关键词
if not filter_ads(text, ad_keywords):
return None
这一部分代码调用filter_ads
函数,检查清理后的文本是否包含任何广告关键词。如果filter_ads
返回False
(即文本包含广告关键词),则clean_text
函数返回None
,表示该文本应被丢弃。
返回清理后的文本
return text
如果文本通过了广告关键词过滤,则clean_text
函数返回清理后的文本。
通过以上分析,我们详细解释了如何逐步清理文本,并使用广告关键词过滤函数确保最终输出的文本不包含任何广告内容。每段代码的逻辑和目的都进行了深入解析,以帮助更好地理解整个过程。
3.6 处理TXT文件
首先,先来看如何处理TXT文件。下面是完整的代码块,然后我将逐段进行分析:
def process_txt_file(file_path, ad_keywords):
"""Process a txt file and return cleaned and deduplicated lines."""
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
cleaned_lines = set()
for line in lines:
cleaned_line = clean_text(line.strip(), ad_keywords)
if cleaned_line:
cleaned_lines.add(cleaned_line)
return list(cleaned_lines)
读取TXT文件
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
这段代码打开指定路径的TXT文件,并将文件中的所有行读取到一个列表中。file_path
是文件的路径,encoding='utf-8'
确保以UTF-8编码读取文件。readlines()
方法将文件的每一行作为一个字符串元素存储在列表lines
中。
清理和去重文本行
cleaned_lines = set()
for line in lines:
cleaned_line = clean_text(line.strip(), ad_keywords)
if cleaned_line:
cleaned_lines.add(cleaned_line)
这一部分代码初始化一个空的集合cleaned_lines
来存储清理并去重后的文本行。通过遍历lines
列表,每行文本首先使用strip()
方法去除首尾的空白字符,然后调用clean_text
函数进行清理。clean_text
函数接受两个参数:待清理的文本行line
和广告关键词ad_keywords
。
如果clean_text
返回的cleaned_line
非空,则将其添加到cleaned_lines
集合中。集合(set)会自动去重,因此每行清理后的文本在
集合中只能出现一次,确保了最终输出的文本没有重复项。
返回清理后的文本列表
return list(cleaned_lines)
最后,将集合cleaned_lines
转换为列表并返回。这样,我们得到了清理并去重后的文本行列表。
处理前:
处理后:
可以看到 txt 中,一些没有用的代码比如 反斜杠n /n 反斜杠n+1 /n+1 都被清洗了
还有一些特殊符号比如NBSP等也被清洗掉。