从自由文本

时间:2015-08-04 03:25:00

标签: javascript node.js phone-number phonenumberutils

我正在编写一个程序来搜集来自多个网站的博客文章。我正试图从自由文本中提取他们的澳大利亚格式的电话号码。事实证明这是相当困难的。

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

示例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-ish)。我的许可证号是4335TE33和我用全新的6英寸轮胎驾驶2004 Ford 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模式验证结果

显然我已尝试使用正则表达式,但在这种情况下它们会失败很长时间。

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

你会怎么攻击这个?

3 个答案:

答案 0 :(得分:1)

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

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

首先,我会查看OpenNLP / Stanford文档,了解您所寻找的内容是否可行。

答案 1 :(得分:0)

我会使用更简单的方法:

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

答案 2 :(得分:0)

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

+49(0)7121 / 1229-276

应该读作当地的071211229276或国际的004971211229276。