import jieba

def parse_address(address): # 分词 words = jieba.cut(address) # 初始化地址要素 province = '' city = '' district = '' street = ''

houseno = ''
cellno = ''
floorno = ''
devzone = ''
community = ''


# 初始化标签
tag_list = []
# 遍历分词结果
for word in words:
    # 判断是否为省份
    if word.endswith('省') or word.endswith('自治区'):
        for char in word:
            if char == word[0]:
                tag_list.append('B-prov')
            elif char == word[-1]:
                tag_list.append('E-prov')
            else:
                tag_list.append('I-prov')
        province = word
    # 判断是否为直辖市
    elif word in ['北京', '上海', '天津', '重庆']:
        for char in word:
            if char == word[0]:
                tag_list.append('B-city')
            elif char == word[-1]:
                tag_list.append('E-city')
            else:
                tag_list.append('I-city')
        province = word + '市'
        city = word + '市'
    # 判断是否为城市
    elif word.endswith('市'):
        for char in word:
            if char == word[0]:
                tag_list.append('B-city')
            elif char == word[-1]:
                tag_list.append('E-city')
            else:
                tag_list.append('I-city')
        city = word
    # 判断是否为区县
    elif word.endswith('区') or word.endswith('社区')or word.endswith('庄')or word.endswith('塘')or word.endswith('演'):
        for char in word:
            if char == word[0]:
                tag_list.append('B-district')
            elif char == word[-1]:
                tag_list.append('E-district')
            else:
                tag_list.append('I-district')
        community = word

    # 判断是否为村
    elif word.endswith('村') or word.endswith('县'):
        for char in word:
            if char == word[0]:
                tag_list.append('B-district')
            elif char == word[-1]:
                tag_list.append('E-district')
            else:
                tag_list.append('I-district')
        district = word


    # 判断是否为城
    elif word.endswith('城'):
        for char in word:
            if char == word[0]:
                tag_list.append('B-devzone')
            elif char == word[-1]:
                tag_list.append('E-devzone')
            else:
                tag_list.append('I-devzone')
        devzone = word

    # 判断是否为街道
    elif word.endswith('街') or word.endswith('路') or word.endswith('巷') or word.endswith('道'):
        for char in word:
            if char == word[0]:
                tag_list.append('B-town')
            elif char == word[-1]:
                tag_list.append('E-town')
            else:
                tag_list.append('I-town')
        street = word
    # 判断是否为门牌号
    elif word.isdigit():
        for char in word:
            if char == word[0]:
                tag_list.append('B-roadno')
            elif char == word[-1]:
                tag_list.append('E-roadno')
            else:
                tag_list.append('I-roadno')
    # 判断是否为楼号
    elif word.endswith('栋') or word.endswith('幢') or word.endswith('座'):
        for char in word:
            if char == word[0]:
                tag_list.append('B-houseno')
            elif char == word[-1]:
                tag_list.append('E-houseno')
            else:
                tag_list.append('I-houseno')
            houseno = word


    # 判断是否为单元
    elif word.endswith('单元') :
        for char in word:
            if char == word[0]:
                tag_list.append('B-cellno')
            elif char == word[-1]:
                tag_list.append('E-cellno')
            else:
                tag_list.append('I-cellno')
            cellno = word

    # 判断是否为楼层
    elif word.endswith('楼') :
        for char in word:
            if char == word[0]:
                tag_list.append('B-floorno')
            elif char == word[-1]:
                tag_list.append('E-floorno')
            else:
                tag_list.append('I-floorno')
            floorno = word

    # 判断是否为POI
    else:
        for char in word:
            if char == word[0]:
                tag_list.append('B-poi')
            elif char == word[-1]:
                tag_list.append('E-poi')
            else:
                tag_list.append('I-poi')
# 返回地址要素和标签
return province, city, district, street,community ,devzone,  houseno, cellno,floorno, ' '.join(tag_list)

读取文件中的地址信息

with open('1.txt', 'r', encoding='utf-8') as f: with open('对对对队_addr_parsing_runid.txt', 'w', encoding='utf-8') as f_out: for line in f: # 获取地址信息 id_, info = line.strip().split('') # 解析地址要素和标签 province, city, district, street, community ,devzone, houseno, cellno, floorno, tags = parse_address(info) # 将结果写入文件 f_out.write(id_ + '' + info + '' + tags + ' ')

使用train.conll进行训练 train.conll部分内容如下 浙 B-prov 江 E-prov 杭 B-city 州 I-city 市 E-city 江 B-district 干 I-district 区 E-district 九 B-town 堡 I-town 镇 E-town 三 B-community 村 I-community 村 E-community 一 B-poi 区 E-poi

浙 B-prov 江 I-prov 省 E-prov 温 B-city 州 I-city 市 E-city 平 B-district 阳 I-district 县 E-district 海 B-town 西 I-town 镇 E-town 宋 B-poi 埠 I-poi 公 I-poi 园 E-poi 南 B-road 路 E-road 0 B-roadno 0 I-roadno 0 I-roadno 0 I-roadno 号 E-roadno

浙 B-prov 江 I-prov 省 E-prov 余 B-district 姚 I-district 市 E-district 模 B-poi 具 I-poi 城 E-poi 金 B-road 型 I-road 路 E-road 0 B-roadno 0 I-roadno 0 I-roadno 号 E-roadno _ O 样 B-subpoi 样 I-subpoi 红 I-subpoi 0 I-subpoi A I-subpoi 打 I-subpoi 印 E-subpoi

浙 B-prov 江 I-prov 省 E-prov 杭 B-city 州 I-city 市 E-city 江 B-district 干 I-district 区 E-district 白 B-town 杨 I-town 街 I-town 道 E-town 下 B-devzone 沙 I-devzone 开 I-devzone 发 I-devzone 区 E-devzone 世 B-poi 茂 I-poi 江 I-poi 滨 I-poi 花 I-poi 园 E-poi 峻 B-subpoi 景 I-subpoi 湾 E-subpoi 0 B-houseno 0 I-houseno 幢 E-houseno

秋 B-road 菱 I-road 路 E-road 浙 B-poi 江 I-poi 兰 I-poi 溪 I-poi 金 I-poi 立 I-poi 达 I-poi 框 I-poi 业 I-poi 有 I-poi 限 I-poi 公 I-poi 司 E-poi

南 B-district 湖 I-district 区 E-district 中 B-road 环 I-road 南 I-road 路 E-road 和 O 花 B-road 园 I-road 路 E-road 交 B-intersection 叉 I-intersection 口 E-intersection 嘉 B-city 兴 I-city 市 E-city 城 B-poi 乡 I-poi 规 I-poi 划 I-poi 建 I-poi 设 I-poi 管 I-poi 理 I-poi 委 I-poi 员 I-poi 会 E-poi

下 B-town 关 I-town 镇 E-town 嘉 B-road 士 I-road 伯 I-road 大 I-road 道 E-road 龙 B-poi 泉 I-poi 组 I-poi 团 E-poi 物 B-poi 管 I-poi 处 E-poi

火 B-poi 车 I-poi 站 E-poi 旧 B-poi 家 I-poi 属 I-poi 区 E-poi 石 B-poi 转 I-poi 单 I-poi 身 I-poi 宿 I-poi 舍 E-poi 对 O 面 O

使用train.conll进行作为训练的数据集,通过机器学习算法,进行中文NLP地址要素解析文件1.txt python程序内容:中有调用了jieba分词库,因此需要先安装jieba库。安装方法为在命令行中输入pip install jieba。

另外,在使用train.conll进行训练时,需要使用CRF++工具进行训练。具体使用方法可以参考CRF++的官方文档。

最后,需要注意的是,本程序只是一个示例,实际应用中需要根据具体情况进行修改和优化。

中文地址要素解析:基于CRF++和Jieba的地址信息提取

原文地址: https://www.cveoy.top/t/topic/joLR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录