[NOTICKET] eval(knowledge): run the pipeline on MinerU-parsed input — parser comparison
Browse filesFirst run of the extraction half on Rifqi's MinerU output. Same document, same
gold set, same pipeline code, so the only variable is the parse.
PyMuPDF (what the frozen baseline used) E1 0.8537 35/41
MinerU, raw markup E1 0.7561 31/41
MinerU, formulas + tables rendered to prose E1 0.8293 34/41
The span model reads prose, not markup. MinerU's structure helps the formula
branch and hurts the filter unless rendered first:
- Terms wrapped in LaTeX are invisible. "\text {Total Hours} - \text {Breakdown}"
produces no mentions for either, though both are gold terms found in the
plain-text parse. Unwrapping \text/\mathrm/\frac and collapsing MinerU's
character-spaced output recovers them (+7.3 points).
- Raw <table> HTML sat in 8 of 14 chunks before rendering.
The residual ~2.4 points are CHUNKING, not content: MinerU marks non-section
labels (Keterangan:, Keterangan grafik:) as text_level titles, so opening a
section at each splits a legend from the figure it explains. Other Activity and
Uncontrollable are then missed despite being present as prose in a chunk the
filter processed. Only NUMBERED headings should open a section — consistent with
MinerU flattening every heading to level 2, which makes numbering the only
reliable section signal.
Attribution caveat recorded in both the result file and the calibration doc: the
MinerU artifacts came from a scratch converter, since section-aware chunking is
the parsing half's job. These are requirements for that chunker, not a
measurement of MinerU.
No production code changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@@ -218,3 +218,40 @@ prefix clears the 1024-token floor at **1,401 tokens**. `rule` (731), `formula`
|
|
| 218 |
is also the branch with by far the most calls (66 of 83 on the reference
|
| 219 |
document), so the padding is on the branch that matters — but padding the other
|
| 220 |
three is free money if their call counts ever grow.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
is also the branch with by far the most calls (66 of 83 on the reference
|
| 219 |
document), so the padding is on the branch that matters — but padding the other
|
| 220 |
three is free money if their call counts ever grow.
|
| 221 |
+
|
| 222 |
+
---
|
| 223 |
+
|
| 224 |
+
## 10. Parser comparison — MinerU vs PyMuPDF (2026-08-19)
|
| 225 |
+
|
| 226 |
+
First run of the extraction half on **MinerU-parsed input**, same document, same
|
| 227 |
+
gold set, same pipeline code. Result:
|
| 228 |
+
`eval/knowledge/results/v2_parser_comparison_2026-08-19_152842.json`.
|
| 229 |
+
|
| 230 |
+
| Input | E1 recall | Terms found |
|
| 231 |
+
|---|---|---|
|
| 232 |
+
| PyMuPDF (what the frozen baseline used) | **0.8537** | 35 / 41 |
|
| 233 |
+
| MinerU, raw markup | **0.7561** | 31 / 41 |
|
| 234 |
+
| MinerU, formulas + tables rendered to prose | **0.8293** | 34 / 41 |
|
| 235 |
+
|
| 236 |
+
**The span model reads prose, not markup.** MinerU's structure is an asset for
|
| 237 |
+
the formula branch and a liability for the filter unless it is rendered first:
|
| 238 |
+
|
| 239 |
+
- Terms wrapped in LaTeX are invisible. `\text {Total Hours} - \text {Breakdown}`
|
| 240 |
+
yields no mentions for either term, though both are gold terms and both are
|
| 241 |
+
found in the plain-text parse. Unwrapping `\text{}`/`\mathrm{}`/`\frac{}{}`
|
| 242 |
+
and collapsing MinerU's character-spaced output recovers them.
|
| 243 |
+
- Raw `<table>` HTML in the chunk text is noise the model has to read past. Eight
|
| 244 |
+
of fourteen chunks carried it before rendering.
|
| 245 |
+
|
| 246 |
+
**The residual ~2.4 points are chunking, not content.** MinerU marks non-section
|
| 247 |
+
labels — `Keterangan:`, `Keterangan grafik:` — as `text_level` titles. Opening a
|
| 248 |
+
new section at each one splits a legend away from the figure it explains, and
|
| 249 |
+
`Other Activity` / `Uncontrollable` are then missed **despite being present as
|
| 250 |
+
prose in a chunk the filter processed**. Only **numbered** headings should open a
|
| 251 |
+
section, which is consistent with §9's finding that MinerU flattens every heading
|
| 252 |
+
to `level: 2` — numbering is the only reliable section signal it gives us.
|
| 253 |
+
|
| 254 |
+
**Caveat on attribution:** the MinerU artifacts here were built by a scratch
|
| 255 |
+
converter, because section-aware chunking belongs to the parsing half. These are
|
| 256 |
+
findings about what that chunker must handle, not a measurement of MinerU
|
| 257 |
+
itself.
|
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"_note": "Parser comparison on the SAME document, gold set and pipeline code. Answers whether MinerU input is interchangeable with the PyMuPDF parse the frozen baseline was measured on.",
|
| 3 |
+
"_caveat": "The MinerU artifacts were built by a SCRATCH converter in the scratchpad, not by production code — section-aware chunking is Sofhia's B5. Treat the chunking-related findings as indicative of what her chunker must handle, not as a measurement of MinerU.",
|
| 4 |
+
"run": {
|
| 5 |
+
"created_at": "2026-08-19_152842",
|
| 6 |
+
"doc_id": "STD_2026_006_MNO",
|
| 7 |
+
"implementation": "src/knowledge_extraction (v2)"
|
| 8 |
+
},
|
| 9 |
+
"variants": {
|
| 10 |
+
"pymupdf_prototype_parse": {
|
| 11 |
+
"E1_recall": 0.8537,
|
| 12 |
+
"true_positives": 35,
|
| 13 |
+
"chunks": 13,
|
| 14 |
+
"note": "what the frozen baseline used"
|
| 15 |
+
},
|
| 16 |
+
"mineru_raw_markup": {
|
| 17 |
+
"E1_recall": 0.7561,
|
| 18 |
+
"true_positives": 31,
|
| 19 |
+
"chunks": 14,
|
| 20 |
+
"misses": [
|
| 21 |
+
"Total Hours",
|
| 22 |
+
"Breakdown",
|
| 23 |
+
"Overburden removal",
|
| 24 |
+
"Grouping (Composite)",
|
| 25 |
+
"Weight average",
|
| 26 |
+
"Plan",
|
| 27 |
+
"Other Activity",
|
| 28 |
+
"Uncontrollable",
|
| 29 |
+
"Fleet management",
|
| 30 |
+
"Mineplan"
|
| 31 |
+
],
|
| 32 |
+
"note": "formulas left as LaTeX, tables as HTML — the span model reads prose, not markup"
|
| 33 |
+
},
|
| 34 |
+
"mineru_rendered_to_prose": {
|
| 35 |
+
"E1_recall": 0.8293,
|
| 36 |
+
"true_positives": 34,
|
| 37 |
+
"chunks": 14,
|
| 38 |
+
"misses": [
|
| 39 |
+
"Overburden removal",
|
| 40 |
+
"Grouping (Composite)",
|
| 41 |
+
"Weight average",
|
| 42 |
+
"Other Activity",
|
| 43 |
+
"Uncontrollable",
|
| 44 |
+
"Fleet management",
|
| 45 |
+
"Mineplan"
|
| 46 |
+
],
|
| 47 |
+
"note": "LaTeX unwrapped, tables flattened to rows; recovers most of the loss"
|
| 48 |
+
}
|
| 49 |
+
},
|
| 50 |
+
"n_gold": 41,
|
| 51 |
+
"kill_line": 0.7,
|
| 52 |
+
"findings": [
|
| 53 |
+
"Raw MinerU markup costs ~9.8 recall points: LaTeX-wrapped terms (Total Hours, Breakdown) are invisible to the span filter.",
|
| 54 |
+
"Rendering formulas and tables to prose recovers +7.3 points, to within ~2.4 points of the PyMuPDF parse.",
|
| 55 |
+
"The residual gap is CHUNKING, not content: MinerU marks non-section labels (Keterangan:, Keterangan grafik:) as text_level titles. Opening a new section at each one splits a legend from the figure it explains, and Other Activity / Uncontrollable are then missed despite being present as prose.",
|
| 56 |
+
"Actionable for the parsing half: only NUMBERED headings should open a section. This matches the earlier finding that MinerU flattens every heading to level 2, so numbering is the only reliable section signal.",
|
| 57 |
+
"The artifact should carry formulas and tables as readable text, not raw LaTeX/HTML, or the filter stage must render them before NER."
|
| 58 |
+
]
|
| 59 |
+
}
|