使用Python从文本中提取结构化数据

4 投票
1 回答
3704 浏览
提问于 2025-04-17 23:37

我对编程几乎一无所知,只是对它感兴趣。
我在一家船舶经纪公司工作,需要把船的位置(哪艘船在什么地方开放,什么时候开放)和订单(什么类型的船在什么地方、什么时候需要,做什么工作)进行匹配。
我们通过电子邮件与我们的客户和合作经纪人发送和接收这些信息(位置和订单)。
每天有成千上万封这样的邮件。
我们是通过手动阅读邮件来进行匹配的。

我想开发一个应用程序来帮助我们进行匹配。

这个应用程序的一个重要部分是从邮件文本中提取信息。

==> 我的问题是如何使用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 个回答

1

下面是一种可能的方法:

第一步:根据邮件的主题和/或内容将邮件分类。

就像你提到的,一类邮件是请求职位的,另一类是订单邮件。可以使用机器学习来进行分类。你可以用一些以前的邮件作为训练数据。可以考虑使用Python的NLTK(自然语言工具包)。这里有关于使用NLTK进行文本分类的链接。

第二步:一旦识别出一封邮件是订单邮件,就需要处理它以获取详细信息(比如账户名、大小、时间范围等)。正如你提到的,这里面临的挑战是这些数据没有固定的格式。为了解决这个问题,你可以考虑为每个标签准备一个详尽的同义词列表(比如对于账户,列表可以是 ['acct', 'a/c', 'account', 'acnt'])。这一步只需要做一次,可以通过查看一定数量的以前邮件来完成。

为了让解决方案更有效,你可以考虑实现一种主动学习的选项(也就是说,如果在邮件中发现了一个不在任何列表中的标签,就提示用户。例如,如果邮件中使用了 "accnt",而这个词没有被识别,那么就应该提示用户询问它属于哪个类别。)

一旦识别出标签,你可以使用基本的字符串操作来解析邮件,并以结构化的格式提取相关数据。

你可以参考这个讨论,以便更好地理解。

撰写回答