使用机器学习将地址文本拆分为多个组件

问题描述 投票:0回答:1

我有一个 CSV 文件,每一行代表地址的不同组成部分,例如城市、街道、门牌号等,然后一列在一行中包含组合地址,具有预定义的格式,例如街道房屋号码、邮政编码、城市。

我想要的是判断用户输入的地址文本的不同组成部分,例如我想知道用户是否输入了所有组件,或者只是输入了街道名称和城市等,以及这些组件的值是什么。

我可以通过机器学习技术来实现这一目标,以便我使用 CSV 文件来教导模型,这就是地址文本被分割成不同组件的方式,然后期望它根据该训练为我提供不同的组件?

machine-learning text-processing ml.net street-address
1个回答
0
投票

在自己开发自定义模型之前,我建议您尝试一下libpostal项目。

(我假设您正在使用 Python 进行开发)

它已经构建了几个有趣的功能,例如:

  • 国际地址解析
  • 标准化
  • 地址检测

pylibpostal

文档中的示例
from pylibpostal.expand import expand_address
expand_address('Quatre vingt douze Ave des Champs-Élysées')
['92 avenue des champs-elysees',
 '92 avenue des champs elysees',
 '92 avenue des champselysees']
from pylibpostal.parser import parse_address
parse_address('The Book Club 100-106 Leonard St, Shoreditch, London,EC2A 4RH, UK')
[('the book club', 'house'),
 ('100-106', 'house_number'),
 ('leonard st', 'road'),
 ('shoreditch', 'suburb'),
 ('london', 'city'),
 ('ec2a 4rh', 'postcode'),
 ('uk', 'country')]

但是 libpostal 并不容易安装或与 Python 等流行语言集成,因为它是纯 C 开发的,因此您需要安装额外的依赖项。

如果您将范围限制在美国、加拿大或英国,还有其他更简单的替代方案,例如 pyap(Python 地址解析器)。但是,它不像 libpostal 那样通用和强大。 pyap 基于正则表达式,安装/维护更快更容易。

import pyap
test_address = """
    Lorem ipsum
    225 E. John Carpenter Freeway,
    Suite 1500 Irving, Texas 75062
    Dorem sit amet
    """
addresses = pyap.parse(test_address, country='US')
for address in addresses:
    print(address)
    print(address.as_dict())

>> 225 E. John Carpenter Freeway, Suite 1500 Irving, Texas 75062
>> {
  "full_address": "225 E. John Carpenter Freeway, Suite 1500 Irving, Texas 75062",
  "full_street": "225 E. John Carpenter Freeway, Suite 1500",
  "street_number": "225",
  "street_name": "E. John Carpenter",
  "street_type": "Freeway",
  "route_id": null,
  "post_direction": null,
  "floor": null,
  "building_id": null,
  "occupancy": "Suite 1500",
  "city": "Irving",
  "region1": "Texas",
  "postal_code": "75062",
  "country_id": "US",
  "match_start": 15,
  "match_end": 76
}

© www.soinside.com 2019 - 2024. All rights reserved.