Skip to content

Latest commit

 

History

History
488 lines (373 loc) · 48 KB

benchmarks.md

File metadata and controls

488 lines (373 loc) · 48 KB

벤치마크 상세

README 검증 결과의 채점 기준·재현 방법·옵션별 수치입니다. 내부 코퍼스는 npm run bench:gate로 검증하고 배포 시 필수 게이트를 통과합니다. 외부 opendataloader-bench는 별도로 측정합니다.

4.24.6 OCR·PDF·렌더·HWPX 81~90라운드 · 2026-10-25

4.24.5 와 같은 코퍼스·채점기로 다시 쟀다(전 벤치 suite 문서별 대조, 렌더는 글·그림·쪽 수 측정). 렌더 글 조각 모수가 90,762 → 90,906 으로 는 것은 쪽 번호 새로 시작을 따르자 우리 쪽 번호가 한컴 PDF 쪽 번호와 짝을 이룬 몫이다. 89라운드(HWPX 들여쓰기 공백)는 PDF 글 정답 쪽 HWPX 파싱을 바꿨다 — 그 문서(issue2019 별지 서식) 정답 글이 6,960 → 9,219자로 늘어 재현율·띄어쓰기는 오르고 순서는 0.904 → 0.871 로 내렸다(PDF 출력은 그대로).

지표 4.24.5 4.24.6
PDF 글 재현율 · 정확도 · 순서 · 어절 F1 (744쌍) 0.99880 · 0.99676 · 0.99302 · 0.99055 0.99881 · 0.99676 · 0.99307 · 0.99064
PDF 표 구조 일치 · 칸 F1 · 내용 NED (2,331표) 0.98198 · 0.99187 · 0.98767 같음
별표 PDF 표 · 칸 F1 · 수식 342/346 · 0.99778 · 11/11 같음
HWPX 칸 일치 · 내용 NED (2,424문서) 1 · 1 같음
OCR CER (fair · strict) 0.04085 · 0.07996 0.03321 · 0.06461
OCR 표 매칭 · 구조 일치 · 칸 F1 (67표) 52 · 24 · 0.5538 52 · 25 · 0.5663
OCR 열화 입력 CER (clean · skew+3 · blur · scan) 0.0554 · 0.0685 · 0.0745 · 0.0831 0.0514 · 0.0638 · 0.0665 · 0.0766
OCR 열화 입력 표 칸 F1 (clean · scan) 0.5774 · 0.4382 0.5892 · 0.4464
렌더 글 위치 · 그림 위치 · 쪽 수 87,509/90,762 · 4,019/4,107 · 1,154/1,159 87,620/90,906 · 4,019 · 1,154
ODL 200문서 (기본 · best · ocr) 0.96370 · 0.97512 · 0.96524 같음
라운드 고친 것 변화
81 PDF: 쪽 바깥 12% 띠의 넉 자 세로 색인 탭("정⏎책⏎연⏎구") PDF 글 순서 +0.00005(편람 가짜 표 2개)
82 OCR: 칸마다 흰 틈으로 갈린 색 머리 띠의 윗변 조각 잇기·띠 안 구분선을 띠 윗변에 OCR 표 exact 24 → 25
83 OCR·PDF: 사업명세서 목·산출 내역 줄의 무괘선 하위 행 OCR CER 0.04085 → 0.03416, 열화 입력 9종 모두 하락
86 렌더: 쪽 번호 새로 시작(hp:newNum) 렌더 글 위치 +111(12문서)
88 OCR: 가로로 겹치는 OCR 상자는 같은 줄·첨자가 아니다 OCR CER 0.03416 → 0.03321
89 HWPX: 들여 써 저장한 XML 의 run 사이 공백은 글이 아니다 정답 쪽 몫 — 위 설명

해 보고 넣지 않은 것: OCR 단위 줄을 표 행으로 올리지 않기(정답 2줄 머리와 행 번호가 우연히 맞던 표 칸 F1 하락), OCR 줄 아래끝 맞춤 이동 상한·세로 괘선 너머 맞춤 금지(전체 CER 은 비슷하거나 낫지만 문서 하락 다수), 쪽 머리 표를 건너뛴 쪽 넘김 문단 잇기(대상 문서 점수 그대로·다른 문서 하락).

4.24.5 PDF·OCR·파서 71~79라운드 · 2026-10-25

4.24.4 와 같은 코퍼스로 다시 쟀다(전 벤치 suite 문서별 대조). 렌더·조판 코드는 바꾸지 않아 렌더 글 87,509/90,762·그림 4,019/4,107·쪽 수 1,154/1,159·조판 그대로다. 채점 기준 변경(71라운드): HWPX 정답 유닛도 표 아래 캡션을 표 칸 뒤에 둔다 — PDF 출력과 무관하게 PDF 글 순서 정답이 바뀐 몫(+0.0001, 7문서↑·에볼라 보도참고자료 1→0.990 등)이 아래 순서 상승에 섞여 있다.

지표 4.24.4 4.24.5
PDF 글 재현율 · 정확도 · 순서 · 어절 F1 (744쌍) 0.99879 · 0.99670 · 0.99247 · 0.99049 0.99880 · 0.99676 · 0.99302 · 0.99055
PDF 표 구조 일치 · 칸 F1 · 내용 NED (2,331표) 0.98198 · 0.99222 · 0.98760 0.98198 · 0.99187 · 0.98767
별표 PDF 수식 · 가짜 글 7/11 · 0.00045 11/11 · 0.00031
HWPX 칸 일치 · 내용 NED (2,424문서) 0.99998 · 0.99996 1 · 1
OCR 표 매칭 · 구조 일치 · 칸 F1 (67표) 51 · 21 · 0.5432 52 · 24 · 0.5538
OCR CER (fair · strict) 0.04085 · 0.08296 0.04085 · 0.07996
OCR 열화 입력 표 칸 F1 (clean) · CER (blur·jpeg50) 0.5563 · 0.0751·0.0588 0.5774 · 0.0745·0.0581
ODL 200문서 (기본 · best · ocr) 0.96367 · 0.97512 · 0.96521 0.96370 · 0.97512 · 0.96524

PDF 표 칸 F1·매칭 −1표는 rhwp 가 cairo 로 찍은 75544 한 문서(한컴 PDF 아님)에서 쓰레기 머리 행이 달린 3×3 가짜 매칭이 빠진 몫이고, 내용 NED 한 문서 하락(규제영향분석 중첩표)은 74라운드 정답 쪽 HWPX 파싱 변경 몫이다.

라운드 고친 것 변화
71 HWPX·HWP: 표 아래 캡션을 표 뒤에(채점 기준 변경 포함) HWPX 점수 2문서↑
72 PDF: 선으로 그은 분수 막대·수식 글꼴 막대의 본문 글꼴 분자·분모를 $\frac{}{}$ 로 별표 수식 7 → 11/11
73 PDF·OCR: 한 행 끊긴 세로선 잇기는 끊긴 열 사이 칸마다 글이 있을 때만 OCR 표 exact 21 → 22
74 보이지 않는 틀을 풀고 남은 표 띠에 캡션 HWPX 칸 일치·내용 NED 100%
75 PDF: 고정폭 낱말 줄은 무괘선 표 행이 아니다 + 괘선 글리프 단 바닥글 걷기 + 한쪽만 선 표는 쪽 넘김 병합 안 함 PDF 글 순서 +0.00047
76 PDF: 덧찍은 숫자(넘친 목차 쪽 번호 "175")는 스트림 순서 시험지 정밀도 0.964 → 0.971
77 OCR·PDF: 가로선 없이 쌓은 하위 행(열 셋+ 같은 줄 수 셋+)을 줄마다 행으로 OCR 표 칸 F1 +0.0024
78 OCR: 글에 밑줄 표지 <u> 를 달지 않는다(평문 규약) ODL +0.00003
79 OCR: 색 머리 띠 안 흐린 흰 구분선을 칸 경계로 OCR 표 exact 22 → 24

해 보고 넣지 않은 것: 아래 정렬 문단 기준선을 글꼴 descent 로(맑은 고딕은 이미 1.5pt 안이라 효과 0), PDF 가짜 행 경계 합치기(1행 상자 표는 채점 모수 밖이라 효과 0·편람 표 −1), 덧찍기 무리 조건을 1pt 이웃까지(아래첨자 HL₂ 가 뒤집혀 각주 문서 하락), 띠 구분선 두께 2블록(기울인 입력 skew+3 에서 표가 더 붙어 CER 0.080 → 0.107).

4.24.4 렌더·PDF 10라운드 · 2026-10-24

4.24.3 과 같은 코퍼스·채점기로 다시 쟀다. 61~68·70라운드는 렌더만, 69라운드는 PDF 칸 변 판정만 바꿨다. 측정 기준 변경: 렌더 글 위치 측정이 우리 글 조각 앞 전각 빈칸(U+2005 — PDF 는 그 자리에 글리프를 찍지 않는다)만큼 조각 시작을 옮겨 잰다. 같은 코드에서 87,360/90,696 → 87,434/90,762 로 바뀌는 측정 쪽 보정이고, 아래 4.24.3 값은 새 기준으로 다시 잰 것이다(종전 기준 87,215/90,692). 렌더 글 조각이 내린 문서는 2025 행정업무운영 편람 하나(−3, 2024 저장·2022 인쇄로 판이 달라 줄 나눔이 다른 짝)이고, 쪽 수가 새로 어긋난 문서는 0이다. 69라운드는 PDF 글·표·별표를 4.24.3 suite 와 문서별로 대조해 하락 0. 규칙 근거는 PDF 를 만든 판이 저장한 판과 같은 짝만 썼다(70라운드 짝은 PDF 에 판 표시가 없지만 그 문서 글 조각 24개가 모두 1.5pt 안).

지표 4.24.3 4.24.4
렌더 글 조각 1.5pt 안 (한컴 PDF 짝, 새 기준) 87,289/90,758 87,509/90,762
렌더 그림 2pt 안 · 쪽 수가 같은 짝 문서 4,017/4,107 · 1,154/1,159 4,019/4,107 · 1,154/1,159
조판 두 줄+ 전부 일치 (12개 폴더 저장본) 24,941/25,187 같음
PDF 표 구조 일치 · 칸 F1 (708쌍 · 2,331표) 0.98155 · 0.99179 0.98198 · 0.99222
PDF 글, 별표, ODL 200문서, OCR — 같음
라운드 고친 것 변화
61 공백 최소값 문단의 넘친 줄을 늘이지 않는 줄도 빈칸을 줄여 줄 폭에 맞춘다(68라운드 규칙으로 바뀜) 글 +104
62 칸 안 나눔 표의 쪽 바닥 행은 행 바닥 + 표 바깥 아래 여백으로 판정 글 +12
63 마지막 행을 표 높이에 맞출 때 마지막 행까지 내려오는 여러 행 칸도 내용이 들면 줄인다 글 +2
64 칸 안 떠 있는 개체가 키우는 칸 높이에 바깥 아래 여백 글 +29
65 KoPub 글꼴 항목에 대체 글꼴이 적힌 문서는 앞 구역 저장 줄 나눔이 대체 글꼴 폭에 뚜렷이 맞으면 그 폭으로 그린다 글 +10
66 컨트롤(누름틀·개체 앵커)로 시작하는 양쪽 정렬 줄은 그 뒤 빈칸도 늘인다 글 +16
67 넘친 양쪽 정렬 줄 — 빈칸은 제 폭의 20% 까지만 줄이고 나머지는 빈칸 아닌 글자마다 똑같이 글 +26
68 67라운드 규칙을 정렬·공백 최소값과 상관없이 모든 넘친 줄에 글 +23
69 PDF: 한 가닥 실선이 칸 변 한끝을 2pt 넘게 비우면 그 칸 변이 아니라 옆 칸 변 PDF 표 exact +0.00043
70 다음 쪽 첫 줄로 넘어간 앵커 줄의 위아래 개체는 앞 쪽, 그 줄이 이어졌을 자리(앞 줄 끝 + 줄 간격) 그림 +2

61~64라운드 수치는 종전 측정 기준, 65라운드부터 새 기준으로 잰 값이다.

해 보고 넣지 않은 것: 늘이는 줄의 줄 앞 빈칸도 늘이기(−977), KoPub 문서를 모두 대체 글꼴 폭으로 그리기(+585 지만 PDF 를 찍은 PC 의 글꼴 환경이라 저장본으로 가릴 수 없다), PDF 칸 변 빈 길이 기준 3 → 1.6pt(편람 표 exact 95 → 80 — 겹선·굵은 선은 모서리에서 1.1~1.9pt 들여 긋는다), 쪽 번호만 든 바닥글 표를 쪽 넘김 표 이음에서 건너뛰기(이어져야 할 표 하나는 이어지지만 따로 놓인 두 표가 붙어 −1), PDF 문단 줄의 문자열 균등배분 정리 끄기(어절 F1 +0.0001 이지만 6문서 하락).

4.24.3 렌더·PDF 10라운드 · 2026-10-24

4.24.2 와 같은 코퍼스·채점기로 다시 쟀다. 51~58·60라운드는 렌더만, 59라운드는 PDF 표 쪽 이음만 바꿨다. 라운드마다 렌더 글 조각이 내린 문서는 0이고(짝 문서 전체 목록 대조), 쪽 수가 새로 어긋난 문서도 0이다. 59라운드는 PDF 글·표·별표·ODL(기본·best·ocr)을 4.24.2 suite 와 문서별로 대조해 하락 0. 규칙 근거는 PDF 를 만든 판이 저장한 판과 같은 짝만 썼다. 51라운드부터 짝·홀 바탕쪽을 물려받아 그리면서 비교할 글·그림이 늘어 분모가 커졌다.

지표 4.24.2 4.24.3
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 86,954/90,550 87,215/90,692
렌더 그림 2pt 안 · 쪽 수가 같은 짝 문서 3,881/3,976 · 1,154/1,159 4,017/4,107 · 1,154/1,159
조판 두 줄+ 전부 일치 (12개 폴더 저장본) 24,941/25,187 같음
별표 PDF 글 재현율 0.99976 0.99982
PDF 글·표, ODL 200문서 — 같음
라운드 고친 것 변화
51 짝·홀 쪽 바탕쪽 하나만 정의한 구역은 나머지를 앞 구역에서 물려받는다 글 +128 · 그림 +131
52 표 단위 나눔(pageBreak TABLE) 표는 여러 행 칸이 묶은 행들을 한 쪽에 글 +60
53 겹친 중첩 표의 이어진 쪽 시작 자리는 바깥 겹부터 누적 글 +36
54 묶음 안 개체 변환 행렬의 크기·회전 짝은 크기를 먼저 걸고 돌린다 그림 +2
55 "첫 줄 뒤 줄 앵커 = 그 줄 + 오프셋" 은 문단 끝 앵커에만, 첫 줄부터 좁게 저장된 문단의 중간 앵커는 문단 위 기준 그림 +1
56 칸 안 문단의 글 뒤·앞·어울림 개체 원점은 위 간격 앞 그림 +1
57 한컴이 쪽에서 갈라 저장한 여러 행 칸 — 다음 부분 행부터 다음 쪽, 칸 틀·글을 쪽마다 글 +29
58 엇갈린 병합 표의 빈 행은 위에서부터 그 행에서 끝나는 칸의 (저장 높이 − 앞 행 합) 글 +8
59 PDF: 쪽 경계가 열린 갈린 행의 이어짐을 되풀이 머리 행으로 지우지 않는다 별표 재현율 +0.00006
60 그림자 있는 인라인 사진은 그림자까지 든 줄 높이로 줄 맨 위 그림 +1

해 보고 넣지 않은 것: 행 합이 표 너비보다 짧은 행을 오른쪽에 맞추기(오른쪽 끝에서 거꾸로 전파한 경계 — 전면 −786, 10pt 안만 −589), 넘어간 쪽 마지막 행을 본문 바닥까지 늘이기(한컴 89.3pt 는 자연 높이 79.7pt·바닥까지 101.6pt 어느 저장값과도 안 맞음), 머리 행 판정을 글 칸 둘 이상으로 좁히기(별표 +1 이지만 PDF 표 3문서 하락).

4.24.2 렌더 배치 10라운드 · 2026-10-24

4.24.1 과 같은 코퍼스·채점기로 다시 쟀다(4.22.15~4.24.1 은 렌더를 바꾸지 않아 기준은 4.22.14 와 같다). 열 라운드 모두 렌더만 바꿔 파서 출력과 조판 저장본 대조 지표는 그대로다. 라운드마다 렌더 글 조각이 내린 문서는 0이고(짝 문서 전체 목록 대조), 쪽 수가 새로 어긋난 문서도 0이다. 규칙 근거는 PDF 를 만든 판이 저장한 판과 같은 짝만 썼다.

지표 4.24.1 4.24.2
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 86,508/90,518 86,954/90,550
렌더 그림 2pt 안 · 쪽 수가 같은 짝 문서 3,872/3,976 · 1,154/1,159 3,881/3,976 · 1,154/1,159
조판 두 줄+ 전부 일치 (12개 폴더 저장본) 24,941/25,187 같음
라운드 고친 것 렌더 글 조각
41 새 쪽 첫 줄에 앵커한 위아래 표가 앞 쪽 끝에서 시작해 넘어온 것(앵커 줄 = 넘어온 행 + 바깥 여백)은 앞 쪽 끝에서 그린다 +43
42 쪽 바닥에서 시작하는 칸 안 나눔 표의 첫 행은 그 행에서 시작하는 병합 칸 글도 남은 자리에 들어야 남긴다 +15
43 문단 영역 위 = 앞 문단 끝 + 앞 문단 아래 간격 +43
44 첫 줄에 앵커한 위아래 개체도 세로 오프셋이 줄 높이 이상이면 줄 아래(줄 − 위 간격 + 오프셋) +33 (그림 +2)
45 개체에 밀린 줄 판정과 밀린 자리 역산에 세로 오프셋을 넣는다(종전 이중 계산) +241 (그림 +1)
46 칸 안 한 문단의 위아래 개체 여럿도 가로로 겹치는 것끼리 차례로 쌓고, 칸 높이에서 세로 오프셋을 두 번 세지 않는다 +12
47 칸 저장 높이 합이 표 높이(sz)보다 큰 본문 표는 마지막 행을 표 높이에 맞춘다(마지막 행 내용이 들 때) +18 (그림 +5)
48 강제 줄바꿈 앞 줄 끝 공백도 정렬·늘이기 폭에서 뺀다 +38
49 가운데 쪽 번호는 본문 영역 가운데 +3
50 첫 줄 뒤 줄에 앵커한 어울림 개체는 그 줄 위 + 세로 오프셋 0 (그림 +1)

해 보고 넣지 않은 것: TTF 휴먼명조 진하게 폭 +50(일부 한컴 PDF 는 1.047em 으로 찍지만 조판 두 줄+ 24,941 → 24,825·렌더 −83, 작성자 환경에 따라 갈림), 595×841 PDF 의 쪽 크기 비율 보정(짝 1,172개 중 1,075개가 595×841 인데 대부분 축척되지 않았다 — 전부 보정 −536).

4.22.14 칸 높이·줄 끝 자간·구역 첫 문단·사용자 기호 폭 5라운드 · 2026-10-19

4.22.13 과 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp r42213 r42214). 파서 출력(생성 포함)은 모든 벤치에서 문서별로 같다. 렌더 글 조각이 내린 문서는 38라운드의 3문서(원래 1.5pt 경계였던 조각 1개씩)뿐이고(짝 문서 전체 목록 대조), 쪽 수가 새로 어긋난 문서는 0이다. 조판은 40라운드에서 두 줄+ +1·줄 수 −1(한 줄 문단 하나가 줄 폭을 3 넘어 두 줄)이다.

지표 4.22.13 4.22.14
ODL 기본값 · plain+htmlTables · ocr: true · ocr: false (200문서) 0.96367 · 0.97512 · 0.96521 · 0.93903 같음
조판 본문 · 칸 첫 줄 위치 · 두 줄+ (12개 폴더 저장본) 76,729/78,376 · 205,015/205,307 · 24,940/25,187 76,729 · 205,015 · 24,941/25,187
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 86,051/90,433 86,508/90,518
렌더 그림 2pt 안 · 쪽 수 3,872/3,976 · 1,421/1,431 3,872/3,976 · 1,423/1,431
라운드 고친 것 렌더 글 조각
36 칸 높이 — 줄 위에 두면 칸 안 앞 문단과 겹칠 위아래 배치 개체는 줄을 밀지 않은 것으로 보고 줄 자리에서 잰다 +29 (쪽 수 +1)
37 저장 표 높이(sz)가 안쪽 행 경계와 같은 표(한컴이 첫 쪽 조각만 적음)는 아래 여백 넘침 여유를 주지 않는다 0 (쪽 수 +1)
38 줄 끝 글자 뒤에는 자간이 없다 — 가운데·오른쪽 정렬 폭과 양쪽 정렬 늘임에서 마지막 글자 자간 몫을 뺀다 +298
39 구역 첫 문단의 줄 시작이 구역·단 정의 칸 안이면 그 칸을 더해 읽는다(앞면·뒷면 서식 표 둘이 2쪽에 나란히 찍히던 것) +91 (짝 +80)
40 한컴 보충 사용자 영역 기호 U+F0000F02FB·U+F035FF03F4 는 전각(글머리 가운데점 등) +39 (조판 두 줄+ +1·줄 수 −1)

4.22.13 쪽 넘김·칸 안 표 렌더 개선 5라운드 · 2026-10-18

4.22.12 와 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp r42212 r42213). 다섯 라운드 모두 렌더·조판 쪽만 바꿔 파서 출력(생성 포함)은 모든 벤치에서 문서별로 같고, 조판 저장본 대조 지표도 그대로다. 라운드마다 렌더 글 조각이 내린 문서는 0이고(짝 문서 전체 목록 대조), 쪽 수가 새로 어긋난 문서도 0이다.

지표 4.22.12 4.22.13
ODL 기본값 · plain+htmlTables · ocr: true · ocr: false (200문서) 0.96367 · 0.97512 · 0.96521 · 0.93903 같음
조판 본문 · 칸 첫 줄 위치 · 두 줄+ (12개 폴더 저장본) 76,729/78,376 · 205,015/205,307 · 24,940/25,187 같음
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 85,968/90,428 86,051/90,433
렌더 그림 2pt 안 · 쪽 수 3,869/3,976 · 1,413/1,431 3,872/3,976 · 1,421/1,431
라운드 고친 것 렌더 글 조각
31 꼬리말 영역이 0 인 구역의 아래쪽 쪽 번호 = 아래 여백 가운데 위(기준선 쪽 바닥 − 아래 여백/2 − 2.43pt) +48
32 칸 줄이 쪽에서 갈라 저장된 표는 아래 여백으로 넘쳐 한 쪽에 남기지 않는다 +11 (쪽 수 +4)
33 갈라 저장한 행의 첫 조각은 첫 줄도 남은 자리에 안 들면 다음 쪽에서 시작한다 0 (쪽 수 +2)
34 칸 안 빈 문단의 위아래 표도 제 표에 밀려 저장된 줄이면 줄 위(칸 안 앞 문단 끝)에 그린다 +24 (그림 +3)
35 갈라 저장되지 않은 칸에 앵커한 떠 있는 표가 쪽을 넘으면 칸과 표를 그 표가 끝나는 쪽까지 잇는다(칸 높이는 떠 있는 표 행 합까지) 0 (쪽 수 +2)

4.22.12 글상자·렌더 개선 5라운드 · 2026-10-18

4.22.11 과 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp r42211 r42212). 다섯 라운드 모두 렌더·조판 쪽만 바꿔 파서 출력(생성 포함)은 모든 벤치에서 문서별로 같고, 조판 저장본 대조 지표도 그대로다. 라운드마다 렌더 글 조각이 내린 문서는 0이다.

지표 4.22.11 4.22.12
ODL 기본값 · plain+htmlTables · ocr: true · ocr: false (200문서) 0.96367 · 0.97512 · 0.96521 · 0.93903 같음
조판 본문 · 칸 첫 줄 위치 · 두 줄+ (12개 폴더 저장본) 76,729/78,376 · 205,015/205,307 · 24,940/25,187 같음
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 85,837/90,418 85,968/90,428
렌더 그림 2pt 안 · 쪽 수 3,866/3,976 · 1,413/1,431 3,869/3,976 · 1,413/1,431
글상자 밖으로 나간 글줄 (글상자 든 HWPX 159건) 571 10
라운드 고친 것 렌더 글 조각
26 최상위 줄 캐시가 쪽 절대 좌표로 적힌 구역은 캐시를 버리고 다시 조판(본문이 왼 여백만큼 밀려 잘리던 것), 글 영역 폭 없는 글상자는 도형 폭으로 조판(글상자 글이 통째로 빠지던 것) 0 (그 서식 문서 쪽 수 85 → 68, 글상자 밖 글줄 571 → 13)
27 그리기도 옛한글 자모를 앞 글자에 합쳐 잰다 0 (글상자 밖 글줄 13 → 10)
28 본문 절반 아래 쪽 나누기 문단도 첫 줄이 제 위아래 개체에 밀린 자리면 새 쪽 +47
29 돌리지 않은 글상자는 지금 크기(curSz) — sz 가 curSz 와 다르게 저장된 글자처럼 취급한 돌리지 않은 글상자 186개 전부 줄 높이 ≈ curSz +70 (그림 +3)
30 칸 너비 합이 표 너비와 같은 행이 없는 표는 가장 긴 길 경계를 길 위 조건 없이 +14

4.22.11 렌더 개선 5라운드 · 2026-10-18

4.22.10 과 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp r42210 r42211). 다섯 라운드 모두 렌더만 바꿔 파서 출력과 조판은 모든 벤치에서 문서별로 같다. 라운드마다 렌더 글 조각이 내린 문서는 0이다.

지표 4.22.10 4.22.11
ODL 기본값 · plain+htmlTables · ocr: true · ocr: false (200문서) 0.96367 · 0.97512 · 0.96521 · 0.93903 같음
조판 본문 · 칸 첫 줄 위치 · 두 줄+ (12개 폴더 저장본) 76,729/78,376 · 205,015/205,307 · 24,940/25,187 같음
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 85,496/90,418 85,837/90,418
렌더 그림 2pt 안 · 쪽 수 3,866/3,976 · 1,413/1,431 같음
라운드 고친 것 렌더 글 조각
21 쪽에서 갈린 칸 안의 표는 이어진 쪽에서 그 칸 내용 위(바깥 표의 이어진 쪽 위 + 칸 위 여백)부터 +107
22 갈라 저장한 행의 마지막 조각은 그 조각 줄에 앵커한 위아래 배치 개체 바닥(+ 칸 여백)까지 +11
23 여러 행 칸 내용(+ 칸 여백)이 저장 높이보다 크면 내용 높이로 행을 푼다(표 저장 높이 상한은 같다) +169
24 갈린 가운데·아래 정렬 칸의 마지막 조각은 칸 저장 몫으로 남는 높이 안에서 맞춘다 +54
25 개체만큼 밀려 저장된 빈 문단 줄(줄 = 앞 문단 끝 + 개체)의 위아래 개체는 줄 위에 — 4.21.31 부터 보도자료 붙임 그림(607pt)이 쪽 아래로 밀려 잘리던 것 0 (코퍼스에 이 꼴 없음)

4.22.10 렌더 표 개선 5라운드 · 2026-10-18

4.22.9 와 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp r4229 r42210). 다섯 라운드 모두 렌더만 바꿔 파서 출력과 조판은 모든 벤치에서 문서별로 같다. 라운드마다 렌더 글 조각이 내린 문서는 0이다.

지표 4.22.9 4.22.10
ODL 기본값 · plain+htmlTables · ocr: true · ocr: false (200문서) 0.96367 · 0.97512 · 0.96521 · 0.93903 같음
조판 본문 · 칸 첫 줄 위치 · 두 줄+ (12개 폴더 저장본) 76,729/78,376 · 205,015/205,307 · 24,940/25,187 같음
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 84,468/90,405 85,496/90,418
렌더 그림 2pt 안 · 쪽 수 3,866/3,976 · 1,410/1,431 3,866/3,976 · 1,413/1,431
라운드 고친 것 렌더 글 조각
16 첫 줄(vertpos 0)만 앞 쪽에 남기고 가른 칸은 둘째 줄도 vertpos 0 — 같은 자리에서 다시 시작하면 쪽 나눔. 갈린 행 첫 쪽 조각은 칸 저장 높이와 이 쪽 내용 중 큰 것까지 +84 (쪽 수 +3)
17 여러 행 칸 저장 높이가 그 행들 합보다 크면 마지막 행이 자란다 — 끝 행이 위인 칸부터, 표 sz 높이를 넘기지 않게(이런 칸이 있는 표 105개 중 78개가 키운 합 = 표 sz) +180
18 쪽 바닥에서 첫 행을 못 놓는 흐르는 표는 표째 다음 쪽 +26
19 행마다 칸 너비 합이 다른 표는 칸을 이은 가장 긴 길이 표 너비에 닿으면 그 열 경계(같은 판 PDF 통계표 열 경계 9개가 0.1pt 안, 코퍼스 46표) +615
20 두 쪽에 갈린 가운데·아래 정렬 칸의 다음 쪽 조각 = 칸 저장 높이 − 첫 쪽 조각(조판과 같은 규칙) +123

4.22.9 조판·렌더 개선 5라운드 · 2026-10-18

4.22.8 과 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp r4228 r4229). 다섯 라운드 모두 조판·렌더만 바꿔 파서 출력은 모든 벤치에서 문서별로 같다.

지표 4.22.8 4.22.9
ODL 기본값 · plain+htmlTables · ocr: true · ocr: false (200문서) 0.96367 · 0.97512 · 0.96521 · 0.93903 같음
조판 본문 첫 줄 위치 (12개 폴더 저장본) 76,676/78,376 76,729/78,376
조판 표 칸 첫 줄 위치 205,007/205,307 205,015/205,307
조판 본문+개체 · 칸+개체 16,332 · 6,188 16,336 · 6,188
두 줄 이상 문단 줄 시작 전부 일치 · 줄 수 24,939/25,187 · 306,680 24,940/25,187 · 306,681
렌더 글 조각 1.5pt 안 (한컴 PDF 짝) 82,816/90,379 84,468/90,405
렌더 그림 2pt 안 · 쪽 수 3,858/3,976 · 1,410/1,431 3,866/3,976 · 1,410/1,431

조판은 굴림체·돋움체의 비ASCII 반각 359자(•·−·◦ 등)를 0.5em 으로 재고(청년세대 공론장 보도자료 본문 +6·칸 +4), 글머리표 예약 폭(useInstWidth="0")은 비ASCII 글자별 폭 대신 기본 칸 폭으로 잡는다(한컴은 돋움체 글머리표 "−" 를 0.5em 으로 찍어도 1em 을 예약한다). 렌더는 쪽에서 갈라 저장한 가운데·아래 칸을 첫 쪽 조각만 맞추고(같은 판이 저장·인쇄한 서식 3개·칸 하나 40쪽 문서), 행 단위 표의 쪽 넘김에 표 바깥 아래 여백을 넣고(퇴직공직자 취업심사 명단 +185, 마약류 대책 보도자료 5건 각 +12), 탭 앞 위치에 글자처럼 취급하는 개체 폭을 넣는다(상표법 시행규칙 국제출원서 나라 목록 +99). 렌더 글 조각이 내린 2문서(156782376·pr-1674, 각 26개)는 2020 에서 저장해 2024·2022 로 인쇄한 PDF 라 판이 바뀌며 다시 조판된 몫이다 — 규칙 근거로는 PDF 를 만든 판이 저장한 판과 같은 짝만 쓴다.

4.22.8 ODL·조판 개선 5라운드 · 2026-10-18

4.22.7 과 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp u3 r4228). 문서별 하락은 score 의 PDF 글 커버리지 1문서(아래)뿐이다.

지표 4.22.7 4.22.8
ODL 기본값 종합 · 읽기 순서 · 제목 (200문서) 0.96305 · 0.96340 · 0.94860 0.96367 · 0.96429 · 0.94866
ODL plain+htmlTables · ocr: true · ocr: false 0.97452 · 0.96459 · 0.93878 0.97512 · 0.96521 · 0.93903
조판 본문 첫 줄 위치 (12개 폴더 저장본) 76,631/78,375 76,676/78,376
조판 표 칸 첫 줄 위치 205,005/205,305 205,007/205,307
조판 본문+개체 · 칸+개체 16,329 · 6,188 16,332 · 6,188
두 줄 이상 문단 줄 시작 전부 일치 · 줄 수 24,938/25,187 · 306,678 24,939/25,187 · 306,680

ODL 은 읽기 순서에서 오른다 — 쪽에서 표 아래에 놓인 캡션을 표 뒤에 내고(064·110·132), 전폭 줄이 대부분인 한 단 쪽에서 낱말 조각만으로 잡히던 가짜 2단 거터를 기각하고(003), 그림 영역 OCR 표의 행 절반 이상이 전폭 한 칸이면 문단으로 낸다(098 격자 도로 지도). 조판은 칸 높이를 고정한 표(noAdjust)의 쪽 나눔 몫(issue1853 +19), 기호 글꼴 사적 영역 글자의 Wingdings 진행폭(식약처 보도자료 각주 줄 +14), 표만 든 문단 끝 줄의 높이(행복청 보도자료 +12)에서 올랐다. score 의 PDF 글 커버리지는 고흥군 계획서가 0.99902 → 0.99901(375,891자 중 4자) — 2단으로 오판되던 413쪽을 한 단으로 바로 읽으며 띄워 찍은 작은 금액 주석 줄이 그 줄 앞에 따로 선다. 재고 넣지 않은 것: pdfjs 공백 아이템 틈의 정수 반올림 허용(한국 PDF 어절 F1 0.99049 → 0.98848, 98문서 하락), 자동 OCR 을 작은 그림·머리 로고까지 넓히기(ODL 기본값 +0.00155 이지만 한국 PDF 120문서 처리 시간 221초 → 364초, 그 범위는 ocr: true 가 읽는다).

4.22.7 ODL·조판 개선 5라운드 · 2026-10-18

4.22.6 과 같은 채점기·코퍼스로 다시 쟀다(node bench/suite.mjs cmp r4226 u3 — 2·4·5라운드는 조판 코드만 바꿔 파서 출력이 3라운드 판과 같다). 문서별 하락은 모든 벤치에서 0이다.

지표 4.22.6 4.22.7
ODL 기본값 종합 · 읽기 순서 · 제목 (200문서) 0.96291 · 0.96316 · 0.94829 0.96305 · 0.96340 · 0.94860
ODL plain+htmlTables · ocr: true · ocr: false 0.97438 · 0.96445 · 0.93865 0.97452 · 0.96459 · 0.93878
조판 본문 첫 줄 위치 (12개 폴더 저장본) 76,525/78,375 76,631/78,375
조판 표 칸 첫 줄 위치 204,958/205,304 205,005/205,305
조판 본문+개체 · 칸+개체 16,320 · 6,185 16,329 · 6,188
두 줄 이상 문단 줄 시작 전부 일치 · 줄 수 24,938/25,187 · 306,677 24,938/25,187 · 306,678

ODL 은 마크다운 이스케이프 정리로 오른다 — 단어 안 밑줄(7문서)과 양옆이 공백인 빈칸 선(1문서)은 CommonMark 에서 강조가 되지 않는 자리라 렌더 결과가 같다. 표 칸 안 *·~ 를 하나뿐일 때 풀면 ODL 은 +0.00014 오르지만, 채점 정규화(와 줄 단위로 읽는 소비자)가 <br> 뒤 * 를 목록 기호로 걷어 PDF 글 7·기타 포맷 12문서가 내려 넣지 않았다. 조판은 쪽에서 갈리는 표의 위·아래 캡션(정책연구용역 중간진도보고서 +77), 한글 2024 초기 빌드(3622 미만) 글머리표 문단의 공백 압축(해수부 여객선 리튬배터리 보도자료 +14), 쪽에서 갈리는 떠 있는 표를 문단 위 여백 앞에서 가르기(본문 +15·칸 +46)에서 올랐다.

4.22.6 조판·PDF 개선 · 2026-10-18

4.22.5(6f49170)와 이번 판(cd98760)을 같은 코퍼스·같은 채점기로 다시 쟀다. 채점 기준이 바뀌어(CHANGELOG 4.22.6 "채점 기준 변경") 4.22.5 체크아웃에 이번 채점기를 넣고 node bench/suite.mjs run b4225 --root=<4.22.5 체크아웃>·run r4226 을 돌려 cmp b4225 r4226 으로 문서별 비교했다.

지표 4.22.5 4.22.6
HWPX 글 재현율 (정답 5,740,269자) 0.999973 1
HWPX 칸 내용 완전 일치 0.999606 0.999983
PDF 글 재현율 · 띄어쓰기 F1 0.99872 · 0.99037 0.99879 · 0.99049
PDF 표 칸 내용 완전 일치 · 내용 NED 0.990677 · 0.987301 0.991321 · 0.987425
조판 본문 첫 줄 위치 (12개 폴더 저장본) 76,443/78,375 76,525/78,375
조판 표 칸 첫 줄 위치 204,869/205,304 204,958/205,304
조판 두 줄 이상 문단 줄 시작 전부 일치 24,938/25,187 24,938/25,187
렌더 쪽 수 = 한컴 PDF 1,154/1,159 1,154/1,159
OCR CER (53문서 · 102쪽) 0.04114 0.04085
ODL 기본값 (200문서) 0.963 0.963

문서별 비교: PDF 표 730행·별표 544행·왕복·기타 포맷 146개·ODL 네 모드 200문서는 하락 0이다. score 는 32문서 상승·6문서 하락이고, 하락 6은 모두 PDF 커버리지다(최대 0.0047 — 파서가 HWPX·HWP 와 같은 원 숫자로 합친 번호를 커버리지 합의는 텍스트층의 떨어진 도형·숫자로 센다, CHANGELOG "남은 차이"). PDF 글은 4문서가 내렸다 — rowbreak-problem-pages 순서(되살린 번호로 온전히 맞게 된 표 행 하나가 순서 모수에 새로 들었다), k-water RFP 띄어쓰기(반전 사각형 번호는 텍스트층에 숫자가 없다), hwp3-sample11·SO-SUEOP 정밀도(0.0001 안팎). 조판은 표 칸 1문서가 내렸다(식약처 전통시장 의약품 기획합동감시 보도자료 29행 표의 칸 문단 1개 — 이 표는 앞 행 위치부터 한컴과 어긋나 있다). OCR 은 eval-rda-2022 의 글자 재현율이 0.9802 → 0.9753 으로 내렸다 — 텍스트층 정답에 되살린 기호 14자가 새로 들어간 탓이고, 오류 거리는 54 → 41(CER 0.0714 → 0.0532)로 줄었다.

조판 수치는 node --import tsx bench/layout/reflow-cmp.mts 에 bench/corpus/ 의 seoul·seoul2·seoul-old·review·korea-kr-pairs·korea-kr-pairs2·licbyl·licbyl2·rhwp·gate-fill·gate-fill3·korea-kr 12개 폴더를 넘겨 잰다. README 재조판 행도 이번 판부터 이 모수(두 줄 이상 25,187문단)로 적는다 — 4.22.5 까지 적힌 25,581문단 모수는 폴더 구성이 기록되지 않아 다시 잴 수 없었다. README 검증 표의 HWPX·HWP 쌍·PDF 전체 모수도 게이트 모수(hwpx 2,424·pdf 1,911·hwp쌍 1,130, 코퍼스)로 적는다. 4.22.5 표에는 HWPX 2,429·HWP 쌍 1,131·PDF 2,070 모수가 적혀 있었다.

4.22.5 조판·PDF 교차 개선 10라운드 · 2026-10-17

4.22.4 대비 조판 줄 시작 일치 25,326→25,332/25,581문단(99.0266%), PDF 표 셀 내용 완전 일치 0.990311→0.990677, 글 재현율 0.99865→0.99872, 읽기 순서 0.99242→0.99244로 개선했다. 표 구조 2,288/2,331과 법령 별표 구조 342/346은 유지하며 별표 셀 F1은 0.99739→0.99778이다. 기준선·점유 높이 복원은 줄 시작 점수와 분리한다. 정답·평가기·정규화·모수는 그대로다. 앞선 5라운드 · 추가 5라운드·교차 효과·참고 저장소

4.22.4 조판·PDF 교차 개선 10라운드 · 2026-10-16

4.22.3 기준으로 조판 줄 경계 일치 25,323→25,326/25,581문단, PDF 표 셀 내용 완전 일치 0.989994→0.990311, 글 재현율 0.99858→0.99865로 개선했다. PDF 표 구조 2,288/2,331과 별표 구조 342/346은 유지하며, 별표 셀 F1은 0.99697→0.99739다. 그림 위치와 줄 기준선의 좌표 복원은 줄 경계 점수에 합산하지 않는다. 정답·평가기·모수는 변경하지 않았다. 앞선 5라운드 · 최종 5라운드·교차 검증·남은 오류

4.22.3 두 번째 조판·PDF 교차 개선 5라운드 · 2026-10-16

4.22.2를 기준으로 조판 줄 나눔 일치는 25,321→25,323/25,581문단, PDF 표 구조 완전 일치는 2,287→2,288/2,331표다. 넘친 인라인 표의 첫 줄 점유 높이도 100→4477HU로 복원했고 실제 줄 전진 80HU는 유지했다. 정답·평가기·모수는 그대로다. 문단·문서별 비교와 외부 ODL 200문서×4모드 유지 결과는 상세 보고서에 기록했다.

4.22.2 조판·PDF 교차 개선 5라운드 · 2026-10-16

PR158 반영 후를 기준으로 조판과 PDF를 번갈아 수정했다. 조판 줄 나눔 일치는 25,312→25,321/25,581문단(98.9484%→98.9836%), PDF 표 구조 완전 일치는 2,285→2,287/2,331표(98.0266%→98.1124%)다. 정답·평가기·모수를 그대로 유지했다.

부분 편집 위치 오차 48pt→0은 별도 재현 결과이며, 전체 재조판 점수에 합산하지 않았다. PDF 표의 개선은 같은 PDF 글 읽기 순서도 0.99238→0.99239로 높였다. 조판↔PDF 트랙의 교차 효과와 라운드별 회귀 확인은 상세 보고서에 기록한다.

앞선 PDF 개선 비교 (PR158, 4.22.2에 포함) · 2026-10-16

연락처의 병합 역할 칸과 통계표의 중복 음영 격자를 수정했다. 정답·평가기·모수는 그대로다. 수정 근거 · 기계 판독용 비교

지표 4.22.1 개발판
PDF 표 셀 내용 완전 일치 (2,331표) 0.987963 0.988200
PDF 표 내용 NED 유사도 0.984361 0.984727
PDF 표 셀 F1 0.991267 0.991406
PDF 글 읽기 순서 (744쌍) 0.99232 0.99238

일반 표 구조 일치 0.980266, 중첩표 101/101의 모든 지표 1, PDF 별표 342/346은 유지됐다. 글 744·표 730·별표 544개 채점행의 점수 하락은 0이다. 테스트 3,958통과·9스킵, 타입검사·빌드 통과.

외부 ODL 200문서×4모드도 문서별 점수가 모두 동일했다. node bench/suite.mjs run pdf-score-20261016-final --only=text,table,annex,odl,odlbest,odlocr,odlfast --jobs=2로 측정했다.

배포 검증 기록: 4.22.0 · 2026-10-16

4.22.0 게시 시 npm publish의 자동 게이트로 검증했습니다. 기계 판독용 결과와 PDF·조판 개선의 동일 코퍼스 비교를 함께 제공합니다. 이번 개선의 PDF 글·표·별표와 외부 ODL 4모드에서 문서별 점수 하락은 없었습니다. HWPX·HWP·전체 PDF 모수는 아래의 최신 배포 모수이며, 이전 배포보다 늘었습니다.

대상 규모 결과
HWPX 2,429문서 · 10,461표 표 구조 일치 10,461/10,461 · 100%, 셀 글 완전 일치 99.9983%, 내용 NED 유사도 99.9956%
HWP 5.x ↔ HWPX 1,131쌍 · 4,317표 짝 문서 표 구조 일치 4,317/4,317 · 100%
PDF 글 744쌍 재현율 99.86%, 정확도 99.67%, 읽기 순서 99.23%, 어절 F1 99.02%
PDF 표 708쌍 · 2,331표 탐지 99.83%, 구조 일치 98.03%, 칸 F1 0.991267
PDF 중첩표 (텍스트층) 29문서 · 101표 검출·구조·칸 F1·칸 내용 완전 일치·내용 NED 모두 100%
법령 별표 272건 · 346표 HWP 구조 일치 346/346, PDF 342/346 · 98.84%
PDF 전체 2,070문서 중 1,888건 채점 글 커버리지 99.80%
OCR 53문서 · 102쪽 CER 0.0412, 글자 재현율 99.02%, 정확도 99.33%, 한글 재현율 99.40%
기타 포맷 / 왕복 / fuzz 146문서(PPTX 27 포함) / 왕복 75건 / fuzz 26,000건 배포 게이트 통과

표 구조 점수는 화면 재현·모든 셀 내용의 완전 일치와 다릅니다. 왕복 75건과 생성 fixture 8건은 별도 집계합니다.

중첩표 100%는 위 텍스트층 표본에 한정하며, 텍스트층 없는 PDF·OCR 및 전체 조판을 포함하지 않습니다. PDF 전체 글 커버리지는 OCR 전용 114건과 약한 텍스트층 68건을 별도로 분류한 모수입니다. OCR은 216dpi 렌더와 같은 PDF의 텍스트층을 비교한 결과로 실스캔의 노이즈·기울기 정확도가 아닙니다. 테스트 3,940통과·9스킵, 타입검사·빌드·전체 자동 게이트를 통과했습니다.

PDF → Markdown — opendataloader-bench

opendataloader-bench 는 PDF 200문서(논문·보고서·슬라이드·포스터·스캔)을 사람이 만든 정답과 비교해 읽기 순서(NID)·표 구조(TEDS)·제목 위계(MHS) 를 잽니다(1.0 = 정답과 같음).

최신 별도 검증: 4.22.14 배포 후보 · 2026-10-19

설정 종합 읽기 순서 표 제목
기본값 0.964 0.964 0.980 0.949
기본값 + plain: true, htmlTables: true 0.975 0.980 0.983 0.959
ocr: true 0.965 0.965 0.980 0.954
ocr: false 0.939 0.940 0.937 0.934

각 모드 200문서, 예측 누락 0건입니다. node bench/suite.mjs run r42214 --only=odl,odlbest,odlocr,odlfast로 측정했고 4.22.13 대비 네 모드 모두 문서별로 같습니다(이번 배포는 렌더·조판만 바꿨습니다). 4.22.0 실측 결과 · 이전 버전 비교 이력

옵션 전체 측정 이력: 2026-09-29

설정 종합 읽기 순서 표 제목 쪽당 시간
기본값 (OCR 모델 캐시 있음) 0.960 0.961 0.979 0.945 0.52초
기본값 + plain: true 0.968 0.969 0.981 0.952 0.52초
기본값 + plain: true, htmlTables: true 0.972 0.976 0.983 0.955 0.52초
ocr: false (= 기본값, OCR 모델 없음) 0.937 0.938 0.936 0.933 0.04초
ocr: false, plain: true 0.946 0.948 0.937 0.940 0.04초
ocr: false, plain: true, htmlTables: true 0.949 0.954 0.940 0.943 0.04초
ocr: true 0.960 0.960 0.979 0.949 0.57초
ocr: true, plain: true 0.967 0.968 0.981 0.956 0.57초
ocr: true, plain: true, htmlTables: true 0.973 0.977 0.983 0.959 0.58초

쪽당 시간은 2026-09-29 Apple M4 24GB 에서 200문서를 한 프로세스로 순차 파싱한 값(채점 제외)입니다.

옵션 설명

  • 기본값의 OCR — OCR 모델이 이미 캐시에 있으면(kordoc models·앞선 ocr: true 로 받은 경우) 텍스트층 없는 쪽(스캔·곡선 글자) 과 글 없는 큰 그림(쪽 면적 5% 넘는) 속 글을 자동으로 읽습니다(200문서 중 72개). 모델이 없으면 다운로드하지 않고 NEEDS_OCR·SKIPPED_IMAGE 경고만 냅니다.
  • ocr: true — 작은 그림(쪽 면적 2% 넘는)과 쪽 머리 로고까지 읽습니다. ocr: false 는 자동 OCR 도 끕니다(가장 빠름).
  • plain: true — 그림 자리 표시·링크 URL·밑줄/굵게 표기를 빼 색인·RAG 용 글만 냅니다. 정답지에 이런 표기가 없어 점수도 오릅니다.
  • htmlTables: true — 모든 표를 들여쓴 HTML 로 냅니다.

재현

  • 다른 엔진 점수는 벤치 저장소의 공개 결과(Apple M4 32GB)입니다.
  • kordoc 은 같은 PDF·정답·수정하지 않은 원본 채점기로 쟀습니다(Apple M4 24GB, 200문서 한 프로세스 순차).
  • 벤치의 opendataloader-hybrid 예측을 같은 채점기로 다시 재면 0.9066 으로 공개 점수와 같습니다.
  • 실행: node bench/odl-bench.mjs <벤치 클론> → 벤치의 src/evaluator.py.

공개 엔진 비교 기록: 2026-09-29

기존 README의 비교 기록입니다. 현재 순위나 동일 하드웨어 성능 비교를 뜻하지 않으며, 최신 kordoc 검증은 위의 4.22.0 배포 후보 표를 보세요.

순위 엔진 종합 읽기 순서 표 제목 쪽당 시간
1 kordoc 기본값 0.960 0.961 0.979 0.945 0.52초
참고 kordoc ocr: false (가장 빠름) 0.937 0.938 0.936 0.933 0.04초
참고 kordoc ocr: true, plain: true, htmlTables: true 0.973 0.977 0.983 0.959 0.58초
2 opendataloader-hybrid 0.907 0.934 0.928 0.821 0.46초
3 nutrient (상용) 0.885 0.925 0.708 0.819 0.01초
4 docling 0.882 0.898 0.887 0.824 0.76초
5 marker 0.861 0.890 0.808 0.796 53.9초
6 unstructured-hires 0.841 0.904 0.588 0.749 3.01초
7 edgeparse 0.837 0.894 0.717 0.706 0.04초
8 mineru 0.831 0.857 0.873 0.743 5.96초
9 opendataloader 0.831 0.902 0.489 0.739 0.02초
10 pymupdf4llm 0.732 0.885 0.401 0.412 0.09초
11 unstructured 0.686 0.882 0.000 0.388 0.08초
12 markitdown 0.589 0.844 0.273 0.000 0.11초
13 liteparse 0.576 0.866 0.000 0.000 1.06초

LM-Kit One 비교 이력 (2026-09-29, 당시 미병합 PR #34)

벤치에 결과만 PR 로 올라온 상용 LM-Kit One 은 OCR 없이 0.948·OCR 0.963 입니다. 격차 대부분은 표 칸을 정답지와 같은 HTML 모양(<td> 글 </td>, 머리행도 <td>)으로 내는 차이입니다. 같은 서식으로 맞추면 kordoc plain 0.951·LM-Kit 0.948 이고, htmlTables 까지 켜면 kordoc 이 OCR 없이 0.949·OCR 0.973 으로 둘 다 앞섭니다.

한국 공문서 — 원본 HWPX 를 정답으로

HWPX 원본과 그 문서를 PDF 로 내보낸 파일이 짝으로 있는 실제 정부 문서(보도자료·결재문서·법령 서식·예산서 등)로, 원본을 정답 삼아 PDF 에서 뽑은 글과 표를 잽니다.

채점 기준

2026-09-29 정비, 2026-09-30 보이는 표 기준 도입, 4.18.1 참조 추출기 정정 이력은 CHANGELOG에 기록돼 있습니다. 참조 정정과 실제 입력란 보존 수정은 원본 감사에서 구분합니다.

표 정답 = 원본에서 보이는 표 (v4.17.0)

  • 칸 테두리(header.xml borderFill, 선 종류 NONE·흰 선은 안 보임)가 그리는 모습대로 나눕니다(bench/ref/visible-tables.mjs, 파서와 코드 공유 0%).
  • 세로선이 보이는 행과 온 폭 가로선 사이 칸 둘 이상인 행이 표 행, 이어진 표 행 묶음 하나가 보이는 표 하나. 나머지 행은 글(글 재현율에는 그대로).
  • 어느 칸 모서리도 안 쓰는 격자선·보이는 변 밖 빈 들여쓰기 칸·선 없는 빈 여백 행·후행 빈 열은 접습니다.
  • 칸 두 개와 가로선으로 조립한 분수는 수식(글 모수에서 빼고 수식 존재 모수에 1개). 표 온 폭 두 칸은 2×1 표일 때만.
  • 법령 별표 한컴 PDF 그림 대조(원본 그림 66쪽, 보이는 표 50개): 일치 42/50, 여백 행(A1)·분수 오탐(P1) 보정 뒤 48/50. 남은 2개는 이어쓰기 행·공식 상자 각 1건이라 규칙을 두지 않았습니다.

법령 별표 (bench/annex-gt.mjs)

  • 법제처 별표 272건(licbyl-byl·licbyl-byl2)의 HWP 원본과 한컴 PDF 를 같은 정답으로 잽니다. PDF 는 ocr: false(법령 MCP·lexdiff 서버와 같은 조건).

PDF 글

  • 읽기 순서: 같은 글이 여러 번 나오는 줄은 순서가 맞는 등장 자리로 봅니다.
  • 떠 있는 글상자, 글자·숫자 없는 줄(마스킹 "*****")은 순서 채점에서만 뺍니다.
  • 양쪽 평문에서 목록 표지 "- " 와 각주 감싸개 "(주: …)" 괄호를 걷습니다.

PDF 글·표 모수

  • 원본과 다른 판(PDF 글이 3배 초과)인 쌍은 뺍니다.
  • PDF 텍스트층(pdftotext)이 정답 글자의 93% 를 못 담은 쌍(렌더 결함 재현본 등)은 뺍니다.
  • PDF 커버리지는 리더 점 런을 지웁니다.

OCR

  • 표본 쪽을 고정합니다(bench/ocr-pages.json).
  • 텍스트층 글이 없는 그림 영역의 OCR 글은 글자 대조에서 뺍니다(본문 블록에 섞인 로고 글은 그림만 따로 읽어 설명되는 잉여만).
  • 그려지지 않은 텍스트층 글(흰 글·덮인 글)은 글자 대조에서 뺍니다.
  • 글줄 안 글자를 그림으로 찍은 쪽은 표본에서 뺍니다.
  • 픽셀로 못 가르는 글자는 접습니다 — 가운뎃점 · • ∙, 단위 ㎡ 와 m², 낫표 「」 「」.
  • 값 칸이 여러 줄로 나란히 쌓인 표 행은 줄 번호별로 펼칩니다.

HWP·HWPX → Markdown — HwpForge 비교

같은 코퍼스를 HwpForge 0.16.6(to_md, lossy)과 kordoc 으로 변환해 원본 HWPX XML 을 정답으로 같은 채점기에 넣었습니다. 표는 두 출력 모두 같은 Markdown 표 파서로 격자화하고 1열 표는 뺐습니다.

  • 표 점수 차이 — HwpForge 는 생성·편집 중심이고 Markdown 표가 파이프 표뿐이라 병합 칸을 못 나타냅니다.
  • 1열 표를 뺀 이유 — 1열 표(1,288개)는 제목·본문 상자 43%·빈 여백 틀 28%·목록형 3% 인 꾸밈 틀이라 표/줄 글은 표현 선택이고, 그 글은 글 재현율이 채점합니다. 1열 표를 넣으면 HWPX 10,392표 kordoc 90.6%·HwpForge 36.0%, HWP 3,500표 92.8%·32.1%.
  • HWP 문서 수 — 짝 HWPX 가 배포용 암호라 정답이 없는 1건을 뺀 값입니다.
  • 재현 — bench/hwpforge-bench.py → node bench/compare-md-parsers.mjs <출력 폴더>(1열 표 포함은 --include-single-col).

v4.16 시점 비교 기록 (종전 HWPX XML 구조 기준, 현재 보이는 표 기준과 별도)

kordoc HwpForge 0.16.6
HWPX 2,305문서 — 변환 실패 0 123
HWPX — 글 재현율 (변환 성공 문서만) 100.00% (100.00%) 59.23% (98.64%)
HWPX — 표 완전 일치 (9,123표) 100.0% (9,122) 32.2%
HWPX — 칸 F1 1.000 0.428
HWP 5.x 1,108문서 — 변환 실패 0 19
HWP — 글 재현율 100.00% 86.41%
HWP — 표 완전 일치 (3,111표) 100% 27.0%
HWP — 칸 F1 1.000 0.349