如何解析电子邮件文本中的组件,如<称呼><正文><签名><回复文本>等?
我正在写一个分析电子邮件的应用程序,如果能找到一个Python库,能够把邮件内容拆分成一些命名的部分,比如<称呼><正文><签名><回复内容>
等等,那就能省我很多时间。
举个例子,下面这段文字"嗨,Dave,\n我们这周二见面吧\n祝好,Tom\n\n在2011年5月15日星期日,下午5:02,Dave Trindall写道:嘿,Tom,\n我们一起聚聚怎么样...
"可以被拆分成
Salutation: "Hi Dave,\n"
Body: "Lets meet up this Tuesday\n"
Signature: "Cheers, Tom\n\n"
Reply Text: "On Sunday, 15 May 2011 at 5:02 PM, Dave Trindal wrote: ..."
我知道这种问题没有完美的解决方案,但即使有一个能做到大致拆分的库也会很有帮助。我该去哪里找这样的库呢?
4 个回答
首先想到的方法(不一定是最好的)就是用分割功能。这里有一点代码和一些内容。
linearray=emailtext.split('\n') 这行代码会把邮件内容按行分开,结果你会得到一个字符串数组,每个字符串就像一个段落。
所以linearray[0]会包含问候语。
确定回复文本开始的位置就有点棘手了,我注意到在它之前有两个换行符,所以可以从后面搜索这个换行符,看看最后一个换行符是否能指示回复文本的开始。
或者你可以存一些你可能会遇到的签名词,比如“谢谢”、“祝好”等等,从前面开始搜索这些词。
一旦你找到了签名的位置,剩下的就简单了。
希望这对你有帮助。
如果你根据每行文字里包含的单词类型来打分,你可能会得到一个相当不错的判断。
比如说,开头有问候词的那一行就是问候语(而且问候语里可能会有提到过去的短语,比如“上次见到你真好”)。
正文通常会包含像“电影、音乐会”这样的词。它还会有动词(比如“去、跑、走”等)以及问号和提议(例如“想要、我们可以吗、我们应该吗、偏好…”)。你可以查看 这个链接 和 这个链接,还有 这个链接。
签名部分会包含结束语。
如果你找到一个包含你想要结构的消息的数据源,你可以做一些频率分析,看看每个单词在每个部分出现的频率。
每个单词都会得到一个分数,比如 [问候分数,正文分数,签名分数,...]。例如,“hello”可能在问候中出现900次,在正文中出现10次,在签名中出现3次。这就意味着“hello”的分数是 [900, 10, 3, ...]。而“cheers”可能是 [10, 3, 100, ...]。
这样你就会有一个大约500,000个单词的列表。那些没有大范围的单词就没什么用。比如“catch”可能是 [100, 101, 80...],范围是21(“很高兴能见到你”、“想去抓鱼”、“再见”)。这个词可以出现在任何地方。
现在你可以把单词数量减少到大约10,000个。
接下来,对于每一行,也给它一个分数,格式也是 [问候分数,正文分数,签名分数,...]。
这个分数是通过把每个单词的向量分数相加来计算的。
例如,一个句子“hello cheers for giving me your number”可以表示为: [900, 10, 3, ...] + [10, 3, 100, ...] + ... + ... = [900+10+..., 10+3+..., 3+100,...] = [1023, 900, 500,...]。
然后,因为最大的数字在开头的问候分数位置,所以这个句子就是问候语。
如果你需要给某一行打分,以确定这行应该属于哪个部分,你就要把每个单词的分数加上去。
祝你好运,计算复杂度和准确性之间总是有权衡。如果你能找到一组好的单词,并建立一个好的模型来进行计算,这会很有帮助。
https://github.com/Trindaz/EFZP
这个项目提供了原问题中提到的功能,并且能够合理识别电子邮件区域,这些区域通常出现在使用常见电子邮件客户端(比如Outlook和Gmail)撰写的以英语为母语的人的邮件中。