基于二元标签提取重复字符,实现联盟URL自动检测方案问询
问题概述
现有带人工标注二元标签(affiliate=1为联盟营销URL,affiliate=0为非联盟营销URL)的URL数据集,需完成以下目标:
- 提取联盟营销URL中重复出现的特征字符串
- 筛选出仅(或基本仅)出现在联盟营销URL中的特征
- 基于上述特征实现大规模URL的自动标注
技术解决方案
以下基于R语言实现完整流程,适配你提供的数据集格式:
1. 数据预处理
先合并数据集并提取URL的查询参数部分(联盟营销特征大多集中在?之后的参数中):
# 合并两个数据集 da_combined <- rbind(da_affiliate, da_affiliate_no) # 加载字符串处理工具包 library(stringr) # 提取URL中?之后的查询参数部分,无参数则设为空字符串 da_combined$query_part <- str_extract(da_combined$url, "\\?(.*)$") da_combined$query_part <- ifelse(is.na(da_combined$query_part), "", da_combined$query_part)
2. 提取联盟URL中的高频特征
方法一:提取高频查询参数键
联盟URL的查询参数键(如utm_source、aff_fcid)是最直接的特征:
# 定义函数:从查询字符串中提取所有参数键 extract_query_keys <- function(query_str) { if(query_str == "") return(character(0)) pairs <- str_split(query_str, "&")[[1]] keys <- str_remove(pairs, "=.*$") return(keys) } # 提取所有联盟URL的参数键并统计频率 affiliate_keys <- unlist(lapply(da_affiliate$query_part, extract_query_keys)) key_freq <- table(affiliate_keys) # 筛选出现次数≥2的高频键 high_freq_keys <- names(key_freq[key_freq >= 2])
方法二:提取重复子字符串(N-Gram)
若需更长的特征组合(如utm_medium=affiliate),可使用N-Gram方法:
library(tm) library(RWeka) # 生成3-8长度的子字符串(可根据需求调整长度范围) tokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 8)) # 提取所有联盟URL的N-Gram并统计频率 aff_ngrams <- unlist(lapply(VCorpus(VectorSource(da_affiliate$url)), tokenizer)) ngram_freq <- table(aff_ngrams) # 筛选出现次数≥2的高频N-Gram high_freq_ngrams <- names(ngram_freq[ngram_freq >= 2])
3. 筛选专属联盟特征
过滤掉在非联盟URL中出现的特征,保留仅属于联盟URL的部分:
过滤参数键
# 提取非联盟URL的参数键 non_affiliate_keys <- unlist(lapply(da_affiliate_no$query_part, extract_query_keys)) # 找出仅在联盟URL中出现的参数键 unique_aff_keys <- setdiff(high_freq_keys, non_affiliate_keys)
过滤N-Gram特征
# 提取非联盟URL的N-Gram non_aff_ngrams <- unlist(lapply(VCorpus(VectorSource(da_affiliate_no$url)), tokenizer)) # 找出仅在联盟URL中出现的N-Gram,同时过滤掉随机长数字串 unique_aff_ngrams <- setdiff(high_freq_ngrams, non_aff_ngrams) unique_aff_ngrams <- unique_aff_ngrams[!str_detect(unique_aff_ngrams, "\\d{5,}")]
4. 构建自动标注函数
基于筛选出的特征,编写函数自动判断URL是否为联盟营销URL:
# 定义标注函数 is_affiliate <- function(url) { query_part <- str_extract(url, "\\?(.*)$") query_part <- ifelse(is.na(query_part), "", query_part) # 检查是否包含专属参数键 has_key <- any(str_detect(query_part, paste0("^|&", unique_aff_keys, "="))) # 检查是否包含专属N-Gram特征 has_ngram <- any(str_detect(url, unique_aff_ngrams)) # 满足任一条件则标记为联盟URL return(as.integer(has_key || has_ngram)) } # 测试示例 test_urls <- c( "https://example.com/product?utm_source=affiliate", "https://example.com/normal-product" ) sapply(test_urls, is_affiliate)
5. 优化与迭代
- 规则补充:可添加联盟跳转域名检测(如
t.adcell.com、mydealz.digidip.net),进一步提升准确率 - 模型增强:若规则标注存在模糊案例,可基于提取的特征训练朴素贝叶斯、随机森林等分类模型
- 效果验证:用标注集计算混淆矩阵,调整特征筛选阈值(如提高高频特征的出现次数要求)
内容的提问来源于stack exchange,提问作者Scijens
相关产品推荐
相关产品推荐

