0

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

以下是一些构建的博客文章示例:

示例 1:

“你好,我的名字是 Alicia,我今年 32 岁,在过去的 40 年里一直住在布里斯班。我身高 6 英寸,跑步敏捷。自 2004 年以来,我每周跑步 2-3 次。请随时拨打 +61 (04) 654 456 或尝试我的其他号码 0434 43 22 34。”

从这篇博文中,我需要提取“04654456”和“0434432234”

示例 2:

“我是乔,也喜欢跑步。身高 7 英尺,自 2004 年以来一直坚持跑步。如需培训建议,请致电 043 572-6087 或 (02) 1232 23 56。”

从这篇博文中,我需要提取“0435726087”和“0212322356”。

示例 3:

“我的名字是 Pricilla,我喜欢跑步。您可以拨打 0 434 45 45 12 联系我,但请不要在凌晨 12 点之前致电(我的客户要到 10 点到 11 点)。我的执照号码是 4335TE33,我驾驶配备全新 6 英寸轮胎的 2004 年福特 Bronco。我可以跑 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 模式验证澳大利亚移动和固定电话号码的结果

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

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

你会怎么攻击这个?

4

3 回答 3

1

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

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

我将首先查看 OpenNLP/Stanford 文档,看看您正在寻找的内容是否可行。

于 2015-08-04T03:38:02.163 回答
0

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

+49 (0) 7121 / 1229-276

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

于 2015-08-04T03:56:06.780 回答
0

我会使用更简单的方法:

  1. 删除空格、逗号、括号和任何其他可以删除的符号。
  2. 使用正则表达式匹配一行中与澳大利亚电话号码长度匹配的 X 位数字。
于 2015-08-04T03:32:35.680 回答