README 검증 결과의 채점 기준·재현 방법·옵션별 수치입니다. 내부 코퍼스는 npm run bench:gate로 검증하고 배포 시 필수 게이트를 통과합니다. 외부 opendataloader-bench는 별도로 측정합니다.
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+F0000 |
+39 (조판 두 줄+ +1·줄 수 −1) |
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.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.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.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.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.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.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.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.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.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.2를 기준으로 조판 줄 나눔 일치는 25,321→25,323/25,581문단, PDF 표 구조 완전 일치는 2,287→2,288/2,331표다. 넘친 인라인 표의 첫 줄 점유 높이도 100→4477HU로 복원했고 실제 줄 전진 80HU는 유지했다. 정답·평가기·모수는 그대로다. 문단·문서별 비교와 외부 ODL 200문서×4모드 유지 결과는 상세 보고서에 기록했다.
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 트랙의 교차 효과와 라운드별 회귀 확인은 상세 보고서에 기록한다.
연락처의 병합 역할 칸과 통계표의 중복 음영 격자를 수정했다. 정답·평가기·모수는 그대로다. 수정 근거 · 기계 판독용 비교
| 지표 | 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 게시 시 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스킵, 타입검사·빌드·전체 자동 게이트를 통과했습니다.
opendataloader-bench 는 PDF 200문서(논문·보고서·슬라이드·포스터·스캔)을 사람이 만든 정답과 비교해 읽기 순서(NID)·표 구조(TEDS)·제목 위계(MHS) 를 잽니다(1.0 = 정답과 같음).
| 설정 | 종합 | 읽기 순서 | 표 | 제목 |
|---|---|---|---|---|
| 기본값 | 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 실측 결과 · 이전 버전 비교 이력
| 설정 | 종합 | 읽기 순서 | 표 | 제목 | 쪽당 시간 |
|---|---|---|---|---|---|
| 기본값 (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.
기존 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초 |
벤치에 결과만 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 원본과 그 문서를 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², 낫표 「」 「」.
- 값 칸이 여러 줄로 나란히 쌓인 표 행은 줄 번호별로 펼칩니다.
같은 코퍼스를 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).
| 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 |