Python 地址文本分析:提取省市县行政区信息
创始人
2025-07-04 10:20:43
0

Python 地址文本分析:提取省市县行政区信息

通过百度地图开放平台的API,在地址查询经纬度后可以通过经纬度来获得地址所在的省市县的信息。除此之外,我们还可以通过文本分析的方法,直接通过地址来获得省市县的信息,这样速度更快,而且也不需要收到API每天300w限量的约束。地址文本分析是一个非常常见的需求,如何从复杂的地址信息中高效、准确地提取关键的行政区划信息呢?我们将介绍一个基于 jionlp 的方法,并深入解析相关代码。

代码功能

本代码主要完成以下功能:

1. 从 .dta 文件中读取数据;

2. 使用 jionlp 对地址进行解析,提取省市县信息;

3. 分块处理数据,确保大数据量下的稳定运行;

4. 对每次处理的结果进行中间存储,确保数据处理的可恢复性。

代码解析

接下来,我们详细解析代码的每一部分:

## Python 地址文本分析代码解读

```python
# 导入必要的库
import os
import pandas as pd
import jionlp as jio

# 设置数据路径,并指定要读取的字段
data_path = "I:\\baiduAPI\\move_address\\cleaned_move_addr.dta"
use_cols = ['id', 'date', 'unified_code', 'new_address', 'old_address']

# 使用 pandas 读取 .dta 格式的数据
df = pd.read_stata(data_path, columns=use_cols)  # 仅读取指定列,节省内存

# 定义地址解析函数,输入是 DataFrame 的每一行
def extract_location_info(row):
    # 循环处理 'new_address' 和 'old_address' 两个字段
    for column, prefix in [('new_address', 'new'), ('old_address', 'old')]:
        address = row[column]
        try:
            # 使用 jionlp 进行地址解析
            result = jio.parse_location(address)
            
            # 根据解析结果更新当前行的省、市、县字段
            row[f'{prefix}_province'] = result.get('province', None)
            row[f'{prefix}_city'] = result.get('city', None)
            row[f'{prefix}_county'] = result.get('county', None)
            
            # 打印处理成功的信息
            print(f"Processing {column} for ID {row['id']} - Success!")
        except Exception as e:
            # 如果解析出错,将对应字段设置为 None
            row[f'{prefix}_province'] = None
            row[f'{prefix}_city'] = None
            row[f'{prefix}_county'] = None
            # 打印处理失败的信息
            print(f"Processing {column} for ID {row['id']} - Failed! Error: {e}")
    return row  # 返回处理后的行

# 设置每次处理的数据块大小,有助于节省内存
chunk_size = 500000
for i in range(0, len(df), chunk_size):  # 按照 chunk_size 大小分块处理数据
    # 定义每块数据的临时输出路径
    temp_output_path = f"I:\\baiduAPI\\temp_processed_move_address_{i//chunk_size + 1}.csv"
    
    # 检查临时文件是否已存在,如果存在则跳过,实现断点续传功能
    if os.path.exists(temp_output_path):
        print(f"Chunk {i//chunk_size + 1} already processed. Skipping...")
        continue
    
    # 截取当前块的数据
    df_chunk = df.iloc[i:i+chunk_size]
    # 对当前块的数据应用地址解析函数
    df_chunk = df_chunk.apply(extract_location_info, axis=1)
    # 将处理后的数据保存到临时 CSV 文件
    df_chunk.to_csv(temp_output_path, index=False, encoding='utf-8-sig')
    # 打印保存信息
    print(f"Saved processed data to: {temp_output_path}")

# 定义最终的输出路径
output_path = "I:\\baiduAPI\\processed_move_address.csv"
# 读取所有临时文件并合并
df = pd.concat([pd.read_csv(f"I:\\baiduAPI\\temp_processed_move_address_{i//chunk_size + 1}.csv", encoding='utf-8-sig') for i in range(0, len(df), chunk_size)], ignore_index=True)
# 将合并后的数据保存为 CSV 文件
df.to_csv(output_path, index=False, encoding='utf-8-sig')
# 打印完成信息
print("\nProcessing completed and saved to:", output_path)

代码优势

1. 高效解析:利用 jionlp 包,我们可以快速、准确地对地址进行解析。

2. 分块处理:当处理大规模数据时,分块处理可以有效减少内存消耗,确保代码的稳定运行。

3. 中间结果保存:代码可以将每块数据的处理结果分别保存,即使中途出现异常,也能从断点处继续,大大提高了数据处理的鲁棒性。

4. 异常处理:对于可能出现的异常地址格式,代码能够捕捉异常并进行相应的处理,确保整体流程不会因单个错误而中断。

结语

通过这篇文章,我们了解了如何利用 jionlp 对地址进行解析,并针对大规模数据进行稳定、高效的处理。这种方法不仅适用于地址文本分析,还可以应用于其他文本数据处理任务,展现了 Python 在数据处理方面的强大能力。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...