본문 바로가기

프로젝트/Project1

Toy Project 1 (5) - HWP XML PARSING하기 1

이제부터는 지난 시간에 변환된 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: 수정 후 약관