我们有一个显示地图数据的程序(想想谷歌地图,但为我们的客户提供更多的交互性和自定义图层)。
我们允许通过一组组合框进行导航,这些组合框用一堆数据预填充某些字段(即:国家:加拿大,填写省字段。选择安大略省,并填写县/区域列表。选择一个县/地区,一个城市填写等...)。
虽然这可以保证准确的地址,但如果用户不知道街道地址或城市所在的位置(即哪个县/地区是厨房用户?),则会给用户带来痛苦。
因此,我们正在尝试使用自由格式文本字段来执行地址解析器。
用户可以输入类似的内容(类似于Google地图,Bing地图等): 22 Main St,Kitchener,On
我们可以将它划分为多个部分并对数据进行查找并找到他们正在寻找的点(或建议替代方案)。
问题在于我们如何恰当地划分信息?我们如何分解这些部分并找到可能的匹配?我猜我们不能保证用户会以我们一直期望的格式输入数据(显然)。如果我们找不到完全匹配(或找到多个完全匹配......例如,在不同的县中具有相同街道名称的两个城市),那么如何呈现数据就是如此。
我们在地图数据中有大量数据(主要是mapinfo标签格式)。所以我们可以对街道名称,城市,州等进行快速扫描。但我不确定解决这个问题的最佳方法。当然,使用谷歌地图会很好,因为我们的大多数客户都处于封闭的网络中,通常不允许外部访问,大多数人不愿意依赖谷歌地图(因为它不包含他们需要的太多信息) ,例如自定义地图图层)。显然,他们可以去谷歌并获得正确的位置然后转移到我们的软件,但这将耗费时间并且过程的速度非常重要。
答案 0 :(得分:6)
这实质上是命名实体解析问题的一类。 NER on Wikipedia
解决此问题的最佳方法是使用语言转换器解析地址以识别各种构造 - 一种方法类似于使用有限状态机的正则表达式。
我在Java NLP和机器学习框架GATE上取得了巨大的成功,他们的传感器库被称为Jape。查看他们的GUI,并使用它为它编写一些Java代码!
他们内置的示例应该让您从基础开始,然后您可以根据需要进行扩展。从本质上讲,它使用规则和规则引擎将文本划分为组件,如
Xyz, Blah St,
Foo City, 11110, CA
将被翻译为,
Place: Xyz
Street: Blah St
City: Foo
...
然后您可以使用您的位置数据库进行匹配。
除了规则之外,Jape还支持字典查找 - 所以如果你的数据库中已经有了“Blah St”,它有2个父母 - 城市Foo和Bar - 你只需通过解析下一行就可以消除歧义。编辑:GATE包含一个名为ANNIE的工具 - 一个信息提取系统,可以用来识别地址。这使用了一些你可以构建的内置Jape规则。
答案 1 :(得分:3)
顺便提一下,您是否看到了SmartyStreets正在尝试的新API端点? It extracts addresses from text and validates them and converts them into components.
请参阅更详细的this other Stack Overflow post。我在SmartyStreets工作并帮助开发它,所以我可以告诉你这是一个非常困难的问题,即使表面看起来很简单。
答案 2 :(得分:0)
Simson Garfinkel为他的NeXTstep
(后来为Mac OS X编译和更新并提交给Apple Design竞赛)提供了精彩的通讯录。从那以后,它一直是开源的,可从他的网站下载:
答案 3 :(得分:0)
Geocoder.ca清理,标准化和地理编码位置地址字符串。它还附加邮政编码,时区和区号。
例如: https://geocoder.ca/22%20Main%20St,%20Kitchener,%20On?geoit=xml
<geodata>
<latt>43.286272</latt>
<longt>-80.445823</longt>
<postal>N0B1E1</postal>
<Dissemination_Area><dauid>35300802</dauid><adauid>35300042</adauid></Dissemination_Area>
<AreaCode>226,519</AreaCode>
<TimeZone>America/Toronto</TimeZone>
<standard>
<stnumber>22</stnumber><staddress>Main ST</staddress><city>Kitchener</city><prov>ON</prov><confidence>0.7</confidence></standard>
</geodata>