You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动