Skip to content

Latest commit

 

History

History
348 lines (260 loc) · 33.1 KB

benchmarks.md

File metadata and controls

348 lines (260 loc) · 33.1 KB

벤치마크 상세

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

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