如何解析电子邮件文本中的组件,如<称呼><正文><签名><回复文本>等?

7 投票
4 回答
5160 浏览
提问于 2025-04-16 17:46

我正在写一个分析电子邮件的应用程序,如果能找到一个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 个回答

1

首先想到的方法(不一定是最好的)就是用分割功能。这里有一点代码和一些内容。

linearray=emailtext.split('\n') 这行代码会把邮件内容按行分开,结果你会得到一个字符串数组,每个字符串就像一个段落。

所以linearray[0]会包含问候语。

确定回复文本开始的位置就有点棘手了,我注意到在它之前有两个换行符,所以可以从后面搜索这个换行符,看看最后一个换行符是否能指示回复文本的开始。

或者你可以存一些你可能会遇到的签名词,比如“谢谢”、“祝好”等等,从前面开始搜索这些词。

一旦你找到了签名的位置,剩下的就简单了。

希望这对你有帮助。

6

如果你根据每行文字里包含的单词类型来打分,你可能会得到一个相当不错的判断。

比如说,开头有问候词的那一行就是问候语(而且问候语里可能会有提到过去的短语,比如“上次见到你真好”)。

正文通常会包含像“电影、音乐会”这样的词。它还会有动词(比如“去、跑、走”等)以及问号和提议(例如“想要、我们可以吗、我们应该吗、偏好…”)。你可以查看 这个链接这个链接,还有 这个链接

签名部分会包含结束语。

如果你找到一个包含你想要结构的消息的数据源,你可以做一些频率分析,看看每个单词在每个部分出现的频率。

每个单词都会得到一个分数,比如 [问候分数,正文分数,签名分数,...]。例如,“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,...]。

然后,因为最大的数字在开头的问候分数位置,所以这个句子就是问候语。

如果你需要给某一行打分,以确定这行应该属于哪个部分,你就要把每个单词的分数加上去。

祝你好运,计算复杂度和准确性之间总是有权衡。如果你能找到一组好的单词,并建立一个好的模型来进行计算,这会很有帮助。

7

https://github.com/Trindaz/EFZP

这个项目提供了原问题中提到的功能,并且能够合理识别电子邮件区域,这些区域通常出现在使用常见电子邮件客户端(比如Outlook和Gmail)撰写的以英语为母语的人的邮件中。

撰写回答