从自由文本中提取 phone 个数字

Extracting phone numbers from free text

我正在编写一个程序,从许多网站上抓取博客 post。我正在尝试从自由文本中提取澳大利亚格式的 phone 号码。这已被证明是相当困难的。

这里有几个构建博客post的例子:

示例 1:

"Hello, my name is Alicia I'm 32 and have lived in Brisbane for the past 40 years. I'm 6" 高大敏捷 运行 小伙子。自 2004 年以来,我每周运行宁 2-3 次。请随时拨打 +61 (04) 654 456 或试试我的其他号码 0434 43 22 34。"

从这个博客post我需要提取“04654456”和“0434432234”

示例 2:

"I'm Joe and also love running. Standing 7" 英尺高,自 2004 年以来一直在努力。如需培训建议,请致电 043 572-6087 或 (02) 1232 23 56。"

从此博客post我需要提取“0435726087 和”0212322356。

示例 3:

"My name is Pricilla and I love running. You can reach me on 0 434 45 45 12, but don't call before 12 am pls (I got clients up until 10-11-ish). My license number is 4335TE33 and I drive a 2004 Ford Bronco with brand new 6" 轮胎。我可以 运行 28 公里,但通常每 3 或 4 公里需要休息一下。今天给我打电话 (04) 3 445 4512"

从这个博客post我需要提取“0434454512”。

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

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

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

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

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

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

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

你会如何攻击它?

我会使用更简单的方法:

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

您要查找的实际上是自然语言处理中已知的实体提取研究领域。有很多方法可以解决这个问题,也有几个数学模型可以解决这些任务,幸运的是,有可用的工具包可以完成类似的任务——OpenNLP and Stanford NER 是几个例子。它具有自动提取名称、日期、词性等的工具。您可以修改它以提取 phone 数字 - 要知道的一件事是这些是统计模型(与基于规则相反,这是您的当前方法)所以你需要训练数据。

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

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

我会选择正则表达式,因为如果你只使用所有数字,有时你会得到错误的数字:

+49 (0) 7121 / 1229-276

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