中文地址要素解析:基于CRF++和Jieba的地址信息提取
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++的官方文档。
最后,需要注意的是,本程序只是一个示例,实际应用中需要根据具体情况进行修改和优化。
原文地址: https://www.cveoy.top/t/topic/joLR 著作权归作者所有。请勿转载和采集!