Python爬虫索引:判断有效词汇与随机数据的启发式方法咨询
针对无效词汇/随机数据的启发式过滤方案
嘿,这个问题我做文本预处理时也碰到过!针对你爬虫索引里的无效内容,分享几个亲测有效的启发式过滤方法:
1. 过滤URL与路径类字符串
这类内容特征很明显,直接用正则匹配就能识别:
- 检查字符串是否以
http://、https://、//开头,或是包含多个/的路径结构 - 代码示例:
import re def is_url(token): url_pattern = re.compile(r'^(https?://|//|/\w+/)') return url_pattern.match(token) is not None
2. 过滤纯符号/重复字符串
像———-这类无意义符号串,可通过两个规则判断:
- 检查是否全部由非字母数字字符组成(单个标点比如逗号、句号可以保留)
- 检查字符重复率:如果超过80%的字符是同一个符号,直接过滤
- 代码示例:
def is_repeated_symbol(token): if len(token) < 2: return False # 全是非字母数字字符 if not any(c.isalnum() for c in token): return True # 单一字符重复组成 if len(set(token)) == 1: return True return False
3. 过滤随机乱码/无意义字符串
这类字符串没有语义规律,可通过多个维度判断:
- 长度阈值:超过30个字符且无空格的字符串,大概率是随机生成的
- 信息熵:熵值过高说明字符分布太随机,不符合自然语言规律(英文字符熵一般在1.5-3之间,超过3.5可判定为乱码)
- 词汇库匹配:用NLTK的英文词汇库校验,不在库中的陌生字符串进一步判断
- 代码示例:
import nltk from math import log2 nltk.download('words') english_words = set(nltk.corpus.words.words()) def is_random_gibberish(token): # 超长无空格字符串直接过滤 if len(token) > 30 and ' ' not in token: return True # 词汇库匹配(忽略大小写) if token.lower() not in english_words: # 计算信息熵 char_counts = {} for c in token: char_counts[c] = char_counts.get(c, 0) + 1 entropy = 0.0 total = len(token) for count in char_counts.values(): prob = count / total entropy -= prob * log2(prob) # 熵值过高判定为乱码 if entropy > 3.5: return True return False
4. 过滤Base64编码字符串
像iazl+xcmwzc3da==这类Base64有明显特征:
- 只包含Base64允许的字符(A-Z, a-z, 0-9, +, /),结尾可能带
= - 长度是4的倍数
- 代码示例:
def is_base64(token): base64_pattern = re.compile(r'^[A-Za-z0-9+/]+={0,2}$') return base64_pattern.match(token) is not None and len(token) % 4 == 0
5. 综合过滤流程
把上面的方法组合起来,在分词后对每个token做校验:
def is_valid_token(token): if is_url(token): return False if is_repeated_symbol(token): return False if is_base64(token): return False if is_random_gibberish(token): return False # 还可以扩展:比如只保留名词、动词等有效词性(用NLTK词性标注) return True # 使用示例 from nltk.tokenize import word_tokenize extracted_text = "你的爬虫提取的可见文本内容" tokens = word_tokenize(extracted_text) valid_tokens = [t for t in tokens if is_valid_token(t)]
另外,你可以根据爬取的目标网站调整规则——比如爬科技博客时,可能需要保留技术术语(这类术语可能不在NLTK词汇库),这时候可以手动维护白名单,或者用更精准的词性标注来过滤。
内容的提问来源于stack exchange,提问作者J. Taylor




