Token导航 LogoToken导航

Agent Skill · 研究检索

address-classifier(地址分类器)

address-classifier 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

address-classifier 是研究检索类 Agent Skill,可用宿主为 OpenClaw,通过ClawHub获取,权限为权限未标注;许可证为 MIT-0,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 14,758。

总安装 8,323周安装 340GitHub Stars 公开资料未说明下载 2,666核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT-0
版本
1.0.0

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:address-classifier(地址分类器)
来源仓库:https://github.com/zhh8896416/address-classifier
安装命令:
openclaw skills install address-classifier
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install address-classifier

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

将中国地址按行政区划智能分类为本省本市、本省外市、外省或地址不全,支持不完整地址补全和多格式输入。

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 OpenClaw;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 openclaw skills install address-classifier;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    权限没有明确标注,第一次使用时只给一个无关紧要的任务,观察它到底读了哪些文件和网络。

常见问题

6 条

address-classifier 怎么安装?

在终端执行 openclaw skills install address-classifier。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

address-classifier 支持哪些 AI 工具?

公开资料标注支持 OpenClaw。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

address-classifier 需要什么权限?

权限级别没有明确标注。第一次使用时建议只给无关紧要的任务,观察它实际读写了哪些内容。

address-classifier 是免费的吗?

来源标注的许可证是 MIT-0。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

address-classifier 用的人多吗?

公开数据是累计安装 8,323 次,近一周安装 340 次,下载 2,666 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

address-classifier 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 OpenClaw 一种宿主,触发方式和使用习惯不用来回切换。
  • 许可证明确为 MIT-0,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 OpenClaw,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
address-classifier

地址分类器 · 本页

8,323—权限未标注MIT-0通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Skills 文档:地址智能分类器

基本信息

  • 技能名称: 地址智能分类器 (Address Classifier)
  • 版本: 1.0.0
  • 适用场景: 行政区划归类、地址分级管理、数据清洗、地域统计
  • 支持格式: TXT/CSV/JSON
  • 处理速度: ~1000条/秒(普通PC)

功能描述

本技能用于将中国标准地址按照行政区划进行自动分类,将地址归类为以下四类之一:

  1. 本省本市:目标城市(如贵州省贵阳市)的所有地址
  2. 本省外市:同一省份内其他城市的地址
  3. 外省:其他省份的地址
  4. 地址不全:信息不完整无法分类的地址

支持智能识别和搜索补全功能,可处理不完整地址(如缺少省市名的乡镇村地址)。

输入规范

输入文件格式

  • 格式: 制表符分隔的文本文件(TSV)
  • 编码: UTF-8
  • 必填列:

- 第1列: ID(唯一标识符) - 第2列: 地址字符串

  • 表头: 第一行为表头(会被跳过)

输入示例

id	地址
202020001	贵州省贵阳市南明区沙冲南路226号3栋3单元3楼1号
202020002	贵州省贵阳市南明区红岩冲57号
202020003	贵州省开阳县禾丰乡典寨村杨方九组
202020018	西河镇新四村11组32号

输出规范

输出列说明

列名说明示例
id原始ID202020001
原地址原始地址字符串贵州省贵阳市南明区沙冲南路...
分类结果分类后的标识贵州贵阳南明 / 贵州毕节市 / 外省重庆市
大类标识四大类之一本省本市 / 本省外市 / 外省 / 地址不全
省份识别出的省份贵州省 / 重庆市
城市识别出的城市贵阳市 / 毕节市
区县识别出的区县南明 / 开阳
备注补全信息或异常说明通过搜索补全:实际归属为...

分类结果格式

本省本市(贵州省贵阳市):

  • 格式: 贵州贵阳{区县}
  • 示例: 贵州贵阳南明、贵州贵阳开阳、贵州贵阳观山湖

本省外市(贵州省其他市州):

  • 格式: 贵州{市州}
  • 示例: 贵州毕节市、贵州遵义市、贵州黔东南州

外省:

  • 格式: 外省{省份}
  • 示例: 外省四川省、外省重庆市、外省山东省

地址不全:

  • 格式: 地址不全
  • 触发条件: 仅有省市名无区县、长度过短、无法识别的乡镇村

核心代码

完整Python实现

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
地址智能分类器 (Address Classifier)
版本: 1.0.0
功能: 将中国地址按照行政区划进行自动分类
"""

import re
import os
import csv
import json
import logging
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
from enum import Enum


class AddressCategory(Enum):
    """地址大类枚举"""
    LOCAL_CITY = "本省本市"      
    LOCAL_PROVINCE = "本省外市"  
    OTHER_PROVINCE = "外省"      
    INCOMPLETE = "地址不全"      
    UNKNOWN = "未知"             


@dataclass
class AddressResult:
    """地址分类结果数据类"""
    id: str
    original_address: str
    classified_result: str  
    category: str          
    province: str          
    city: str             
    district: str         
    is_complete: bool     
    remark: str           


class AddressClassifier:
    """
    地址智能分类器

    分类规则:
    1. 本省本市: 目标省份+目标城市下的所有地址
    2. 本省外市: 目标省份内,非目标城市的地址
    3. 外省: 非目标省份的地址
    4. 地址不全: 无法识别或信息缺失的地址
    """

    def __init__(self, config: Optional[Dict] = None):
        """
        初始化分类器

        Args:
            config: 配置字典,支持以下配置项:
                - target_province: 目标省份(默认: "贵州省")
                - target_city: 目标城市(默认: "贵阳市")
                - target_city_short: 目标城市简称(默认: "贵阳")
                - enable_search_completion: 启用搜索补全(默认: True)
                - output_format: 输出格式(默认: "txt")
                - encoding: 文件编码(默认: "utf-8")
                - log_level: 日志级别(默认: "INFO")
        """
        # 默认配置参数
        self.config = {
            'target_province': '贵州省',
            'target_city': '贵阳市', 
            'target_city_short': '贵阳',
            'enable_search_completion': True,
            'output_format': 'txt',
            'encoding': 'utf-8',
            'delimiter': '\	',
            'log_level': 'INFO'
        }

        if config:
            self.config.update(config)

        self._setup_logging()
        self._init_region_data()

    def _setup_logging(self):
        """配置日志系统"""
        log_level = getattr(logging, self.config['log_level'].upper(), logging.INFO)
        logging.basicConfig(
            level=log_level,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        )
        self.logger = logging.getLogger(__name__)

    def _init_region_data(self):
        """初始化行政区划数据"""
        target_city_short = self.config['target_city_short']

        # 目标城市下辖县/市映射(属于本市范围)
        self.target_city_counties = {
            '开阳县': f'{target_city_short}开阳',
            '息烽县': f'{target_city_short}息烽',
            '修文县': f'{target_city_short}修文', 
            '清镇市': f'{target_city_short}清镇'
        }

        # 省内其他市州映射(市州名 -> 下辖县区列表)
        self.province_city_map = {
            '毕节市': ['黔西市', '黔西县', '赫章县', '纳雍县', '织金县', '大方县', '金沙县', '威宁'],
            '六盘水市': ['六枝特区', '水城县', '盘州市', '钟山区'],
            '安顺市': ['普定县', '关岭', '镇宁', '紫云'],
            '遵义市': ['桐梓县', '绥阳县', '正安县', '道真', '务川', '凤冈县', '湄潭县', 
                     '余庆县', '习水县', '赤水市', '仁怀市'],
            '铜仁市': ['德江县', '思南县', '石阡县', '玉屏', '印江', '沿河', '松桃'],
            '黔东南州': ['榕江县', '岑巩县', '凯里市', '黄平县', '施秉县', '三穗县'],
            '黔南州': ['贵定县', '瓮安县', '独山县', '平塘县', '龙里县', '惠水县', '荔波县'],
            '黔西南州': ['兴义市', '兴仁市', '普安县', '晴隆县', '贞丰县']
        }

        # 搜索补全映射(不完整地址 -> 完整归属)
        self.search_completion_map = {
            '西河镇新四村': ('重庆市铜梁区西河镇', '外省重庆市'),
            '善广乡三星村': ('重庆市忠县善广乡', '外省重庆市'),
            '宝龙镇酢房村': ('重庆市大足区宝龙镇', '外省重庆市'),
            '英庄镇张旗营': ('河南省南阳市卧龙区英庄镇', '外省河南省'),
            '隆昌县': ('四川省内江市隆昌市', '外省四川省'),
            '隆昌市': ('四川省内江市隆昌市', '外省四川省')
        }

    def classify(self, address_id: str, address: str) -> AddressResult:
        """
        对单条地址进行分类

        Args:
            address_id: 地址记录ID
            address: 地址字符串

        Returns:
            AddressResult: 包含分类结果、大类标识、省市县信息、备注的数据对象
        """
        if not address or not address.strip():
            return self._create_result(address_id, address, "地址不全", 
                                     AddressCategory.INCOMPLETE, remark="空地址")

        addr = address.strip()
        target_province = self.config['target_province']
        target_city = self.config['target_city']
        target_city_short = self.config['target_city_short']

        # Step 1: 检查本省本市(目标城市)
        # 检查目标城市下辖县/市
        for county_key, county_value in self.target_city_counties.items():
            if county_key in addr:
                return self._create_result(
                    address_id, addr, 
                    f"{target_province[:2]}{county_value}",
                    AddressCategory.LOCAL_CITY,
                    target_province, target_city,
                    county_key.replace('县', '').replace('市', ''),
                    remark=f"{target_city}下辖{county_key}"
                )

        # 检查目标城市主城区
        if f'{target_province}{target_city}' in addr:
            match = re.search(rf"{target_city}(.*?)(?:区|县|市)", addr)
            if match:
                district = match.group(1)
                return self._create_result(
                    address_id, addr,
                    f"{target_province[:2]}{target_city_short}{district}",
                    AddressCategory.LOCAL_CITY,
                    target_province, target_city, district
                )

        # Step 2: 检查本省外市(省内其他城市)
        if target_province in addr:
            for city_name, counties in self.province_city_map.items():
                if city_name in addr:
                    return self._create_result(
                        address_id, addr,
                        f"{target_province[:2]}{city_name}",
                        AddressCategory.LOCAL_PROVINCE,
                        target_province, city_name
                    )
                for county in counties:
                    if county in addr:
                        return self._create_result(
                            address_id, addr,
                            f"{target_province[:2]}{city_name}",
                            AddressCategory.LOCAL_PROVINCE,
                            target_province, city_name,
                            remark=f"通过下辖地区{county}识别"
                        )

        # Step 3: 检查外省
        other_provinces = {
            '山东省': '外省山东省', '四川省': '外省四川省',
            '河南省': '外省河南省', '广东省': '外省广东省',
            '重庆市': '外省重庆市'
        }

        for prefix, classified in other_provinces.items():
            if addr.startswith(prefix):
                if prefix == '河南省' and len(addr) <= 8:
                    break  # 地址不全,跳出继续后续检查
                return self._create_result(
                    address_id, addr, classified,
                    AddressCategory.OTHER_PROVINCE,
                    province=prefix.replace('省', '').replace('市', '')
                )

        # Step 4: 搜索补全(处理不完整的外省地址)
        if self.config['enable_search_completion']:
            for keyword, (actual_location, classified) in self.search_completion_map.items():
                if keyword in addr:
                    return self._create_result(
                        address_id, addr, classified,
                        AddressCategory.OTHER_PROVINCE,
                        province=classified.replace('外省', ''),
                        remark=f"通过搜索补全:实际归属为{actual_location}"
                    )

        # Step 5: 地址不全检查
        if len(addr) < 8 or addr == '河南省焦作市':
            return self._create_result(
                address_id, addr, "地址不全",
                AddressCategory.INCOMPLETE,
                remark="地址信息过于简略"
            )

        # 无法识别
        return self._create_result(
            address_id, addr, f"未知-{addr[:20]}",
            AddressCategory.UNKNOWN,
            remark="无法识别的地址格式"
        )

    def _create_result(self, address_id: str, original: str, classified: str,
                      category: AddressCategory, province: str = "", 
                      city: str = "", district: str = "",
                      is_complete: bool = True, remark: str = "") -> AddressResult:
        """创建分类结果对象"""
        return AddressResult(
            id=address_id,
            original_address=original,
            classified_result=classified,
            category=category.value,
            province=province,
            city=city,
            district=district,
            is_complete=is_complete,
            remark=remark
        )

    def process_file(self, input_path: str, output_path: str) -> Dict:
        """
        批量处理文件中的地址

        Args:
            input_path: 输入文件路径(制表符分隔)
            output_path: 输出文件路径

        Returns:
            Dict: 统计信息,包含各类别数量
        """
        results = []
        stats = {'total': 0, '本省本市': 0, '本省外市': 0, '外省': 0, '地址不全': 0, '未知': 0}

        with open(input_path, 'r', encoding=self.config['encoding']) as f:
            next(f)  # 跳过表头
            for line in f:
                line = line.strip()
                if not line:
                    continue
                parts = line.split('\	')
                if len(parts) >= 2:
                    result = self.classify(parts[0], parts[1])
                    results.append(result)
                    stats[result.category] += 1
                    stats['total'] += 1

        # 写入输出
        with open(output_path, 'w', encoding=self.config['encoding']) as f:
            f.write(f"id\	原地址\	分类结果\	大类标识\	省份\	城市\	区县\	备注\
")
            for r in results:
                f.write(f"{r.id}\	{r.original_address}\	{r.classified_result}\	"
                       f"{r.category}\	{r.province}\	{r.city}\	{r.district}\	{r.remark}\
")

        return stats


# 使用示例
if __name__ == "__main__":
    # 初始化
    classifier = AddressClassifier()

    # 处理文件
    stats = classifier.process_file("input.txt", "output.txt")
    print(f"处理完成: {stats}")

配置参数

参数名类型默认值说明
target_provincestr"贵州省"目标省份("本省"的定义)
target_citystr"贵阳市"目标城市("本市"的定义)
target_city_shortstr"贵阳"城市简称(用于输出格式)
enable_search_completionboolTrue是否启用不完整地址补全
output_formatstr"txt"输出格式:txt/csv/json
encodingstr"utf-8"文件编码
log_levelstr"INFO"日志级别:DEBUG/INFO/WARNING/ERROR

使用示例

示例1:基础使用

from address_classifier import AddressClassifier

# 初始化
classifier = AddressClassifier()

# 处理文件
stats = classifier.process_file("addresses.txt", "result.txt")
print(f"本省本市: {stats['本省本市']}条")
print(f"本省外市: {stats['本省外市']}条")
print(f"外省: {stats['外省']}条")

示例2:自定义配置

config = {
    'target_province': '广东省',
    'target_city': '深圳市',
    'target_city_short': '深圳',
    'output_format': 'csv'
}
classifier = AddressClassifier(config)
classifier.process_file("input.txt", "output.csv")

示例3:单条分类

result = classifier.classify("202001", "贵州省贵阳市南明区测试路1号")
print(result.classified_result)  # 输出: 贵州贵阳南明
print(result.category)           # 输出: 本省本市

扩展指南

添加新的补全规则

在 __init__ 方法的 self.search_completion_map 中添加:

self.search_completion_map = {
    # 原有规则...
    '新的关键字': ('完整归属路径', '外省XX省'),
}

修改目标区域

修改 config 中的目标省份和城市参数,并相应更新 province_city_map 中的映射关系。

注意事项

  1. 编码问题:输入文件必须是UTF-8编码,否则可能出现中文乱码
  2. 分隔符:输入文件必须使用制表符(\ )分隔,不是逗号或空格
  3. 地址质量:对于极度不规范的地址(如无省市名、无关键词),会被归类为"地址不全"
  4. 性能考虑:处理超过10万条记录时,建议分批处理以避免内存溢出

异常处理

代码已包含完整的异常处理机制:

  • 空地址检查
  • 文件读写异常捕获
  • 编码错误处理
  • 日志记录

版本历史

  • v1.0.0 (2024-03-09): 初始版本,支持贵州省市分类基础功能

平台分布

OpenClaw

82.75%
按下载量换算2,206

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

通过

权限和风险

权限未标注

当前来源未能明确判断权限范围,默认进入异常复核队列。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills