작성: COZYGONO 개발·편집팀 · 수정:
PDF에서 표를 꺼내는 방법이 다섯 가지인 이유: 켜고 끌 수 있게 만든 파이프라인
원료 안전보건자료 PDF를 자동으로 읽어 들이는 작업에서, 하나의 완벽한 방법을 찾는 대신 여러 방법을 켜고 끌 수 있게 만들었습니다. 그렇게 한 이유를 적었습니다.
폰트 인코딩 깨짐(Mojibake) 여부 선별
선·공백 정렬된 3번 항목 성분표 파싱
KOSHA 1~16번 섹션 경계 정규화
스캔 이미지 PDF 광학 문자 복원
좌우 2단 문서의 문장 섞임 교정
MSDS 자동 작성 파이프라인 노트에서 설계 판단 부분만 옮깁니다.
1. 같은 규격, 다른 생김새
원료 안전보건자료는 16항목이라는 정해진 규격을 따릅니다. 그래서 처음에는 파싱이 단순할 것이라 생각했습니다. 실제로 받아 본 파일들은 이랬습니다.
- 텍스트가 온전히 들어 있는 PDF
- 문서 전체가 이미지 한 장인 스캔본
- 텍스트는 있는데 글자 코드가 깨져 추출하면 알 수 없는 문자가 나오는 파일
- 성분표가 표 선 없이 공백 정렬로만 되어 있는 파일
- 좌우 두 단으로 나뉘어, 순서대로 읽으면 문장이 섞이는 파일
한 가지 방법으로 전부 처리하려는 시도는 매번 어느 한 유형에서 무너졌습니다.
2. 하나로 합치지 않기로 하다
그래서 단계를 나누고, 각 단계를 켜고 끌 수 있게 만들었습니다.
- 글자 코드 깨짐 감지: 추출 결과가 쓸 수 있는 텍스트인지 먼저 판단
- 표 추출 계층: 표 구조가 살아 있는 PDF에서 성분표를 그대로 떠냄
- 항목별 구조화: 텍스트를 항목 단위로 잘라 각각 구조화
- 전체 페이지 광학 문자 인식: 스캔본을 이미지로 보고 읽음
- 다단 레이아웃 감지: 두 단으로 나뉜 지면의 읽기 순서를 바로잡음
처음에는 이 판단을 자동화하려 했습니다. 파일을 보고 알맞은 경로를 스스로 고르게 하는 편이 우아해 보였으니까요. 실제로는 검수하는 사람이 원인을 짚을 수 없게 만들었습니다. 결과가 이상할 때 어느 단계가 오작동했는지 알 수 없으면 고칠 수가 없습니다.
3. 값보다 근거를 먼저 저장하기
파이프라인에서 더 중요했던 결정은 따로 있었습니다. 추출한 값만 저장하지 않고, 그 값이 원문 어디에서 왔는지를 함께 남긴 것입니다.
원문 텍스트, 항목별 근거, 후보가 여럿일 때의 비교, 품질 경고를 별도 계층으로 두었습니다. 이렇게 하면 검수 화면에서 "이 인화점은 몇 페이지 어느 문장에서 왔다"를 바로 확인할 수 있습니다.
자동 추출의 정확도를 100%로 올리는 것은 불가능합니다. 대신 틀렸을 때 어디를 봐야 하는지 알 수 있으면, 사람이 고치는 비용이 크게 줄어듭니다.
4. 자동화의 목표를 옮기다
이 작업을 하며 목표가 조금 바뀌었습니다. 처음에는 "사람 없이 문서를 완성한다"였습니다. 지금은 "사람이 검토할 것을 정확히 줄여 준다"입니다.
안전보건자료는 틀리면 곤란한 문서입니다. 자동화가 할 수 있는 가장 큰 기여는 마지막 한 사람의 판단을 대체하는 것이 아니라, 그 사람이 확인해야 할 곳을 좁혀 주는 일이라고 보고 있습니다.
5. 추출 품질을 비교하는 표
방법을 비교할 때에는 같은 PDF와 같은 목표 항목을 사용합니다. 원본이 텍스트 PDF인지 스캔인지, 표가 페이지를 넘어가는지, 단위와 각주가 어디에 있는지를 기록한 뒤 추출된 성분명·함량·단위를 원문과 나란히 놓습니다. 빈 셀을 채운 개수만 세면 잘못 채운 값이 좋아 보일 수 있으므로 누락과 오인식을 구분합니다.
다음 검토자에게는 원문 페이지와 추출값의 연결을 남깁니다. 자동화의 결과가 그럴듯해 보이는가보다, 근거로 돌아가 빠르게 확인할 수 있는가가 중요합니다. 웹에 공개한 간이 계산기는 공개 DB 조회를 제공하며, 여기서 설명한 사내 PDF 파이프라인 전체가 그대로 제공되는 것은 아닙니다.