이제부터는 지난 시간에 변환된 xml 파일들을 분석해서 훈련을 위해 필요한 데이터 셋을 만들 것이다.
공정위 사이트에서 추출한 데이터는 위의 사진과 같다. 많은 정보들이 있지만 내가 필요한 정보는 위의 사진과 같이 < 불공정 약관 조항 유형, 수정 전 약관 조항, 수정 후 약관 조항 > 정도가 있다. 반드시 포함해야 하는 단어는 '조항'이다. 추가로 필요한 단어는 '예시' '수정 전, 후' '시정 전, 후' 정도 생각해 볼 수 있다.
처음에는 필요한 텍스트를 직접 찾아서 수정 전, 수정 후 텍스트를 분류하려고 했다. 하지만 그 과정이 번거롭고 단순하지 않기 때문에 hwp의 xml 구조를 분석하고 태그를 이용하여 쉽게 분류하기로 했다.
hwpx의 구조는 위와 같다. 수정 전 약관 데이터, 수정 후 데이터 약관 데이터가 필요하다. 문서마다 조금 다르지만 대부분 column방향 두 칸으로 나누어진 표에 그 정보가 담겨 있었다. 따라서 cols="2" 속성을 갖는 태그에 접근하여 col="0"은 개선이 필요한 약관 데이터, col="1"은 개선된 데이터로 분류하여 저장하였다. 코드는 아래와 같다.
import xml.etree.ElementTree as ET
tree = ET.parse('/Users/jason/Test/code/test1/term2.xml')
root = tree.getroot()
lineseg = [lineseg[0] for lineseg in root[2][0][6]]
tableBody = []
# 2칸으로 나뉜 모든 테이블 노드 tableBody list에 저장하기
for x in lineseg:
if x.find('TableControl') != None: #모든 table에 접근
if x.find('TableControl').find('TableBody').attrib['cols'] == '2': #2개의 그룹으로 나뉜 table만 저장
tableBody.append(x.find('TableControl').find('TableBody'))
Fstring = [] # 개정 전 약관 텍스트
Tstring = [] # 개정 후 약관 텍스트
# 개정 전 약관과 개정 후 약관을 분류하여 Fstring과 Tstring에 저장하는 함수
def appendString(TorF, y):
mString = ''
for z in y.iter('Text'):
mString = mString + z.text
if not TorF:
Fstring.append(mString)
if TorF:
Tstring.append(mString)
# tableCell에 접근하여 col value를 이용하여 약관 분류하기
for x in tableBody:
for y in x.iter('TableCell'):
if y.attrib['col'] == '0' and y.attrib['colspan'] == '1': #2칸으로 나뉜 cell이 아닌 경우는 제외
appendString(False, y)
if y.attrib['col'] == '1':
appendString(True, y)
term2.xml 파일에 접근하여 Fstring과 Tstring에 필요한 데이터를 분류하여 저장하였다. 이 안에는 비어있는 데이터도 물론 존재하며 불필요한 데이터도 포함되었을 수도 있다. 다음 시간에는 모든 xml 문서의 약관 데이터를 전 처리하는 과정을 진행할 것이다. 위의 코드를 실행하여 Fstring과 Tstring을 출력해 보면 다음과 같다.
Fstring: 수정 전 약관
Tstring: 수정 후 약관
'프로젝트 > Project1' 카테고리의 다른 글
Toy Project 1 (7) - M1 mac 설정하기(삽질) (0) | 2021.09.21 |
---|---|
Toy Project 1 (6) - HWP XML PARSING하기 2 (0) | 2021.09.12 |
Toy Project 1 (4) - HWP파일 XML로 바꾸기 (0) | 2021.05.30 |
Toy Project 1 (3) - CONDA PATH 설정하기 (0) | 2021.05.29 |
Toy Project 1 (2) - 공정위 사이트 크롤링하기 (0) | 2021.05.25 |