如何从字符串中过滤非地址信息

时间:2014-04-16 11:30:24

标签: geolocation machine-learning geocoding street-address

我正在努力减少用户填写地址表单所需的时间。此表格需要街道地址,邮政编码,城市,地区和分区。

为此,我查询Open Street Map的Nominatim API,如下所示:

var
  request = require('request'),
  address = 'Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road',
  baseUri = 'http://nominatim.openstreetmap.org/search?format=json&addressdetails=1',
  query   = '&accept-language=en&q=' + encodeURIComponent(address);

request(baseUri + query, function(err, res, body) {
  console.log(JSON.parse(body));
});

然后我解析了返回主体的邮政编码等内容。

问题在于,这仅适用于不包含楼层编号等不相关内容的“普通地址”。换句话说,这有效:

var address = 'Sukhumvit 21 Road';

但这不起作用:

var address = 'Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road';

现在我通过一系列非常粗略的可能试验来多次查询API,如下:

  //create trials
  var
    trials = [],
    addressParts = address.split(' ');

  for (var i = 0, il = addressParts.length; i < il; i++) {
    if (il - i >= 2) trials.push(addressParts.slice(i, il).join(' '));
  }

这意味着它会尝试所有这些字符串:

Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road
Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road
Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road
Unit 255/109 15th Flr., Sukhumvit 21 Road
255/109 15th Flr., Sukhumvit 21 Road
15th Flr., Sukhumvit 21 Road
Flr., Sukhumvit 21 Road
Sukhumvit 21 Road ==> it works!

这需要很多请求,因此非常慢。

是否有更智能的方法来过滤掉这种“非地址”信息?请注意,我也在寻找一种在非西方脚本中执行此操作的方法,例如Thai。

2 个答案:

答案 0 :(得分:1)

如果您没有包含特定地址字段的明确定义的表单。一种好的方法是将字符串地址拆分为明确定义的部分。例如

"Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road"
 1st part: "Grand Parkview Asoke"
 2nd part: "Unit 255/109 15th Flr."
 3rd part: "Sukhumvit 21 Road"
 // Of course it would be more complex than just splitting at commas.

地址传统上是以信息在字符串末尾密集的形式编写的。密集,我的意思是互联网上可用信息量的概率较高。所以查询最后一部分即。信息来源Sukhumvit 21 Road可能会在一次拍摄中为您提供比完整字符串更多的结果。

现在取决于没有。你收到的结果。你可以建立一种方法: 1)多个结果:向查询字符串添加更多信息,例如。 Unit 255/109 15th Flr., Sukhumvit 21 Road
2)无结果:删除查询字符串的一部分,例如。 21 Road

正如其他人已经建议的那样,如果您将表单分解为不同的地址部分即。街道地址等。您将处于更好的状态以形成查询。

然后,这就是我的意思。基于问题的数学建模肯定会有更好的方法。

答案 1 :(得分:0)

你应该看看序列标记问题---这基本上就是你在这里所拥有的。一个突出的例子是named entity recognition

任务是查看您尝试从字符串中提取的内容作为具有特定标记的单词。让我们说标签是“Relavant”#39;。然后,您可以将字符串中的每个单词视为具有相应的标记:

'Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road'
'[NR]  [NR]            [NR] [NR]    [NR] [NR]  [R]       [R][R]

我使用标签[R]来表示该单词与查询相关。然后,您可以使用相关单词构建查询(或者确实是最长的连续相关单词串,以提高稳健性,如果这更合适的话)。

然后,任务是构建一个序列标记器,用于标识查询中不相关单词的相关性。您希望将此作为监督问题来处理,这意味着训练数据(尽管您可以通过假设任何返回结果的查询有效且所有其他查询都无效来获取训练数据)。最具竞争力的序列标记符是条件随机字段,可以快速,高精度地进行标记。

要注意 - 这不是一个快速修复。您需要投入大量时间来收集数据,识别相关功能并进行评估。我不知道这些东西对你有多重要!