您确实有两个问题:
我可以帮助解决第二个问题。(但请参阅下面的编辑以获取有关第一个问题的帮助。)
使用旧的Google Maps API(仍在运行),您可以将地理编码缩减为一行(丑陋的一行):
def geocode(address):
return tuple([float(s) for s in list(urllib.urlopen('http://maps.google.com/maps/geo?' + urllib.urlencode({'output': 'csv','q': address})))[0].split(',')[2:]])
这是可读的7行版本以及一些包装器代码(从命令行调用时,请记住将地址括在引号中):
import sys
import urllib
googleGeocodeUrl = 'http://maps.google.com/maps/geo?'
def geocode(address):
parms = {
'output': 'csv',
'q': address}
url = googleGeocodeUrl + urllib.urlencode(parms)
resp = urllib.urlopen(url)
resplist = list(resp)
line = resplist[0]
status, accuracy, latitude, longitude = line.split(',')
return latitude, longitude
def main():
if 1 < len(sys.argv):
address = sys.argv[1]
else:
address = '1600 Amphitheatre Parkway, Mountain View, CA 94043, USA'
coordinates = geocode(address)
print coordinates
if __name__ == '__main__':
main()
解析CSV格式很简单,但是XML格式具有更好的错误报告功能。
我望着nltk
。这并非易事,但我可以推荐自然语言工具包文档CH 7-从文本中提取信息,特别是7.5 Named Entity Recognition
。在本节的最后,他们指出:
NLTK提供了一个已经过训练的识别器,可以识别通过函数nltk.ne_chunk()访问的命名实体。如果我们设置参数binary = True,那么命名实体将被标记为NE;否则,分类器添加类别标签,例如PERSON,ORGANIZATION和GPE。
您要指定True
,但可能需要类别标签,因此:
chunked_sentences = nltk.batch_ne_chunk(tagged_sentences)
这提供了类别标签(命名实体类型),这似乎很有希望。但是在对文本和带有位置的几个简单短语进行尝试之后,很显然需要更多规则。阅读文档以获取更多信息。