Rifqi Hafizuddin Claude Fable 5 commited on
Commit
6038b2b
·
1 Parent(s): ab5ea78

[NOTICKET] eval(knowledge): run the pipeline on MinerU-parsed input — parser comparison

Browse files

First 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>

KNOWLEDGE_PIPELINE_CALIBRATION.md CHANGED
@@ -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.
eval/knowledge/results/v2_parser_comparison_2026-08-19_152842.json ADDED
@@ -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
+ }