【发布时间】:2019-08-21 10:44:45
【问题描述】:
我有一个包含许多英国地址的数据集,我需要对其进行解析,并为每个地址输出地址的不同(可接受的)变体。
首先,我想知道是否可以将问题简化为更简单的方法(也许使用已经可用的库)?如果不可用,我正在尝试找出一种使用不同 Python/R 函数来解析每个地址输入并产生可接受的输出的方法。
例如:
(Actual address) Flat 24a Ardshiel Avenue, Drum Brae, Edinburgh EH4 7HP
Python/R 代码应输出的可接受变体:
*Flat24a Ardshiel Avenue, Drum Brae, Edinburgh EH4 7HP
*F24a Ardshiel Avenue, Drum Brae, Edinburgh EH4 7HP
*f24a Ardshiel Avenue, Drum Brae, Edinburgh EH4 7HP
*f24 a Ardshiel Avenue, Drum Brae, Edinburgh EH4 7HP
The following sets are also acceptable variant outputs
(with postcodes written without space):
*Flat24a Ardshiel Avenue, Drum Brae, Edinburgh EH47HP
*F24a Ardshiel Avenue, Drum Brae, Edinburgh EH47HP
*f24a Ardshiel Avenue, Drum Brae, Edinburgh EH47HP
*f24 a Ardshiel Avenue, Drum Brae, Edinburgh EH47HP
其他一些需要解析的地址形式,允许不同的 待识别的变体:
161-163 Newhaven Road, Edinburgh EH6 4QA
49a Torphin Road, Edinburgh EH13 0PQ
23/27 Gylemuir Road, Edinburgh EH12 7UB
代码应该能够为每个输入用于解析的地址输出不同的变体(可能是 5 或 6 种不同的类型)。重点应该放在地址的前两行(因为这是人们通常缩短单词/简化地址的地方) - 表示城市/城镇/县/国家的其余地址行(可能只需要解析提供小写的可能性)。
地址的结构和形式变得更加重要,因为它应该输出“f24”,因为人们可能会为Flat 24 写f24,甚至可能在它们之间写空格。这对于基于正则表达式的 Python/R 是否可行,有没有人有任何他们以前工作过的示例?
更新:我能想到的一种更简单的用例形式是使用基于规则的解析器。例如,每个英国地址的结构都采用逗号分隔地址中的每一行的方式。因此,可以应用规则,直到每个逗号结束。之后,下一条规则执行并处理下一行,直到逗号结束。
Flat 24a Ardshiel Avenue, Drum Brae, Edinburgh EH4 7HP
Rule 1 = *Flat 24a Ardshiel Avenue*
The acceptable variant outputs that should be provided by the parser is:
1) Flat 24a Ardshiel Avenue (The actual line itself)
2) Flat 24a, Ardshiel Avenue (With a comma)
3) Flat24a Ardshiel Avenue
4) F24a Ardshiel Avenue
5) f24a Ardshiel Avenue
6) f24 Ardshiel Avenue
7) Flat24a Ardshiel Ave
8) F24a Ardshiel Ave
9) f24a Ardshiel Ave
10) f24 Ardshiel Ave
Rule 2 = *Drum Brae*
The acceptable variant outputs that should be provided by the parser is:
Since, not many variants can be produced with these two seperating words, maybe
and acceptable variant could be:
1) Drum Brae (The actual line itself)
2) DrumBrae (Assuming that people can still denote Street names in this way)
Rule 3 = *Edinburgh EH4 7HP*
The acceptable variant outputs that should be provided by the parser is:
1) Edinburgh EH4 7HP (The actual line itself)
2) Edinburgh EH47HP
最后,应将每个输出(片段)附加在一起以形成正确的地址语法。
我正在尝试查看是否有可以利用的库,或者是否有人可以帮助我使用基于规则的解析器/使用正则表达式来解决上述问题。
更新 2:编写许多 IF-ELSE 语句是否有助于解决这个问题?如果是的话,有没有人可以帮忙分享一些我可以开始的类似代码示例?
【问题讨论】:
-
我不太明白不同输出变体的含义以及应该如何实现。我可以理解这个问题,输入有不同的变体,函数必须能够处理这些变体。但是不同的输出?函数应该如何决定在什么情况下返回哪种类型的输出......?
-
@SpghttCd,我所说的不同输出变体的意思是;假设有一种特定的“正确”方式来书写英国地址(例如,我会指的是邮政地址是如何打印在信件上的)——但许多人会以多种不同的方式书写地址。他们会写“f8”(而不是写 Flat 8),他们可以在地址的第二行写“Queen St”而不是“Queen Street”。如果一个系统存储了许多这些不同的变体,那么检查匹配地址就变得非常麻烦(因为它们在系统中以许多不同的形式存储)。
-
代码将被实现到已经存在的流程自动化中——(这将自动读取所有地址,Python/R 代码应该为输入地址生成可接受的输出变体)。输入地址 > Python/R 脚本或代码 > 地址的输出变体
-
这是一个仅用于验证邮政编码的正则表达式:stackoverflow.com/questions/164979/…