使用TfidfVectorizer提取文本特征时如何去除URL干扰
TF-IDF过滤URL相关无效特征的方法
按操作成本从低到高选方案,组合使用效果最好:
扩展停用词表
你当前已经启用了内置英文停用词,只要把明确无意义的URL相关词汇加入停用词列表即可,能快速解决http/https权重过高的问题。代码修改如下:from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS # 补充需要过滤的URL相关高频词 url_related_stopwords = ['http', 'https', 'www', 'com', 'cn', 'org', 'net', 'edu'] all_stopwords = list(ENGLISH_STOP_WORDS) + url_related_stopwords vectorizer = TfidfVectorizer( input='content', lowercase=True, stop_words=all_stopwords, analyzer='word', max_features=50 )这个方法操作最简单,但只能覆盖你手动列出的词,URL中带的随机路径、特殊域名碎片、参数串无法被过滤。
预处理阶段全局清洗URL
这是最彻底的方案,在文本传入向量器之前就用正则把所有完整URL替换为空,从根源避免URL相关特征生成,不需要手动维护词表。清洗代码示例:import re def remove_url(text): # 匹配所有http/https开头、www开头的URL字符串 url_reg = re.compile(r'https?://\S+|www\.\S+') return url_reg.sub('', text) # 先对原始语料做批量清洗 cleaned_texts = [remove_url(text) for text in raw_texts] # 后续用清洗后的语料拟合向量器即可 vectorizer.fit(cleaned_texts)优先推荐用这个方案,能覆盖绝大多数格式的URL,不会漏过URL碎片生成的无效特征。
配置高频词自动过滤阈值
类似https这类在绝大多数样本中都出现的词,本身不具备分类区分度,可以通过max_df参数让向量器自动过滤这类过高文档频率的词,不需要手动枚举。修改后的初始化代码:vectorizer = TfidfVectorizer( input='content', lowercase=True, stop_words='english', analyzer='word', max_features=50, max_df=0.8 # 阈值可以根据语料调整,0.7~0.9区间都可以测试 )这个参数除了能过滤URL相关高频词,还能顺带筛掉其他无区分度的通用词汇,和前面的URL清洗步骤搭配使用,对朴素贝叶斯模型的准确率提升最明显。
实操建议:不要只靠加停用词解决问题,很多URL拆分后的随机字符串也会成为干扰特征,先做全量URL清洗,再配合max_df参数自动筛高频无效词,基本就能完全解决URL特征干扰的问题。
内容的提问来源于stack exchange,提问作者joeW
相关产品推荐
相关产品推荐

