请建议使用Python对电子邮件标题字符串值进行模糊匹配的改进
我目前正在尝试匹配在电子邮件的“发件人”标题中找到的2个值。 具体而言,是发件人名称和电子邮件ID。以下是此标题内容的示例:请建议使用Python对电子邮件标题字符串值进行模糊匹配的改进,python,spam,email-headers,fuzzywuzzy,fuzzy-comparison,Python,Spam,Email Headers,Fuzzywuzzy,Fuzzy Comparison,我目前正在尝试匹配在电子邮件的“发件人”标题中找到的2个值。 具体而言,是发件人名称和电子邮件ID。以下是此标题内容的示例: “姓氏姓氏” 所以我想匹配的两个部分是: 发件人姓名:姓氏Lastname 及 电子邮件地址:姓氏。lastname@company_domain.co.uk 在上下文中,这是一个更大的自动化python工作流的一部分,该工作流旨在根据几个不同的标准检测垃圾邮件。任何曾经从事过垃圾邮件检测和电子邮件过滤的人都知道,电子邮件标题中的值可能包含非常不同的值和格式(这让我开始非
“姓氏姓氏”
所以我想匹配的两个部分是:
发件人姓名:姓氏Lastname
及
电子邮件地址:姓氏。lastname@company_domain.co.uk
在上下文中,这是一个更大的自动化python工作流的一部分,该工作流旨在根据几个不同的标准检测垃圾邮件。任何曾经从事过垃圾邮件检测和电子邮件过滤的人都知道,电子邮件标题中的值可能包含非常不同的值和格式(这让我开始非常烦恼)。下面是我用作测试数据的电子邮件发送者标题的一些稍微修改的示例。百分比取自类似的测试数据,因此如果使用它们,可能会有一些小的差异,但我已确保保持长度和字符集,因此应该足够接近
"Angelina Wolfe" <angelina.wolfe@luxatiainternational.net> # (81%)
"David.se" <david@datatracks.se> # (55%)
"ZoomInfo Notification" <noreply@m.zoominfo-privacy.com> # (50%)
"jackie.cobin2015@yahoo.in" <jackie.cobin2015@yahoo.in> # (100%)
"Golgin Gurlukovich" <gg@acorn.ru> # (31%)
所以基本上,在目前的状态下还不够好,我希望能得到一些关于如何提高比赛信心的建议。虽然比赛是正确的很重要,但同样重要的是比赛不能太过宽大
一种方法是为fuzzyfuzzy选择一种不同的算法,但从长远来看,从平衡的角度来看,我不确定哪种算法最好。另一种选择是使用fuzzywuzzy组合多个检查,然后基于平均值。。。或者,如果有一种完全不同的方法来做得更好,那么请分享,我很想知道更多。欢迎提出任何和所有改进建议,如果我不清楚,请让我知道,我会尽力澄清
感谢您阅读我的问题,干杯强>
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'],self.iocs['email_id'], sender_fuzz_ratio)
self.verdict['Final_verdict'] = "Spam" # If it does not look like a match then we classify as spam.
return self.verdict