使用自然语言处理从推文中提取地址

时间:2015-07-11 17:52:44

标签: google-maps machine-learning nlp street-address

我正在构建一个Twitter机器人,它会听取以下推文:

Hey @twitterbot, I'm looking for restaurants around 123 Main Street, New York

或另一个例子:

@twitterbot, what's near Yonge & Dundas, Toronto? I'm hungry!

然后回复您希望这些问题返回的数据类型。我已经解决了大部分问题,但是我坚持不应该做的事情;从推文中提取地址。

我会将地址转发给地理编码服务以获取lat / lng,因此我不需要以任何方式格式化或准备地址;我只需要将它与不相关的文字隔离开来,例如"我正在寻找周围的餐馆。或者"我饿了!"。

是否有任何NLP工具可以在一个文本块中执行此地址识别?有关于另一种方式的建议吗?因为谷歌的地理编码器处理如此广泛的地址格式(甚至像利顿中心,多伦多'作为地址的兴趣点),我无法使用正则表达式进行拔除地址输出。

另一种说法,我只想删除任何不属于地址的文本。

我寻找的地址需要在美国/加拿大工作。

在StackOverflow上有一些类似的问题,但没有一个能解决我能找到的这个问题。因为谷歌的地理编码器是如此宽容,解决方案并不是完美的,它只需要摆脱足够的模糊,以便谷歌知道我想说的话。

我对NLP很陌生,所以我很欣赏有关此主题的任何指导。

2 个答案:

答案 0 :(得分:5)

How to parse freeform street/postal address out of text, and into components回答了这样的问题:“有没有办法将地址与周围的文本隔离开来并将其分解成碎片?” - 这与你的问题基本相同(除了你不关心将它分成碎片 - 只是将它与文本的其余部分隔离)。

SmartyStreets在https://smartystreets.com/demo?mode=extract也有很好的演示,但遗憾的是它不是免费的解决方案。

另一个快速思考 - 由于Twitter帖子限制为140个字符,并且往往包含很少的单词(你的两个例子分别有9个和12个单词),你可以想象只是暴力强制它。例如,要获得“@twitterbot,多伦多Yonge& Dundas附近有什么?我很饿!”的位置,您可以将以下所有内容发送到谷歌地理编码器 -

Yonge附近有什么? Dundas,多伦多?我很饿!

Yonge附近有什么? Dundas,多伦多?我

Yonge附近有什么? Dundas,多伦多?

Yonge附近有什么?邓达斯,

等。对于由完整单词组成的所有可能的子串。

答案 1 :(得分:2)

你走了: http://geocoder.ca/?locate=Hey+%40twitterbot%2C+I%27m+looking+for+restaurants+around+123+Main+Street%2C+New+York&geoit=xml&parse=1

<geodata>
<latt>40.5119365</latt>
<longt>-74.2493562</longt>
<AreaCode>347,718</AreaCode>
<TimeZone>America/New_York</TimeZone>
<standard>
     <stnumber>123</stnumber>
     <staddress>Main ST</staddress>
     <city>STATEN ISLAND</city>
     <prov>NY</prov>
     <postal>11385</postal>
     <confidence>0.9</confidence>
  </standard>
</geodata>

http://geocoder.ca/?locate=Hey+%40twitterbot%2C+I%27m+looking+for+restaurants+around+123+Main+Street%2C+New+York