문서와 PDF에 주석 다는 법
계약서, 보고서, 논문을 평탄화된 텍스트가 아니라 문서 그대로 주석해 레이아웃과 쪽 번호, 쪽을 넘나드는 참조를 그대로 남긴다.
문서는 거기서 뽑아낸 텍스트가 아니라 렌더링된 쪽 위에서 주석한다. 레이아웃이 추출 과정에서 버려지는 의미를 담고 있고, 검토자가 그 라벨을 쪽에서 찾아야 하기 때문이다. 계약서를 하나의 문자열로 평탄화하면 쪽 번호, 단의 순서, 표의 구조, 각주와 본문의 구분이 사라진다.
문서 주석은 일반적인 텍스트 주석 구성이 통하지 않는 경우다. PDF는 문자의 나열이 아니라 쪽 위 표시들에 대한 기술이므로, 같은 파일에서도 추출기가 다르면 서로 다른 문자열이 나온다. 여러 단으로 된 쪽은 뒤섞이고, 머리말과 꼬리말은 본문 흐름 한가운데 끼어들며, 표는 공백의 연속이 된다. 그 문자열에 라벨을 다는 작업자는 추출기가 만들어낸 산물에 라벨을 다는 셈이고, 나중에 원본을 연 검토자는 어떤 스팬이 어느 대목을 가리켰는지 늘 알아낼 수는 없다.
위치, 쪽 번호, 참조 구조
문서의 세 가지 속성은 쪽 위에는 남지만 추출된 텍스트에는 남지 않는다. 위치는 어떤 조항이 제목인지 각주인지 본문인지 검토자에게 알려주는데, 추출은 셋을 구분 없는 같은 문자열로 뭉개버린다. 쪽 번호는 이후의 모든 독자가 그 대목을 인용할 때 쓰는 근거이며, 쪽이 존재하는 동안에만 존재한다. 참조 구조는 어떤 대목이 무엇을 가리키는지를 기록하며, 한 쪽의 주장이 아홉 쪽 뒤의 표에 기대고 있을 때마다 문제가 된다.
도구를 바꾸도록 가장 자주 몰아붙이는 것은 세 번째 속성이다. 문서 안의 참조 구조는 두 위치 사이의 관계인데, 문서를 하나의 평평한 문자열로 모델링하는 도구에는 두 번째 위치를 둘 자리가 없다. 법률 검토, 과학적 주장 검증, 재무 보고서 분석은 모두 그 관계에 달려 있다.
세 가지 앵커 방식
문서 위의 주석은 세 가지 중 한 방식으로 고정되며, 무엇을 고를지는 취향이 아니라 질문에서 따라온다.
- 텍스트 스팬은 선택한 단어에 고정되며 표현에 관한 질문에 맞는다. 스팬을 쓰려면 문서에 텍스트 레이어가 있어야 하는데, 디지털로 생성된 PDF에는 있고 스캔본에는 없다.
- 영역 상자는 쪽 좌표에 고정되며 그림, 표, 도장, 서명 등 텍스트 레이어가 한 번도 담아내지 못한 모든 것에 맞는다. 텍스트 추출이 전혀 없는 스캔본에서도 작동한다.
- 링크는 두 앵커를 잇고 참조 구조에 맞는다. 링크는 문서 안 두 지점 사이의 유형이 지정된, 필요하면 방향이 있는 관계를 기록한다.
한 과제 안에서 앵커 방식을 섞는 것은 흔한 일이다. 주장 검증 과제는 주장을 텍스트 스팬으로, 표를 영역 상자로 표시하고 링크로 둘을 잇는다.
Potato에서 설정하기
Potato의 pdf 디스플레이는 파일을 PDF.js로 렌더링하고 주석 표면을 렌더링된 쪽 위에 올린다. annotation_mode 옵션이 앵커 방식을 고르며 span, bounding_box, link를 받는다. 참조에 관한 질문에 답하는 것은 링크 모드이고, 앵커와 링크를 각각 다른 스키마 이름 아래 기록하므로 내보내기에서도 둘을 구분할 수 있다.
instance_display:
fields:
- key: pdf
type: pdf
label: "Document"
display_options:
annotation_mode: link
view_mode: scroll
zoom: page-width
enable_text_anchors: true
enable_region_anchors: true
anchor_schema: pdf_anchors
link_schema: pdf_links
anchor_labels:
- name: claim
color: "#dc2626"
- name: figure
color: "#2563eb"
link_types:
- name: refers_to
directed: true
allowed_source_labels: [claim]
allowed_target_labels: [figure]view_mode: scroll은 쪽들을 한 컨테이너에 쌓아 올리므로 2쪽과 9쪽 사이의 링크를 하나의 호로 그리고 그대로 볼 수 있다. 쪽 넘김 방식은 한 번에 한 쪽만 보여주어 긴 문서에서는 읽기 편하지만, 작업자가 쪽을 넘나드는 링크를 그리는 동안 반대쪽 끝을 가린다.
allowed_source_labels와 allowed_target_labels는 지침을 인터페이스가 강제하는 무언가로 바꿔준다. 위와 같이 설정하면 refers_to 링크는 주장에서만 시작해 그림에서만 끝날 수 있으므로 작업자가 관계를 거꾸로 기록할 수 없다. 문서 안에만 존재하는 지침은 지켜지는 정도가 들쭉날쭉하지만, 도구가 적용하는 제약은 강제하는 데 아무 비용이 들지 않는다.
Word나 Markdown 파일에는 대신 document 디스플레이를 쓴다. 제목과 문단 구조를 보존하고 span_target을 받으므로 스팬 스키마가 그것을 곧바로 가리킬 수 있다.
스캔 문서
스캔본에는 텍스트 레이어가 없어서 텍스트 앵커가 붙을 곳이 없다. 선택지는 둘이고 각각 맞는 말뭉치가 다르다. 영역으로 주석하는 방식은 텍스트가 전혀 필요 없고 바로 쓸 수 있다. OCR을 켜면 서버 쪽에서 텍스트 레이어가 만들어져 텍스트 앵커가 가능해지지만, 처리가 느리고 Tesseract 의존이 생긴다.
instance_display:
fields:
- key: pdf
type: pdf
display_options:
annotation_mode: link
ocr: autoauto는 내장 텍스트 레이어가 비어서 돌아올 때만 OCR을 돌리며, 디지털 생성 파일과 스캔본이 섞인 말뭉치에서 쓸 설정이다. Potato는 ocr 옵션을 링크 모드에서만 읽는다.
OCR 출력은 완전하지 않고, 잘못 인식된 단어에 고정된 주석은 그 오류를 그대로 물려받는다. 인식 품질이 나쁜 말뭉치에서는 영역 앵커가 텍스트 앵커보다 오래 가는 기록을 남긴다. 어떤 대목을 둘러싼 상자는 그 아래 문자가 무엇으로 읽혔든 그대로 맞기 때문이다.
라벨을 원본과 대조하기
모든 주석은 자신이 놓인 쪽을 함께 갖고 돌아오며, 그래서 라벨을 원본과 대조해 확인할 수 있다. 쪽 번호와 영역을 받은 검토자는 원본을 열어 판단을 확인할 수 있다. 이어 붙인 문자열의 문자 오프셋을 받은 검토자는 대개 그러지 못하는데, 그 오프셋을 재현하려면 그것을 만들어낸 추출기와 버전을 똑같이 재현해야 하기 때문이다.
이 방식이 얻는 것보다 더 많은 비용을 치르는 경우는, 참조 구조가 없고 한 단으로 된 짧은 디지털 생성 문서들로 이루어진 말뭉치다. 거기서는 추출이 믿을 만하고 쪽 번호가 담는 것이 없다. 추출된 텍스트에 대한 단순한 스팬 주석이 더 간단하고 같은 답을 준다.
더 읽을거리
- PDF 주석은
pdf디스플레이가 받는 모든 옵션을 설명한다. - 인스턴스 디스플레이는 디스플레이 종류와 그중 어떤 것이 스팬 타깃을 받는지 정리한다.
- 스팬 링킹은 텍스트 안 스팬들 사이의 유형이 지정된 관계를 다룬다.
- 주석 지침 작성은 제약이 걸린 링크 유형이 대신해 주는 지침을 다룬다.