识别字符串Python中的相似性和模式

2024-09-28 20:38:02 发布

您现在位置:Python中文网/ 问答频道 /正文

这就是我要解决的用例。在

我有一个服务的垃圾邮件订阅列表,他们正在扼杀转化率和其他可用性研究。在

插入的电子邮件如下所示:

rogerep_dyeepvu@hotmail.com

rogeram_ingramameb@hotmail.com

rogerew_jonesewct@hotmail.com

roger[...]_surname[...]@hotmail.com


您对使用自动脚本识别这些条目有何建议?感觉比实际看起来要复杂一点。在

非常感谢您的帮助!在


Tags: com列表电子邮件垃圾邮件用例可用性roger转化率
3条回答

听起来像是正则表达式的工作:

if re.match("^roger[a-z]+_[a-z]+@hotmail.com$", email_address):
    # might be your spammer

(如果您从未使用过正则表达式,下面是对其含义的简要说明:^匹配字符串的开头,$匹配结尾,因此我们要求这些符号之间的所有内容都是描述整个字符串的模式。[a-z]匹配任何小写字母,+表示“一次或多次”,因此[a-z]+匹配一个或多个小写字母。总而言之,如果字符串可以描述为“字符串的开头,后跟字母roger,后跟一个或多个小写字母,后跟下划线,后跟一个或多个小写字母,然后是@hotmail.com,然后是字符串的结尾。”如果正则表达式匹配,电子邮件地址符合您在问题中描述的模式。)

当然,如果他发现并改变了他的模式(例如,通过切换名字),这个方法将失败,你将不得不依靠更传统的垃圾邮件预防技术,如使用验证码。在

我认为你除了把它标记为一个潜在的问题外,别无选择:

^roger([a-z]{2})_([a-z]+)@hotmail.com

使用regular expressions,如果这是垃圾邮件发送者重复使用的模式。在

看起来他们在roger后面使用了2个小写字母字符,所以我已经在其中构建了它。不确定如何匹配他们使用的姓氏词典,因此匹配最后一部分(看起来是姓氏,然后是4个小写字母字符)可能很难,尽管您可以:

^{pr2}$

假设他们所有的姓氏中至少有一个字符。在

我不认为你能轻易查到这个。这不太可能是一个简单的字符串匹配问题,您可以抛出一个正则表达式,因为我猜您使用的名称'Roger'只是一个例子,并且任何数量的名称都可以出现在这个位置。您还可以运行其他海报提供的一个正则表达式,用明显的名字和姓氏的每个排列来参数化它。“肯定”和“错误”之间可能要花太长时间。在

另一种方法,与您在上面发布的模式一起工作,就是获取用户名的最后4个字母,并将它们与其他内容进行比较。通过训练合法文本上的马尔可夫链,可以识别随机字符,而不是合理排列的字符(给定特定语言),然后可以计算给定的4个字母在该语言中按该顺序出现的概率。对于随机字母,这种概率通常远低于合法名称(尽管如果其中有特殊字符或数字,则所有赌注都将被取消)。在

另一种方法可能是使用贝叶斯过滤器(例如,Python中的Reverend之类的东西,尽管还有其他的)根据合法电子邮件地址的最后4个字母进行训练。这可能会发现95%的数据是随机的,前提是你让数据可用。不只是提交4个字母,而是每个2个字母和3个字母的子字符串,以捕捉每个字母的上下文。不过,我不认为这会像马尔科夫风格的方法那样有效。在

无论你做什么检查,你都可以通过只提交特定的电子邮件地址来减少误报(例如,只有那些在webmail地址中包含下划线的地址,在下划线之前至少有3个字符,在下划线之后至少有5个字符。)

但最终,你永远无法知道它是垃圾邮件地址还是真实地址,除非它被用于某个目的。因此,如果可能的话,我建议放弃尝试分析内容,在其他地方解决问题。他们以什么方式扼杀了转化率?如果你用某种度量来计算这些虚拟帐户,那么最好先添加一个验证阶段,只关心通过验证的帐户的度量。有些人确实有这样的地址rogerep_dyeepvu@hotmail.com,毕竟。在

相关问题 更多 >