问题描述
我目前正在尝试匹配电子邮件的“发件人”标头中找到的2个值。 具体来说,发件人名称和电子邮件ID。为了说明这里,是此标头内容的示例:
"Surname Lastname" <surname.lastname@company_domain.co.uk>
所以我要匹配的两个部分是:
发件人姓名:姓氏
和
电子邮件ID: surname.lastname@company_domain.co.uk
对于上下文,这是较大的自动化python工作流程的一部分,该工作流程旨在根据几种不同的标准来检测垃圾邮件。任何曾经使用过垃圾邮件检测和电子邮件过滤功能的人都知道,电子邮件标头中的值可能包含截然不同的值和格式(这一点已开始使我非常烦恼)。以下是我用作测试数据的电子邮件发件人标题的一些稍作修改的示例。百分比取自相似的测试数据,因此,如果要使用它们,可能会有一些细微的差别,但是我已经确保保持长度和字符集,因此应该足够接近。
"Angelina Wolfe" <[email protected]> # (81%)
"David.se" <[email protected]> # (55%)
"ZoomInfo Notification" <nor[email protected]> # (50%)
"[email protected]" <[email protected]> # (100%)
"Golgin Gurlukovich" <[email protected]> # (31%)
这些都是有效的匹配项(尽管有些可以视为垃圾邮件)。要获得每个示例的100%正确匹配是非常困难的,所以我正在尝试使用一个名为fuzzywuzzy的python库进行接近匹配(〜70%)。我的代码当前如下所示:
from fuzzywuzzy import fuzz
# Data is extracted earlier with regexp from EML files.
# The sender and email_id will always be from the same EML file here so no mismatch is possible.
tmp_sender = self.headers['sender'].lower().strip() # sender name
tmp_emailID = self.headers['email_id'].lower().strip() # email_id
sender_fuzz_ratio = fuzz.partial_ratio(tmp_sender,tmp_emailID) # fuzzywuzzy confidence calculation
if tmp_sender == tmp_emailID or tmp_sender in tmp_emailID: # Naive check if sender matches email_id
self.verdict['Sender_fields_check'] = "Sender name '{}' matched email_id '{}'".format(self.iocs['sender'],self.iocs['email_id'])
elif sender_fuzz_ratio >= 70: # Fuzzy check if sender matches email_id # Todo: Tweak me if needed.
self.verdict['Sender_fields_check'] = "Sender name {} is a probable match for email_id {},fuzz ratio confidence: {}%".format(self.iocs['sender'],self.iocs['email_id'],sender_fuzz_ratio)
else:
self.verdict['Sender_fields_check'] = "Sender name {} does probably not match email_id {},fuzzy match confidence: {}%".format(self.iocs['sender'],sender_fuzz_ratio)
self.verdict['Final_verdict'] = "Spam" # If it does not look like a match then we classify as spam.
return self.verdict
所以从根本上说,在目前的状态下还不够好,我希望就如何提高比赛的信心提出建议。匹配正确是很重要的,但宽容不匹配同样重要
一种方法是为fuzzywuzzy选择不同的算法,但从长远来看,我不确定哪种算法从平衡的角度来看最好。另一个选择是使用fuzzywuzzy组合多个检查,然后以平均为基础...或者,如果有一种完全不同的方法可以更好地做到这一点,请分享,我想知道更多。欢迎提出任何改进建议,如果我不清楚,请让我知道,我会尽力澄清。
感谢您阅读我的问题,干杯!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)