解析字符串的机器学习技术?


30

我有很多地址字符串:

1600 Pennsylvania Ave, Washington, DC 20500 USA

我想将它们解析为它们的组成部分:

street: 1600 Pennsylvania Ave
city: Washington
province: DC
postcode: 20500
country: USA

但是当然,数据是肮脏的:它来自许多国家,以多种语言编写,以不同的方式编写,包含拼写错误,丢失的片段,多余的垃圾等。

现在,我们的方法是将规则与模糊地名词典匹配结合使用,但是我们想探索机器学习技术。我们已将训练数据标记为监督学习。问题是,这是什么样的机器学习问题?它似乎并不是真正的聚类,分类或回归...。

我能想到的最接近的方法是对每个标记进行分类,但是您真的想同时对它们进行分类,以满足诸如“最多应有一个国家”的约束。确实有很多方法可以对字符串进行标记化,并且您想尝试每个字符串并选择最佳字符串。

那么:我可以探索哪些机器学习技术来解析地址?


我不是要发布答案的高级问题专家,但我认为机器学习的第一步是构建信息功能,然后根据其结构选择正确的方法。你有很多结构;alnum与非al-char,数字与alpha令牌,“,”分割之间的令牌计数,数字令牌长度。例如,在“,”上分割并计算每个分割中有多少令牌(街道地址,城市/州/地理位置特定信息);计算数字令牌的strlen(街道地址与邮政编码)。这些为您提供可以集群的功能。
muratoa

看一下文本分块
中音

2
另请参阅命名实体识别,以及信息提取
Yuval F

@YuvalF我建议将此作为答案。您能否详细说明一下,也许是使用ML方法的示例论文?
steffen'8

我对这个特定的问题也非常感兴趣-它正在将邮件地址构造成其各个组成部分。我们正在尝试在不假设与反向地理编码服务(例如google)的连接性的移动设备中执行此操作。可以假设我们有一个车载的,与城市,州,国家和邮政编码有关的链接数据源。衷心且公开地欢迎您的任何帮助-指点-或愿意与一个疯狂的创业团队合作解决这个问题。

Answers:


10

这可以看作是序列标记问题,在该问题中,您有一系列标记,并希望对每个标记进行分类。您可以使用隐马尔可夫模型(HMM)或条件随机字段(CRF)来解决问题。在名为Mallet的开源软件包中,HMM和CRF有很好的实现。

在您的示例中,您应该将输入转换为以下格式。此外,您应该生成额外的功能。

1600 STREET
Pennsylvania STREET
Ave STREET
, OUT
Washington CITY
, OUT
DC PROVINCE
20500 POSTCODE
USA COUNTRY

1
我认为在这种情况下,标准序列标记器(例如CRF的HMM)不会产生很好的结果。这是由于标签组是连续的,并且每个标签每个序列仅出现一次的限制。我认为,由于依赖于任意距离的过去/未来标签,您不能轻易修改搜索以包含此信息(尽管我对此可能是错的)。
中音

@alto我相信CRF会考虑到邻近的上下文。HMM无法查看过去的状态,您说对了,这可能无法很好地工作。
JT

1

我必须解决一个非常相似的问题,以验证地址是有效还是无效。

通常地址的结构为“ 1600 Pennsylvania Ave,Washington DC,20500”

字符串,例如

“我走了2000步,到达了华盛顿特区的宾夕法尼亚大街。”

不是有效的地址。

这可以通过分类技术(例如SVM,神经网络等)解决。

这个想法是确定一组关键功能。其中一些可能是:

1)街道名称是否以有效的街区号开头。大多数美国区块编号是数字(例如1200)或数字后跟一个字母(120A)或一个字母后的数字(例如S200)。

2)如果地址格式正确,则街道名称以后缀结尾,例如Ave代表大道,Dr代表Drive,Blvd代表Boulevard。可以从USPS网站获得美国街道后缀列表。

3)街道地址字段中的单词数也可能是一个有趣的功能。如果单词过多,则可能不是有效地址。例如,参见上面的示例。

4)地址栏中的块号和街道后缀之间出现多少个单词?

这些可用于训练学习算法,结果模型可用于验证给定地址是否有效。


1

这有点hack,不需要您自己的解决方案:反向地理编码。这可以为您提供更清晰的数据,也可以为您完成所有工作。

例如,geocode3这是使用Google的SSC 的一些Stata代码。我想这类似于Fuzzy Gazetteer。第一个地址很乱,第二个是干净的,第三个是外国的。其他软件也可以处理此问题。

clear
set obs 3
gen address =""
replace address = "Big Foot Museum in Felton CA" in 1
replace address = "1600 Pennsylvania Ave, Washington, DC 20500 USA" in 2 
replace address = "ул. Ильинка, д. 23 103132, Москва, Россия" in 3
geocode3, address(address)
gen coord = string(g_lat) + "," + string(g_lon)
geocode3, reverse coord(coord)

这相当有效:

. list r_addr , clean noobs

                                                                             r_addr  
                                      121 San Lorenzo Avenue, Felton, CA 95018, USA  
    1600 Pennsylvania Avenue Northwest, President's Park, Washington, DC 20500, USA  
                                         ulitsa Ilyinka, 23, Moscow, Russia, 101000  

克里姆林宫确实有一个完全不同的格式。


0

这听起来像是双向LSTM分类要解决的问题。您将示例的每个字符标记为一个类别,例如

街道:1城市:2省:3邮政编码:4国家:5

1600 Pennsylvania Ave, Washington, DC 20500 USA
111111111111111111111, 2222222222, 33 44444 555

现在,根据这些标签训练您的分类器。繁荣!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.