일반적인 문서(docx, pdf, pptx ... )에서 주소를 찾아야 하는 일이 생겼다.
공수가 많이 들어갈 것 같은 작업이라 미뤘지만 이제는 미룰 수 없는.. 근데 생각보다 빨리 잘 끝났다.
https://www.juso.go.kr/addrlink/addressBuildDevNew.do?menu=mainJusoDb
도로명주소 DB 다운로드 | 도로명주소 개발자센터
www.juso.go.kr
위 사이트에서 대한민국 주소 데이터베이스를 다운받을 수 있었다. (우리나라도 요즘 잘해놓네...)
내가 필요한 정보는 우리나라의 도로명, 시도명, 시군구명, 읍면동명 이렇게 네가지였고
다운받은 DB를 찾아보니 적절히 분류된게 있어서 사이트에서 제공해준 [가이드]를 참고해 전처리 하였다.
전처리한 DB는 '개선_도로명코드_전체분' 이다. 나는 도로명, 읍면동 정보까지 모두 필요했기때문에..
2021년 6월기준 데이터를 사용했고 전처리한 데이터를 업로드 하려 했지만 10MB이상이라 업로드가 안된다 ㅠㅠ
이제 해당 데이터를 활용하여 사전을 만들어보자.
데이터 로드
import pandas as pd
df = pd.read_csv('address_DB.txt', sep = "|", engine='python', encoding = "cp949")
df.head()

해당 데이터에서 column별로 이름을 뽑아낼 생각이다.
생각보다 데이터 크기가 크므로 hash(dictionary)를 사용하는걸 추천한다.
중복제거 겸 도로명 counting 을 위한 함수
def generate_hash_dictionary(datas:list):
dictionary = {}
for data in datas:
if data in dictionary:
dictionary[data] += 1
else:
dictionary[data] = 1
return dictionary
처리 결과
load_name = df['도로명'].values.tolist()
load_name = generate_hash_dictionary(load_name)

맨 뒤글자 추출 및 counting 함수
위 함수랑 똑같은데 data에 [-1]만 붙여줌..
def cutting_last_string(datas:list):
dictionary = {}
for data in datas:
data = data[-1]
if data in dictionary:
dictionary[data] += 1
else:
dictionary[data] = 1
return dictionary

이런식으로 도로명, 시도명, 읍면동명 등 구분을 다 해주고 위함수를 약간 수정하여 data[:-1] 로 추출해주면 딱 이름만 나온다. 이 결과를 활용하여 주소 사전을 만들었다.
def cutting_name_string(datas:list):
dictionary = {}
for data in datas:
data = data[:-1]
if data in dictionary:
dictionary[data] += 1
else:
dictionary[data] = 1
return dictionary

이제 정규식과 조합해서 잘 활용해보자.....ㅠㅠ
ps. 도로명 이후에 시군구, 읍면동 같은 경우는 null값이 꽤 있으므로
dfs= df['시군구명'].dropna(axis=0)
이런식으로 nan값을 제거해 사용하면 된다.
'공부 > Python' 카테고리의 다른 글
[python] pandas를 활용한 간단한 csv to tsv 또는 tsv to csv (0) | 2021.09.28 |
---|---|
[python] pyinstaller centOS에서 빌드하기(docker) (0) | 2021.06.25 |
[python] pyinstaller jinja2.PackageLoader Error (0) | 2021.06.24 |
[python] pyinstaller 와 빌드 후 ini 환경변수 읽기(konfig) (1) | 2021.06.19 |
[python] pyinstaller 일곱번의 삽질 for uvicorn + FastAPI (1) | 2021.06.18 |
댓글