如何解析<salutation> <signature> <reply text =“”>等组件的电子邮件文本?</reply> </signature> </salutation>

时间:2011-05-17 01:00:11

标签: python email email-parsing email-processing

我正在编写一个分析电子邮件的应用程序,如果我可以使用python库将电子邮件文本解析为<salutation><body><signature><reply text>之类的命名组件,那么这将节省我一些时间。

例如,以下文本“Hi Dave,\nLets meet up this Tuesday\nCheers, Tom\n\nOn Sunday, 15 May 2011 at 5:02 PM, Dave Trindall wrote: Hey Tom,\nHow about we get together ...”将被解析为

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 个答案:

答案 0 :(得分:5)

https://github.com/Trindaz/EFZP

这提供了原始问题中提供的功能,以及电子邮件区域的公平识别,因为它们通常出现在由Outlook和Gmail等常见电子邮件客户端的英语母语人士撰写的电子邮件中。

答案 1 :(得分:3)

如果您根据其中包含的单词类型对每一行进行评分,则可能会得到相当好的指示。

E.G。在开头附近有问候语的一行是称呼(也有称呼可能有短语指的是过去时,例如上次见到你很好)

一个身体通常会包含诸如“电影,音乐会”等词语。它还会包含动词(去,跑,走等)和问题标记和产品(例如,想要,我们可以,我们是否应该更喜欢..)。 查看http://nodebox.net/code/index.php/Linguistics#verb_conjugation http://ogden.basic-english.org/ http://osteele.com/projects/pywordnet/

签名将包含结束语。

如果您发现数据源包含您想要的结构消息,您可以进行一些频率分析,以查看每个单词在每个部分中出现的频率。

每个单词都会得分[称呼分数,身体分数,签名分数......] 例如问候可以在称呼中发生900次,在体内发生10次,在签名中发生3次。 这意味着你好会被分配[900,10,3,..] 欢呼声可能会被分配[10,3,100,..]

现在你将有一个大约500,000字的大型列表。 没有大范围的单词没用。 例如catch可能有[100,101,80 ..] = 21的范围 (赶上去很好,想去抓鱼,后来赶上你)。捕获可以发生在任何地方。

现在,您可以将字数减少到大约10,000

现在对于每一行,给该行一个得分的形式[称呼得分,身体得分,签名得分,......]

这个分数是通过添加每个单词的矢量分数来计算的。

e.g。一句话“你好欢呼给我你的号码”可以是: [900,10,3,..] + [10,3,100,..] + .. + .. + = [900 + 10 + ..,10 + 3 + ..,3 + 100,..] = [1023,900,500,..]说

然后因为最大数字是在称呼分数位置的开头,这句话是一种称呼。

然后,如果你必须对你的一条线进行评分,看看该线应该在哪个组成部分,对于你要在其得分上添加的每个单词

祝你好运,计算复杂性和准确性之间始终存在权衡。如果你能找到一套好的单词,并根据你的计算建立一个好的模型,那将会有所帮助。

答案 2 :(得分:1)

首先想到的方法(不一定是最好的......)将首先使用split。这里有一些代码和东西

linearray = emailtext.split( '\ n') 现在你有一个字符串数组,每个字符串都像段落或其他什么

所以linearray [0]会包含称呼

决定回复文本的开始位置有点棘手,我注意到它之前有一个双重换行符,所以可能从后面搜索它,并希望最后一个表示回复文本的开头。

或者存储一些您可能期望的签名词,并搜索前面的那些,如欢呼,问候等等。

一旦你弄清楚签名的位置,其余的就很容易了

希望这有帮助

答案 3 :(得分:0)

我为此实际构建了一个非常便宜的API,用于解析电子邮件和电子邮件链的签名中的联系人数据。它被称为SigParser。您可以看到Swagger文档here

基本上你发送一个标题&#39; x-api-key&#39;使用像这样的JSON主体,它解析电子邮件回复链中的所有联系人。

{
  "subject": "Thanks for meeting...",
  "from_address": "bgates@example.com",
  "from_name": "Bill Gates",
  "htmlbody": "<div>Hi, good seeing you the other day.</div><div>--</div><div>Bill Gates</div><div>Cell 777-444-8888</div><a href=\"https://www.linkedin.com/in/williamhgates/\">LinkedIn</a><a href=\"https://twitter.com/BillGates\">Twitter</a>",
  "plainbody": "Hi, good seeing you the other day. \r\n--\r\nBill Gates\r\nCell 777-444-8888",
  "date": "Mon, 28 May 2018 23:33:40 +0000 (UTC)"
}