使用Python从文本中提取结构化数据
我对编程几乎一无所知,只是对它感兴趣。
我在一家船舶经纪公司工作,需要把船的位置(哪艘船在什么地方开放,什么时候开放)和订单(什么类型的船在什么地方、什么时候需要,做什么工作)进行匹配。
我们通过电子邮件与我们的客户和合作经纪人发送和接收这些信息(位置和订单)。
每天有成千上万封这样的邮件。
我们是通过手动阅读邮件来进行匹配的。
我想开发一个应用程序来帮助我们进行匹配。
这个应用程序的一个重要部分是从邮件文本中提取信息。
==> 我的问题是如何使用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 个回答
下面是一种可能的方法:
第一步:根据邮件的主题和/或内容将邮件分类。
就像你提到的,一类邮件是请求职位的,另一类是订单邮件。可以使用机器学习来进行分类。你可以用一些以前的邮件作为训练数据。可以考虑使用Python的NLTK(自然语言工具包)。这里有关于使用NLTK进行文本分类的链接。
第二步:一旦识别出一封邮件是订单邮件,就需要处理它以获取详细信息(比如账户名、大小、时间范围等)。正如你提到的,这里面临的挑战是这些数据没有固定的格式。为了解决这个问题,你可以考虑为每个标签准备一个详尽的同义词列表(比如对于账户,列表可以是 ['acct', 'a/c', 'account', 'acnt']
)。这一步只需要做一次,可以通过查看一定数量的以前邮件来完成。
为了让解决方案更有效,你可以考虑实现一种主动学习的选项(也就是说,如果在邮件中发现了一个不在任何列表中的标签,就提示用户。例如,如果邮件中使用了 "accnt"
,而这个词没有被识别,那么就应该提示用户询问它属于哪个类别。)
一旦识别出标签,你可以使用基本的字符串操作来解析邮件,并以结构化的格式提取相关数据。
你可以参考这个讨论,以便更好地理解。