与风景对话_交互式旅游推荐系统_数据收集与预处理_05

3. 数据清洗

由于之前从各旅游网站爬取的数据中包含很多非文本信息,比如表情,空格等,还有很多重复信息,比如转载的旅游文章等,因此,数据清洗是数据处理过程中极其重要的一环,数据清理程序能够处理TXT和JSON文件,移除无关字符、表情符号,并过滤包含广告关键词的文本。旨在提高数据的质量和一致性,从而为后续的数据分析、建模和决策提供可靠的基础。具体目的如下:

  1. 提高数据质量:通过删除无效数据、重复数据和不完整数据,确保数据的准确性和一致性。
  2. 去除噪声:去除无关字符、表情符号和广告信息,使数据更为简洁、纯净,有助于后续的文本分析和自然语言处理。
  3. 格式统一:统一数据格式,确保所有数据符合预期格式,从而便于进一步处理和分析。
  4. 减少误差:通过清洗数据,减少由于数据问题导致的分析误差,提高分析结果的可靠性和有效性。
  5. 提高效率:清洗后的数据更易于管理和处理,提升数据处理和分析的效率。

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等也被清洗掉。

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值