在我们的日常工作中,特别是数据分析、地理信息系统 (GIS) 开发,或者在线零售等行业中,经常会遇到处理包含地址信息的文本数据这个棘手的任务。 面对大量规格不统一,格式不一致的非结构化地址数据,想要从中快速地提取分级地址、联系人、电话等,简直就是不可能完成的任务。 即使费九牛二虎之力写一个处理程序,也经不起国家统计局对地区信息的调整。到现在我还清楚地记得,当北京亦庄地区被命名为北京经济开发区时,我和小伙伴们通宵达旦修正系统中地址信息地狼狈样子…… 那么,有没有办法能快速解决者地址提取问题呢? 你猜的没错,确实有,那就是 —— addressrec。
地址分析师
addressrec 是一种基于 Python 的地址解析库,它可以将纷繁复杂的地址信息变成结构化的数据。 它基于 JioNLP 地址解析工具以及国家统计局发布的最新行政区划数据(地址库:2020年国家统计局行政区划[1]),结合 jieba 分词技术与 Levenshtein 字符串相似度算法来处理和解析地址信息。 在线体验 colab[2] 提供了一个简单的演示,表明地址解析是多么轻松简单。 addressrec 的作者是王志超[3]。 项目地址:https://github.com/wzc570738205/smartParsePro-py
安装 addressrec
为了使用 addressrec,你需要确保你的 Python 版本为 3.8 或更高:
代码语言:javascript复制pip3 install addressrec
解析如魔法
addressrec 提供了简单而强大的接口来处理地址解析。下面是一个基本示例,演示如何使用 addressrec 来从一个文本字符串中识别出地址组件。
基本使用
代码语言:javascript复制import addressrec
result = addressrec.run(
'王志超 029-68216000 新疆维吾尔自治区乌鲁木齐市沙依巴克区西虹东路 463 号',
True, # 可不传默认true 指定参数town_village(bool),可获取乡镇、村、社区两级详细地名
False # 可不传默认false 指定参数change2new(bool)可自动将旧地址转换为新地址
)
print(result)
运行上面的代码,得到的结果会是一个结构化的字典,像这样:
代码语言:javascript复制{
"city": "乌鲁木齐市",
"county": "沙依巴克区",
"detail": "西虹东路 463 号",
"name": "王志超",
"phone": "029-68216000",
"province": "新疆维吾尔自治区",
"town": "",
"village": ""
}
API 化
如果你想将地址解析的功能集成到你的 web 服务中,addressrec 也提供了相应的方法。 以下是用 Flask 创建一个简单 Web 服务的示例:
代码语言:javascript复制from flask import Flask, request, jsonify
import addressrec
app = Flask(__name__)
@app.route('/smart_address', methods=['POST'])
def handle_smart_address():
data = request.get_json()
# 获取请求数据
text = data.get('text', '')
town_village = data.get('town_village', True)
change2new = data.get('change2new', False)
# 运行地址解析
result = addressrec.run(text, town_village, change2new)
if result:
return jsonify(result)
else:
return jsonify({"error": "Failed to process the request"}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=3000)
请求数据:
代码语言:javascript复制URL: `http://127.0.0.1:3000/smart_address`
METHOD: 'POST'
BODY:
{
"text":"马云,陕西省西安市雁塔区丈八沟街道高新四路高新大都荟 13593464918",
"town_village": true, //
"change2new": false //可不传默认false 指定参数change2new(bool)可自动将旧地址转换为新地址
}
识别结果:
代码语言:javascript复制{
"city": "西安市",
"county": "雁塔区",
"detail": "高新四路高新大都荟",
"name": "马云",
"phone": " 13593464918",
"province": "陕西省",
"town": "丈八沟街道",
"village": ""
}
实践环节
作为一个 hands-on 的教程,不如我们动手试试吧!以下是几个练习建议:
- 尝试使用 addressrec 解析你家附近的某个地址,说不定有惊喜哦!
- 创建一个简单的 Web 表单,通过它接收用户输入的地址,然后使用 addressrec 进行解析。
- 思考如何将解析结果用于地图标记或其他地理信息服务。
参考资料 [1] 2020年国家统计局行政区划: http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020 [2] colab: https://colab.research.google.com/drive/1AQ4UAT8N6KeZCSNXfKmrlCaVyah72bKy#scrollTo=gIU_U088qX-g [3] 项目作者 王志超: https://github.com/wzc570738205