使用自然语言处理进行地址分割

9

我目前正在开发一个项目,旨在识别地址中的每个部分。例如从“str. Jack London 121, Corvallis, ARAD, ap. 1603, 973130” 中提取的输出应该如下所示:

street name: Jack London; 
no: 121; city: Corvallis; 
state: ARAD; 
apartment: 1603; 
zip code: 973130

问题在于并非所有输入数据都是相同的格式,因此有些元素可能会缺失或顺序不同,但保证其是一个地址。

我查阅了一些互联网上的资料,但很多都只适用于美国地址,比如Google API Places,而我的需求是另一个国家的地址。

正则表达式并不是一个好的选择,因为地址变化可能太大。

我还考虑过使用命名实体识别模型的NLP,但我不确定那是否可行。

您知道有什么好的方法可以入手吗?或者给我一些建议?


如果您发现我的答案有用,请将其标记为已接受(答案左侧的灰色勾号)。 - sophros
1个回答

12

在Data Science Stack Exchange论坛上有一个类似的问题,只有一个答案建议使用SpaCy。

另一个关于使用Stanford NLP检测地址的问题详细介绍了另一种检测地址及其组成部分的方法。

有一个LexNLP库,它具有检测和拆分地址的功能(代码片段从TowardsDatascience文章中借用):

from lexnlp.extract.en.addresses import addresses
for filename,text in d.items():
    print(list(lexnlp.extract.en.addresses.get_addresses(text)))

还有一个相对较新的(2018年)且“研究性”的代码DeepParse(和文档),用于伴随IEEE文章(需付费)Semantic Scholar的深度学习地址解析。

为训练,您需要使用一些大规模的地址语料库或使用例如Faker库生成的虚拟地址。


1
LexNLP似乎是我找到的最好的开箱即用工具。由于Python依赖项和其他问题,启动它有点麻烦。你提供的文章让我入门了,但现在已经过时或者错误了。例如,get_word_features()函数缺少一个参数,也不是很有用。然而,lexnlp.extract.en.addresses.get_addresses()却是神奇的。非常感谢。 - Joel Mellon
谢谢。已更新答案以反映库的当前API。 - sophros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接