如何清洗pandas应用评论数据集中的无意义文本用于情感分析
Pandas大规模应用评论乱码文本过滤方案
你可以根据自己对准确率和速度的需求,选择以下组合方案处理253万行数据集:
首先在Colab环境安装所需依赖:
# 仅首次运行需要执行 !pip install langdetect swifter import pandas as pd import re import nltk from nltk.corpus import words from langdetect import detect nltk.download('words') english_word_set = set(words.words())
1. 已知乱码黑名单快速过滤
如果已经有确定的无意义词汇列表,可以先做精确匹配过滤,速度最快:
# 你问题中提到的已知乱码可以直接加入黑名单 gibberish_blacklist = {'wefcxz', 'dfghjja', 'udsx nnnn 012mmmm'} # 过滤掉完全匹配黑名单的行 df = df[~df['content'].str.strip().isin(gibberish_blacklist)]
2. 基于规则的模糊过滤(适合特征明显的未知乱码)
针对连续无意义字符、重复字符、字母数字无意义拼接这类典型乱码,用正则规则快速筛选:
def is_gibberish(text): # 空值直接判定为无效 if pd.isna(text): return True text = text.strip() # 过短内容(小于3个字符,阈值可根据需求调整) if len(text) < 3: return True # 匹配全是重复字符的情况:比如aaaaa、mmmm if re.match(r'^(.)\1+$', text): return True # 匹配无空格纯字母组合且长度超过7,同时不在英文词典中的内容 if re.match(r'^[a-zA-Z]{7,}$', text) and text.lower() not in english_word_set: return True # 元音字母占比低于15%的长文本大概率是乱码(正常英文元音占比约30%-40%) vowel_ratio = len(re.findall(r'[aeiouAEIOU]', text)) / len(text) if vowel_ratio < 0.15: return True return False # 过滤乱码行 df_clean = df[~df['content'].apply(is_gibberish)].copy()
3. 基于英文校验的精准过滤(适合高准确率需求)
如果规则过滤漏判较多,可以结合英文单词占比和语言检测,判断内容是不是有效英文:
def is_valid_review(text): if pd.isna(text): return False text = text.strip().lower() # 拆分文本为单词 word_list = re.findall(r'[a-zA-Z]+', text) if len(word_list) == 0: return False # 有效英文单词占比超过60%判定为有效内容,阈值可调整 valid_ratio = sum(1 for word in word_list if word in english_word_set) / len(word_list) if valid_ratio > 0.6: return True # 语言检测校验是否为英文 try: return detect(text) == 'en' except: return False df_clean = df[df['content'].apply(is_valid_review)].copy()
4. 大规模数据性能优化建议
- 用
swifter库替代原生apply,自动利用CPU多核心并行处理,250万行数据处理时间可缩短到分钟级:
import swifter df_clean = df[~df['content'].swifter.apply(is_gibberish)].copy()
- 如果后续数据量继续增大,可以转用PySpark分布式处理,效率更高。
内容的提问来源于stack exchange,提问作者PaulPolino
相关产品推荐
相关产品推荐

