• Python 神器!自动识别文字中的省市区并绘图


    e8d2a02b3c2cf261e8646a6d7cc8c51c.png

    在做NLP(自然语言处理)相关任务时,经常会遇到需要识别并提取省、城市、行政区的需求。虽然我们自己通过关键词表一个个查找也能实现提取目的,但是需要先搜集省市区关键词表,相对而言比较繁琐。

    今天给大家介绍一个模块,你只需要把字符串传递给这个模块,他就能给你返回这个字符串内的省、市、区关键词,并能给你在图片上标注起来,它就是 Cpca 模块。

    1.准备

    开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

    (可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

    (可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

    请选择以下任一种方式输入命令安装依赖
    1. Windows 环境 打开 Cmd (开始-运行-CMD)。
    2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
    3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

    pip install cpca

    注意,目前 cpca 模块仅支持Python3及以上版本。

    在 windows 上可能会出现类似如下问题:

    Building wheel for pyahocorasick (setup.py) ... error

    先阅读原文去下载 Microsoft Visual C++ Build Tools 安装VC++构建工具,再重新 pip install cpca,即可解决问题。

    2.基本使用

    通过两行代码就能实现最基本的省市区提取:

    1. # 公众号: Python 实用宝典
    2. # 2022/06/23
    3. import cpca
    4. location_str = [
    5.     "广东省深圳市福田区巴丁街深南中路1025号新城大厦1层",
    6.     "特斯拉上海超级工厂是特斯拉汽车首座美国本土以外的超级工厂,位于中华人民共和国上海市。",
    7.     "三星堆遗址位于中国四川省广汉市城西三星堆镇的鸭子河畔,属青铜时代文化遗址"
    8. ]
    9. df = cpca.transform(location_str)
    10. print(df)

    效果如下:

    1. 省 市 区 地址 adcode
    2. 0 广东省 深圳市 福田区 巴丁街深南中路1025号新城大厦1440304
    3. 1 上海市 None None 。310000
    4. 2 四川省 德阳市 广汉市 城西三星堆镇的鸭子河畔,属青铜时代文化遗址 510681

    注意第三条的广汉市,cpca 不仅识别到了语句中的县级市广汉市,还能自动匹配到其代管市的德阳市,不得不说非常强大。

    如果你想获知程序是从字符串的那个位置提取出省市区名的,可以添加一个 pos_sensitive=True 参数:

    1. # 公众号: Python 实用宝典
    2. # 2022/06/23
    3. import cpca
    4. location_str = [
    5.     "广东省深圳市福田区巴丁街深南中路1025号新城大厦1层",
    6.     "特斯拉上海超级工厂是特斯拉汽车首座美国本土以外的超级工厂,位于中华人民共和国上海市。",
    7.     "三星堆遗址位于中国四川省广汉市城西三星堆镇的鸭子河畔,属青铜时代文化遗址"
    8. ]
    9. df = cpca.transform(location_str, pos_sensitive=True)
    10. print(df)

    效果如下:

    1. (base) G:\push\20220623>python 1.py
    2.      省 市 区 地址 adcode 省_pos 市_pos 区_pos
    3. 0  广东省 深圳市 福田区 巴丁街深南中路1025号新城大厦1440304      0      3      6
    4. 1  上海市 None None 。310000     38     -1     -1
    5. 2  四川省 德阳市 广汉市 城西三星堆镇的鸭子河畔,属青铜时代文化遗址 510681      9     -1     12

    它标记出了识别到省、市、区的关键位置(index),当然如果是德阳市这种特殊的识别会被标记为-1.

    3.高级使用

    它还可以从大段文本中批量识别多个地区:

    1. # 公众号: Python 实用宝典
    2. # 2022/06/23
    3. import cpca
    4. long_text = "对一个城市的评价总会包含个人的感情。如果你喜欢一个城市,很有可能是喜欢彼时彼地的自己。"\
    5.     "在广州、香港读过书,工作过,在深圳买过房、短暂生活过,去北京出了几次差。"\
    6.     "想重点比较一下广州、深圳和香港,顺带说一下北京。总的来说,觉得广州舒适、"\
    7.     "香港精致、深圳年轻气氛好、北京大气又粗糙。答主目前选择了广州。"
    8. df = cpca.transform_text_with_addrs(long_text, pos_sensitive=True)
    9. print(df)

    效果如下:

    1. (base) G:\push\20220623>python 1.py
    2.           省 市 区 地址 adcode 省_pos 市_pos 区_pos
    3. 0       广东省 广州市 None     440100     -1     44     -1
    4. 1   香港特别行政区 None  None     810000     47     -1     -1
    5. 2       广东省 深圳市 None     440300     -1     58     -1
    6. 3       北京市 None  None     110000     71     -1     -1
    7. 4       广东省 广州市 None     440100     -1     86     -1
    8. 5       广东省 深圳市 None     440300     -1     89     -1
    9. 6   香港特别行政区 None  None     810000     92     -1     -1
    10. 7       北京市 None  None     110000    100     -1     -1
    11. 8       广东省 广州市 None     440100     -1    110     -1
    12. 9   香港特别行政区 None  None     810000    115     -1     -1
    13. 10      广东省 深圳市 None     440300     -1    120     -1
    14. 11      北京市 None  None     110000    128     -1     -1
    15. 12      广东省 广州市 None     440100     -1    143     -1

    不仅如此,模块中还自带一些简单绘图工具,可以在地图上将上面输出的数据以热力图的形式画出来:

    1. # 公众号: Python 实用宝典
    2. # 2022/06/23
    3. import cpca
    4. from cpca import drawer
    5. long_text = "对一个城市的评价总会包含个人的感情。如果你喜欢一个城市,很有可能是喜欢彼时彼地的自己。"\
    6.     "在广州、香港读过书,工作过,在深圳买过房、短暂生活过,去北京出了几次差。"\
    7.     "想重点比较一下广州、深圳和香港,顺带说一下北京。总的来说,觉得广州舒适、"\
    8.     "香港精致、深圳年轻气氛好、北京大气又粗糙。答主目前选择了广州。"
    9. df = cpca.transform_text_with_addrs(long_text, pos_sensitive=True)
    10. drawer.draw_locations(df[cpca._ADCODE], "df.html")

    运行的时候可能会报这个错:

    1. (base) G:\push\20220623>python 1.py
    2. Traceback (most recent call last):
    3.   File "1.py", line 12, in <module>
    4.     drawer.draw_locations(df[cpca._ADCODE], "df.html")
    5.   File "G:\Anaconda3\lib\site-packages\cpca\drawer.py", line 41, in draw_locations
    6.     import folium
    7. ModuleNotFoundError: No module named 'folium'

    使用pip安装即可:

    pip install folium

    然后重新运行代码,会在当前目录下生成 df.html, 双击打开,效果如下:

    bd55c6a5306cd8c97f8d46dde548dc62.png

    怎么用,是不是感觉非常方便?以后地点的识别用这个模块就完全够了。

    还有更多的细节你可以访问这个项目的Github主页阅读,该项目的README完全中文编写,非常容易阅读:

    https://github.com/DQinYuan/chinese_province_city_area_mapper

    如果你无法访问GitHub,也可以在Python实用宝典公众号后台回复:cpca 下载完整项目。

    我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

    有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

    原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

    点击下方阅读原文可获得更好的阅读体验

    Python实用宝典 (pythondict.com)
    不只是一个宝典
    欢迎关注公众号:Python实用宝典

    ba58529615f46880f07b6591836c1270.png

  • 相关阅读:
    Twitter 审核研究联盟 - 深入了解 Twitter 上对话的安全性和完整性。
    360测试开发技术面试题目
    基于DDTBOX,使用线性支持向量回归(SVR)从ERP数据中解码连续变量
    瞬间抠图!揭秘 ZEGO 绿幕抠图算法背后的技术
    【STM32学习】工程模板&跑马灯
    Python&C++相互混合调用编程全面实战-20python+QT+ffmpeg综合项目实战的需求和需要用到的库
    基于51单片机的多种音乐盒播放器Proteus仿真系统
    sql sever 数据更改
    总结vue 需要掌握的知识点
    数据库扫描工具scuba
  • 原文地址:https://blog.csdn.net/u010751000/article/details/125437750