从免费文本中提取电话号码

Extracting phone numbers from free text

本文关键字:提取 电话号码 文本 免费      更新时间:2023-09-26

我正在写一个程序,从一些网站上抓取博客文章。我正试图从免费文本中提取他们的澳大利亚格式的电话号码。这被证明是相当困难的。

下面是一些构造好的博客文章示例:

示例1:

"大家好,我叫Alicia,今年32岁,在布里斯班生活了40年。我身高6英寸,跑起来很敏捷。从2004年开始,我每周跑步2-3次。请随时拨打+61(04)654 456或拨打我的另一个号码0434 43 22 34。"

从这篇博客文章中,我需要提取"04654456"answers"0434432234"

示例2:

"我是Joe,也喜欢跑步。身高7英尺,从2004年开始就一直在做这件事。培训咨询请致电043 572-6087或(02)1232 23 56。"

从这篇博文中,我需要提取"0435726087"answers"0212322356"。

示例3:

"我叫Pricilla,我喜欢跑步。你可以打0434 45 45 12找到我,但请不要在12点之前打电话(我的客户要到10点11分左右)。我的驾照号码是4335TE33,我开的是一辆2004年的福特野马,有全新的6英寸轮胎。我能跑28公里,但通常每跑3、4公里就需要休息一下。今天打电话给我(04)3 445 4512"

从这篇博文中,我需要提取"0434454512"。

我想出了一个相当复杂的系统,对每个博客条目做以下操作:

1)删除所有非数字字符,修剪和删除双空格

2)将字符串转换为数组。现在我们只是有一个数组的数字如[' 0 ',' 434 ',' 45 ',"45岁的"12"、"4335"、"33"、"2004"、"6"、"28"、"3"、"4"、"04"、"34"、"832"、"234]

3)遍历数字数组并应用规则将其拼凑在一起。这段代码很臃肿,不太美观。

4)使用澳大利亚移动电话和固定电话号码的RegExp模式验证结果

显然,我已经尝试过正则表达式,但在这种情况下,它们失败了很多次。

我的系统大部分时间都可以工作,但代码至少可以说不漂亮。

你会怎么攻击这个?

您正在寻找的实际上是自然语言处理中已知的实体提取的研究领域。有很多方法可以解决这个问题,也有一些数学模型可以解决这些任务,幸运的是,有一些工具包可以完成类似的任务——opennlp和Stanford NER就是两个例子。它有工具自动提取姓名,日期,词性等。您可能能够修改它以提取电话号码—要知道的一件事是,这些是统计模型(与您当前的方法基于规则相反),因此您需要训练数据。

请注意,这可能需要对您当前正在做的事情进行重大更改,因此可能值得也可能不值得,但如果您要处理与从非结构化文本中提取实体相关的问题,那么了解这些工具可能是值得的。

我会首先查看OpenNLP/Stanford文档,看看您正在寻找的是否可能。

我会使用一个更简单的方法:

  1. 删除空格,逗号,括号和任何其他符号。
  2. 使用正则表达式匹配一行中与澳大利亚电话号码长度匹配的X位数字。

我会使用regexp,因为如果你只使用所有数字,有时你会得到错误的数字:

+49 (0) 7121/1229-276

应该读作本地071211229276或国际004971211229276。