我几乎完全是编程的局外人,只是对此感兴趣。 我在一家船舶经纪公司工作,需要匹配职位(哪艘船将在何时何地开放)和订单(在何地、何时需要什么样的船来从事什么样的工作)。 我们通过电子邮件向我们的委托(delegate)人和联合经纪人发送和接收此类信息(头寸和订单)。 每天有成千上万封这样的电子邮件。 我们通过手动阅读电子邮件来进行匹配。
我想构建一个应用来为我们进行匹配。
此应用程序的一个重要部分将从电子邮件文本中提取信息。
==> 我的问题是如何使用 Python 将非结构化信息提取为结构化数据。
订单电子邮件示例[括号中的注释,但不包含在电子邮件中]:
Email Subject: 20k dwt requirement, 20-30/mar, Santos-Conti
Content:
Acct ABC [Account Name]
Abt 20,000 MT Deadweight [Size of Ship Needed]
Delivery to make Santos [Delivery Point/Range, Owners will deliver the ship to Charterers here]
Laycan 20-30/Mar [Laycan (the time spread in which delivery can be accepted]
1 time charter with grains [What kind of Empolyment/Trade, Cargo]
Duration about 35 days [Duration]
Redelivery 1 safe port Continent [Redelivery Point/Range, Charterers will redeliver the ship back to Owners here.]
Broker name/email/phone...
End Email
上面的同一封电子邮件可以用多种不同的方式编写 - 有些写在一行中,有些使用 l/c 而不是 laycan... 并且有关于职位的电子邮件,其中包含船名、开放港口、日期范围、船舶载重量和其他规范。
如何使用 Python 提取信息并将其放入结构化数据中? 假设我已将所有电子邮件内容放入文本文件中。 谢谢。
最佳答案
下面是一种可能的方法:
第 1 步:使用邮件中的主题和/或消息对邮件进行分类。
正如您所说,一类是请求职位的邮件,另一类是订单邮件。 机器学习可用于分类。您可以使用一组以前的邮件作为训练语料库。您可能会考虑使用 NLTK(自然语言工具包)用于 Python。 Here是使用 NLTK 进行文本分类的链接。
第 2 步:一旦电子邮件被识别为订单邮件,处理它以获取详细信息(帐户名称、大小、时间差等)。正如您提到的,这里的挑战是这些数据没有固定格式。要解决这个问题,您可以考虑为每个标签准备一个详尽的同义词列表(比如帐户列表可能像 ['acct', 'a/c', 'account', 'acnt']
)。这应该通过检查固定数量的以前的邮件来完成一次。
为了使解决方案更有效,您可以考虑为 active learning 实现选项
(即,提示用户是否在邮件中找到了在任何列表中都找不到的标签。例如,在邮件中,如果使用了 "accnt"
,它将不会被解析,因此用户应该提示询问它属于哪个类别。)
识别标签后,您可以使用基本的字符串操作来解析电子邮件,以结构化格式获取相关数据。
可以引用this讨论以便更好地理解。
关于python - 使用 Python 从文本中提取信息到结构化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22604097/