def test(): sample_str = [ "江西省南昌市东湖区中大青山湖花园25栋1单元202室", "遵义市红花岗区海尔大道东方星城B4-27-4", "上海春城闵行区莲花南路1108弄39号502,陈斌 ,188 2120 0363", "湖南省长沙市雨花区万科金域华府一期8栋202", "福建省鼓楼区软件大道89号", "上海市浦东新区张杨路1515弄国际华城12号2903室" ] my_cpca = CPCATransformer(myumap.umap) addr_final = my_cpca.transform(sample_str) print(addr_final)
def transform(location_strs, umap=myumap): """将地址描述字符串转换以"省","市","区"信息为列的DataFrame表格 Args: locations:地址描述字符集合,可以是list, Series等任意可以进行for in循环的集合 比如:["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区"] umap:自定义的区级到市级的映射,主要用于解决区重名问题,如果定义的映射在模块中已经存在,则会覆盖模块中自带的映射 Returns: 一个Pandas的DataFrame类型的表格,如下: |省 |市 |区 | |上海市|上海市|徐汇区| |福建省|泉州市|洛江区| """ from chinese_province_city_area_mapper.transformer import CPCATransformer cpca = CPCATransformer(umap) return cpca.transform(location_strs)
def address_extract(data_raw): data = data_raw.copy() cpca = CPCATransformer(myumap.umap) nr = data['受理内容'].str.findall(r'(?:^|\n)([^【^】].+)') quxian = data['受理内容'].str.findall(r'【区/县】([^【^】^\r^\n]+)') luming = data['受理内容'].str.findall(r'【路名】([^【^】^\r^\n]+)') data['区/县'] = quxian.str.get(0) data['路名'] = luming.str.get(0) data['受理正文内容'] = nr.str.join('') data['受理正文内容'] = data['受理正文内容'].str.strip() addr_df = cpca.transform(data["受理正文内容"]).reindex(columns=['省', '市', '区']) data = pd.concat([data, addr_df], axis=1) data['街道'] = data.apply(mymap, axis=1) processed = data.apply(mix_addr, axis=1) processed.drop(['区/县', '路名', '受理正文内容'], axis=1, inplace=True) return processed
def get_city_name(): cur = conn.cursor() cur.execute("select * from test") print('共有', cur.rowcount, '条数据') results = cur.fetchall() for r in results: location_str = [r[2]] cpca = CPCATransformer({"朝阳区": "北京市"}) #遇到多个朝阳区则统一映射到北京市 df2 = cpca.transform(location_str) df2.to_sql( name='try', con=engine, if_exists='append', index=False, index_label=False, ) cur.close()
def transform(location_strs, umap=myumap, index=[]): """将地址描述字符串转换以"省","市","区"信息为列的DataFrame表格 Args: locations:地址描述字符集合,可以是list, Series等任意可以进行for in循环的集合 比如:["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区"] umap:自定义的区级到市级的映射,主要用于解决区重名问题,如果定义的映射在模块中已经存在,则会覆盖模块中自带的映射 index:可以通过这个参数指定输出的DataFrame的index,默认情况下是range(len(data)) Returns: 一个Pandas的DataFrame类型的表格,如下: |省 |市 |区 |地址 | |上海市|上海市|徐汇区|虹漕路461号58号楼5楼 | |福建省|泉州市|洛江区|万安塘西工业区 | """ from chinese_province_city_area_mapper.transformer import CPCATransformer cpca = CPCATransformer(umap) # loc这里的作用纯粹是为了让输出结果更好看一些 return cpca.transform(location_strs, index).loc[:, ('区', '市', '省', '地址')]
def location_count(oriText: str): # ԭ�Ľ��� # ������ֳ�list clauseList = punc_clauseList(oriText) # ��list�еõ��ص� �ص㴦��--ֱ�Ӳ�ȫ��default��3����ȡ��γ�� locationDF = CPCATransformer().transform(clauseList) # dataFrame # �ص������� locationList = [repr(tuple(x)) for x in locationDF.values] dict2 = dict(Counter(locationList)) dict2.pop("('', '', '')", 0) return dict2
def mix_addr(df): import re rigion_sub = ['区', '县', '市', '', '域', '岛', '旗'] cpca = CPCATransformer(myumap.umap) for sub in rigion_sub: quxian = str(df['区/县']) + sub addr_all = cpca.transform(pd.Series(quxian)) if addr_all['区'].iloc[0]: break lum = re.compile(r'^[\u4e00-\u9fa5].*') addr_all = addr_all.iloc[0] if not df['区'] and not df['市']: df['区'] = addr_all['区'] df['市'] = addr_all['市'] df['省'] = addr_all['省'] elif not df['区'] and df['市']: df['区'] = addr_all['区'] if not df['街道']: if re.match(lum, str(df['路名'])): df['街道'] = df['路名'] return df
def transform(location_strs, umap=myumap, index=[], cut=True, lookahead=8): """将地址描述字符串转换以"省","市","区"信息为列的DataFrame表格 Args: locations:地址描述字符集合,可以是list, Series等任意可以进行for in循环的集合 比如:["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区"] umap:自定义的区级到市级的映射,主要用于解决区重名问题,如果定义的映射在模块中已经存在,则会覆盖模块中自带的映射 index:可以通过这个参数指定输出的DataFrame的index,默认情况下是range(len(data)) cut:是否使用分词,默认使用,分词模式速度较快,但是准确率可能会有所下降 lookahead:只有在cut为false的时候有效,表示最多允许向前看的字符的数量 默认值为8是为了能够发现"新疆维吾尔族自治区"这样的长地名 如果你的样本中都是短地名的话,可以考虑把这个数字调小一点以提高性能 Returns: 一个Pandas的DataFrame类型的表格,如下: |省 |市 |区 |地址 | |上海市|上海市|徐汇区|虹漕路461号58号楼5楼 | |福建省|泉州市|洛江区|万安塘西工业区 | """ from chinese_province_city_area_mapper.transformer import CPCATransformer cpca = CPCATransformer(umap) # loc这里的作用纯粹是为了让输出结果更好看一些 return cpca.transform(location_strs, index, cut, lookahead).loc[:, ('区','市','省','地址')]
"上海春城闵行区莲花南路1108弄39号502,陈斌 ,188 2120 0363", "湖南省长沙市雨花区万科金域华府一期8栋202", "福建省鼓楼区软件大道89号", "上海市浦东新区张杨路1515弄国际华城12号2903室" ] my_cpca = CPCATransformer(myumap.umap) addr_final = my_cpca.transform(sample_str) print(addr_final) if __name__ == '__main__': # test() if len(sys.argv) < 2: print("请按照格式输入:CityFilter [Excel文件路径]") city_location_str = [] df = pd.read_excel(sys.argv[1], usecols=[0]) data = df.loc[:] print("读取指定行的数据:\n{0}".format(data)) for raw in df.values: str = ''.join(raw) city_location_str.append(str) print("开始解析省市区数据,请稍等......\n") # df_addr = pd.DataFrame(transform(city_location_str, open_warning=False, lookahead=20)) my_cpca = CPCATransformer(myumap.umap) my_cpca.umap = {"鼓楼区": "南京市", "大理市": "大理市", "朝阳区": "北京市"} df_addr = pd.DataFrame(my_cpca.transform(city_location_str)) print("数据处理完毕,分类显示如下:\n") print(df_addr) df_addr.insert(loc=0, column="原始收发地址", value=city_location_str) print(">>> 正在生成新的Excel地址簿,请稍等... <<<") df_addr.to_excel("ReNewAddress.xlsx", sheet_name="renew") print(">>> Excel生成结束 <<<")