我们有一个显示地图数据的程序(想想谷歌地图,但我们的客户有更多的交互性和自定义图层).
我们允许通过一组组合框进行导航,这些组合框用一堆数据预填充某些字段(即:国家:加拿大,填写省字段.选择安大略省,并填写县/区域列表.选择县/地区,城市填写等...).
虽然这可以保证准确的地址,但如果用户不知道街道地址或城市所在的位置(即哪个县/地区是厨房用户?),则会给用户带来痛苦.
因此,我们正在尝试使用自由格式文本字段来执行地址解析器.
用户可以输入类似这样的内容(类似于Google地图,Bing地图等):22 Main St,Kitchener,On
我们可以将它划分为多个部分并对数据进行查找并找到他们正在寻找的点(或建议替代方案).
问题在于我们如何正确划分信息?我们如何分解这些部分并找到可能的匹配?我猜我们不能保证用户会以我们一直期望的格式输入数据(显然).如果我们找不到完全匹配(或者找到多个完全匹配......例如,在不同的县中具有相同街道名称的两个城市),则对此进行跟进将是如何呈现数据.
我们在地图数据中有大量数据(主要是mapinfo标签格式).所以我们可以对街道名称,城市,州等进行快速扫描.但我不确定解决这个问题的最佳方法.当然,使用谷歌地图会很好,因为我们的大多数客户都处于封闭的网络中,通常不允许外部访问,大多数人不愿意依赖谷歌地图(因为它不包含他们需要的太多信息) ,例如自定义地图图层).显然,他们可以去谷歌并获得正确的位置然后转移到我们的软件,但这将耗费时间并且过程的速度非常重要.
这实质上是命名实体解析问题的一类.维基百科上的NER
解决这个问题的最佳方法是使用语言转换器解析地址以识别各种构造 - 一种方法类似于使用有限状态机的正则表达式.
我使用名为GATE的Java NLP和机器学习框架取得了巨大成功,他们的传感器库称为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规则.