파이썬으로  parquet 파일을 읽어오면서 일정크기마다 텍스트로 저장하는 프로그램을 작성하였다. 그러면서

body += row.text + "\n"


같은 구문을 사용하였다. 나는 서버 개발자라서 이런 식의 구문을 사용했을 때 엄청 많이 반복적으로 사용하는 경우는 없었다. 그런데 이것은 집에서 하는 개인프로젝트로 엄청 큰 parquet 파일을 읽는 작업이라서 매우 큰 row.text 에 대해 반복적으로 하는 작업이었다. 
그런데 프로그램을 동작시키자 매우 느리게 동작했다.  내 개인적인 느낌으로는 이게 그렇게 느린 만한 작업이 아니다고 생각해서 break 를 잡아가면서 테스트 해 보았다. body 가 커질 수록 느려지는 느낌이었다. 찾아보니 이런 case 는 

items = []
for key, row in df.iterrows():
    items.append(row.text)
"'\n'.join(items)


이런것을 추천하는 것으로 보았다. 

자바에서의 StringBuffer 가 아닌 String 같은 느낌인 것 같다. 그러다보니 덧셈 연산이 발생할 때마다 메모리 공간 할당이 발생하는 것 같다. (정확한 것을 찾아 봐야한다. )

어째든 내 경우 StringIO 을 이용했다. 

io_file = StringIO()
for key, row in df.iterrows():
    io_file.write(row.text)
    io_file.write("\n\n")
io_file.getvalue()

같이 수정해 보니 꽤 쓸만한 속도로 동작했다. 

 요즘 한국어 말뭉치를 수집하고 있다. 예전부터 자연어분석, 형태소분석 이런 것에 관심이 많다보니 한국어 말뭉치에 대해 관심이 많았다. 그러다 개인적으로 GPT 나 LLAMA 같은 LLM 모델들이에 관심을 가지다보니 다시 말뭉치로 내 관심이 돌아오게 되었다. 
 전에 공개된 세종프로젝트도 그랬지만 정부프로젝트로 수집된 말뭉치들이 사용에 제약이 많은 것 같다. 일부 말뭉치들이 소설, 대화글이기 때문에 저자권에 위반된다든지 개인정보 처리에 문제가 될 수는 있어서 제약이 있는 것은 이해 할 수 있다. 그런데 모든 말뭉치가 그렇게 제약을 가져야 하는지는 의문이다.
 특히 신문, 방송사의 경우 정부의 재정이 직접 투입되는 것으로 알고 있는데, 몇년이 지난 기사의 경우 일부라도 공개 할 수 있는 것 아닌가? 이건 해결 할 수 없는지 의문이다.  

 어째든 이런 저런 이유로 여러 말뭉치들이 서약을 한다든지 사용에 제약이 있다. 그래서 이런 제약이 없는 말뭉치를 수집하는 프로젝트를 하고 있다. 이름하여 보따리 프로젝트이다. https://github.com/yiunsr/boddari

 CCL BY, CCL BY-SA 같은 크리에이티브 커먼즈 라이선스와 기부된 글(https://gongu.copyright.or.kr/gongu/main/main.do 이런 곳에서 찾을 수 있다.), 저자권이 소멸된 글, 정부에서 생성하는 "공공누리 라이선스"를 가진글 들을 모우고 있다. 이런 글들은 해당 라이선스만 지키서 사용하면된다(저자권자 표시, 2차 창작된 글도 동일한 라이선스로 공개할 것 같은 조건). 아무래도 상업적사용도 가능할 것 같아 CCL BY-NC 계열은 생각하고 있지 않다. 

이것 저것 다양하게 모은 상태인데, 벌써 글 수집에 한계가 느껴진다. 우리나라의 경우 CCL-BY 나 CCL-BY-SA 글이 많지 않다. 위키피디아나 리브레 위키를 제외하고는 거의 없다시피 하다. 그리고 CCL 에 대한 이해가 부족한 것 같다. 블로그 글의 경우 CCL BY-NC 같은 라이선스를 표시해두고 자바스크립트로 글 복사를 막는 형태의 블로그가 많이 존재한다. CCL 를 붙였다는 것은 공유를 하자는 의미있는데, 글 복사를 막는 것은 뭐하자는 것인지 모르겠다. 

 말뭉치 수집을 위해 따로 wiki 라도 만들어서 사용자들에게 기부라도 받아야 하나 하는 생각이 든다. 

 

 오늘 회사에서 이것과 씨름을 했다. http://openapi.nsdi.go.kr/nsdi/eios/ServiceDetail.do?svcSe=F&svcId=F018&provOrg=NIDO 에 광역시나 도별로 GIS 건물정보를 받을 수 있다. 파일을 다운 받아서 압축을 해제하면 .shp, .dbf, .prj 파일들이 있다. 
 이 파일의 의미를 처음으로 알게되었는데,  .shp 파일은 맵의 위치, 도형정보가 들어있다. 이 파일을 잘 이용하면 실제 위도, 경도를 계산할 수 있다. .dbf 는 DB파일이다. 다운받은파일에서는 건물 주소, 건물명, 사용승인일등이 들어 있다. .shp 에 매핑되는 지점의 정보가 들어 있는 것이다. 그리고 .prj 는 .shp 파일의 맵의 위치정보가 어떤 좌표계를 사용했는지 알려주는 것 같은데 실제 이용되는 데이터인지는 모르겠다. 

 이 작업을 하면서 알게 되었는데, 우리가 흔히 위도 경로라는 것도 좌표계의 하나로 WGS84 경위도: GPS가 사용하는 좌표계를 이용해야 한다. 그리고 해당 파일의 좌표계는 "EPSG:5174" 이다. 

파이썬 코드를 작성해 보면 아래와 같다.

import shapefile
from shapely.geometry import Polygon
from dbfread import DBF
from pyproj import CRS, Transformer

# https://www.osgeo.kr/17
# EPSG:5174
EPSG5174 = """+proj=tmerc +lat_0=38 +lon_0=127.0028902777778 +k=1
+x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs
+towgs84=-115.80,474.99,674.11,1.16,-2.31,-1.63,6.43"""


# Projection 정의
# EPSG:5174
epsg5174_crs = CRS(EPSG5174)
  

# WGS84 경위도: GPS가 사용하는 좌표계 EPSG:4326
epsg4326_crs = CRS('epsg:4326')

transformer = Transformer.from_crs(epsg5174_crs, epsg4326_crs)

fileName = './res/AL_11_D164_20230125'
sf = shapefile.Reader(shp=(fileName + ".shp"))
dbf = DBF(fileName + ".dbf" , encoding="CP949")
# records = sf.records()

index = -1
shapes = sf.shapes()
for record in dbf:
	index += 1
	if index % 10000 != 0:
		continue
	print("index : " + str(index))
	print("n_count : " + str(n_count))

	shape = shapes[index]
	polygon = Polygon(shape.points)
	center = polygon.centroid
	gis = transformer.transform(center.x, center.y)
	# gis = proj.transform(center.x, center.y)
	print("중심좌표 : " + gis)
  

print("======== END ========")


사용한 파이썬 라이브러리는 shapefile, dbfread, pyproj 이다. shapefile은 shp 파일을 불러오는 역할을 한다. 이 라이브러리을 통해 dbf 파일도 같이 읽을 수는 있는데 속도가 느려서 dbfread 라이브러리를 사용했다. pyproj 는 shapefile 라이브러리를 통해 얻어온 좌표를 변환할 때 사용한다. 이 라이브러리를 통해 위도 경도 값을 얻을 수 있다. 
 gis 변수에 위도, 경도 tuple 이 있고, record에는 dbf 파일의 정보가 있다. 서로 같은 순서를 가지기 때문에 이렇게 하면 동일한 건물에 대해 위도,경도와 기타 정보를 같이 획득할 수 있다. 


내 설명이 많이 불친절하긴 한데, 다른 사이트들에 개념은 잘 설명되어 있다. 그런데 파이썬 코드가 없어서 이 글을 올린다.