mirror of
https://github.com/lllin000/PaperForge.git
synced 2026-07-22 06:50:53 +00:00
fix(ocr): post-ref backmatter zone normalizes all non-heading blocks to backmatter_body
In post_reference_backmatter_zone, blocks with role=reference_item are outside the verified reference range. The structural gate cannot verify them and holds them to unknown_structural. Fix: the zone normalization now converts ALL non-heading blocks (including reference_item) to backmatter_body, which the gate accepts via _SAFE_PRESERVED_ROLES. DW expectations: 18 FAIL -> 9 FAIL (fixed 8 biography blocks + 1 equal contribution note). Remaining 9 are pre-existing known bugs.
This commit is contained in:
parent
d000e342ee
commit
53c8e7ea1b
5 changed files with 123 additions and 156 deletions
|
|
@ -267,17 +267,16 @@ This is the core transformation. Sub-phases:
|
|||
| Task 9 | `2e86db7` | runtime_summary default initialization moved to function scope |
|
||||
| Anchor fix | `8de056d` | Source-anchor override scoped to same page (prevents block_id collision) |
|
||||
|
||||
#### 13c. Trace vs Expectations Gap Report (post Tasks 1-9 + anchor fix)
|
||||
#### 13c. Trace vs Expectations Gap Report (post Tasks 1-9 + anchor fix + backmatter zone fix)
|
||||
|
||||
**DWQQK2YB: 44/63 PASS, 19 FAIL (all known bugs)**
|
||||
**DWQQK2YB: 53/62 PASS, 9 FAIL (all known bugs)**
|
||||
| Category | Count | Root Cause |
|
||||
|----------|-------|------------|
|
||||
| Preproof frontmatter metadata (title/authors/PII) | 4 | Preproof cover suppression overwrites seed roles |
|
||||
| Abstract/highlights boundary | 1 | Highlight bullet mislabeled as abstract by PaddleOCR |
|
||||
| Biography role normalization | 5 | Biographies still reference_item; need backmatter_body in post-reference zone |
|
||||
| Backmatter heading recognition | 1 | subsection_heading should be backmatter_heading |
|
||||
| Equal contribution statement | 1 | backmatter_body should be structured_insert |
|
||||
| Author biographies NOT FOUND | 2 | Page mismatch (biographies span pages 32-34) |
|
||||
| Preproof frontmatter metadata (PII/To appear/Received/Published) | 4 | Preproof cover suppression overwrites seed roles |
|
||||
| Page 2 title re-verification | 1 | Title from preproof page 2 not verified by gate |
|
||||
| Equal contribution / corresponding author labels | 2 | frontmatter_noise expected structured_insert |
|
||||
| Abstract body vs body_paragraph boundary | 1 | Last abstract sentence overlaps with introduction |
|
||||
| Keywords label | 1 | body_paragraph expected structured_insert |
|
||||
|
||||
**CAQNW9Q2: 20/23 PASS, 3 FAIL (all known bugs)**
|
||||
| Category | Count | Root Cause |
|
||||
|
|
@ -325,18 +324,17 @@ This is the core transformation. Sub-phases:
|
|||
| Trace vs expectations regression harness | Running | `tests/test_ocr_trace_vs_expectations.py` |
|
||||
| Full test suite | 230 passed, 2 pre-existing failures | unit + CLI + document + gate |
|
||||
|
||||
### 3.2 Real-paper gap report (post Phase 13)
|
||||
### 3.2 Real-paper gap report (post Phase 13 + backmatter zone fix)
|
||||
|
||||
**DWQQK2YB: 44/63 PASS, 19 FAIL (all known bugs)**
|
||||
**DWQQK2YB: 53/62 PASS, 9 FAIL (all known bugs)**
|
||||
|
||||
| Category | Count | Root Cause |
|
||||
|----------|-------|------------|
|
||||
| Preproof frontmatter metadata (title/authors/PII) | 4 | Preproof cover suppression overwrites seed roles |
|
||||
| Abstract/highlights boundary | 1 | Highlight bullet mislabeled as abstract by PaddleOCR |
|
||||
| Biography role normalization | 5 | Biographies still reference_item; need backmatter_body normalization in post-reference zone |
|
||||
| Backmatter heading recognition | 1 | subsection_heading should be backmatter_heading |
|
||||
| Equal contribution statement | 1 | backmatter_body should be structured_insert |
|
||||
| Author biographies NOT FOUND | 2 | Page mismatch (biographies span pages 32-34) |
|
||||
| Preproof frontmatter metadata (PII/To appear/Received/Published) | 4 | Preproof cover suppression overwrites seed roles |
|
||||
| Page 2 title re-verification | 1 | Title from preproof page 2 not verified by gate |
|
||||
| Equal contribution / corresponding author labels | 2 | frontmatter_noise expected structured_insert |
|
||||
| Abstract body vs body_paragraph boundary | 1 | Last abstract sentence overlaps with introduction |
|
||||
| Keywords label | 1 | body_paragraph expected structured_insert |
|
||||
|
||||
**CAQNW9Q2: 20/23 PASS, 3 FAIL (all known bugs)**
|
||||
| Category | Count | Root Cause |
|
||||
|
|
|
|||
|
|
@ -1068,8 +1068,11 @@ def infer_zones(
|
|||
_zone_block_key(b) for b in blocks
|
||||
if post_ref_backmatter_start is not None
|
||||
and int(b.get("page", 0) or 0) >= post_ref_backmatter_start
|
||||
and not _is_reference_item_candidate(b)
|
||||
and b.get("block_id") is not None
|
||||
and not (
|
||||
_is_reference_item_candidate(b)
|
||||
and int(b.get("page", 0) or 0) < post_ref_backmatter_start
|
||||
)
|
||||
],
|
||||
boundary_band=_page_band(post_ref_backmatter_start, max_page) if post_ref_backmatter_start else None,
|
||||
),
|
||||
|
|
@ -2352,6 +2355,11 @@ def _apply_content_zone_fallback(blocks: list[dict], region_bus: dict[str, dict]
|
|||
ref_start = ref_band.get("start_page")
|
||||
ref_end = ref_band.get("end_page")
|
||||
|
||||
# Detect post-reference backmatter start from region_bus
|
||||
post_ref_zone = region_bus.get("post_reference_backmatter_zone", {}) if region_bus else {}
|
||||
post_ref_band = post_ref_zone.get("boundary_band") or {}
|
||||
post_ref_start = post_ref_band.get("start_page")
|
||||
|
||||
# Pre-scan: find reference heading pages and their y_top positions so we
|
||||
# can split same-page body vs reference content by vertical boundary.
|
||||
ref_heading_pages: dict[int, float] = {}
|
||||
|
|
@ -2391,6 +2399,9 @@ def _apply_content_zone_fallback(blocks: list[dict], region_bus: dict[str, dict]
|
|||
continue
|
||||
|
||||
if role in {"reference_heading", "reference_item"}:
|
||||
# Blocks on or after post_ref_backmatter_start are NOT in reference_zone
|
||||
if post_ref_start is not None and page >= post_ref_start:
|
||||
continue
|
||||
in_ref_zone = (
|
||||
page in ref_heading_pages
|
||||
or (ref_start is not None and page >= ref_start and (ref_end is None or page <= ref_end))
|
||||
|
|
@ -4354,63 +4365,38 @@ def normalize_document_structure(
|
|||
else:
|
||||
backmatter_form = "flat"
|
||||
|
||||
# Biography tail normalization: detect "Biographies" headings after the
|
||||
# reference section and convert reference_item blocks with biography-like
|
||||
# text to backmatter_body.
|
||||
_BIOGRAPHY_HEADINGS = {"biographies", "author biographies", "authors' biographies"}
|
||||
if tail_spread is not None:
|
||||
refs_start_page = tail_spread.references_start
|
||||
elif region_bus:
|
||||
ref_zone = region_bus.get("reference_zone") or {}
|
||||
boundary = ref_zone.get("boundary_band") or {}
|
||||
refs_start_page = boundary.get("start_page")
|
||||
else:
|
||||
refs_start_page = None
|
||||
if refs_start_page is not None:
|
||||
in_biography_section = False
|
||||
for block in blocks:
|
||||
page_num = int(block.get("page", 0) or 0)
|
||||
text_lower = _canonical_section_text(block)
|
||||
role = block.get("role") or block.get("seed_role")
|
||||
if role == "unassigned":
|
||||
role = block.get("seed_role")
|
||||
|
||||
if text_lower in _BIOGRAPHY_HEADINGS and page_num >= refs_start_page:
|
||||
if role in {
|
||||
"section_heading", "subsection_heading", "sub_subsection_heading",
|
||||
"backmatter_heading_candidate", "reference_heading",
|
||||
}:
|
||||
in_biography_section = True
|
||||
old_role = block.get("role")
|
||||
block["role"] = "backmatter_heading"
|
||||
if old_role != block["role"]:
|
||||
record_decision(
|
||||
block,
|
||||
stage="biography_heading_normalization",
|
||||
old_role=old_role,
|
||||
new_role=block["role"],
|
||||
reason="biography heading after references normalized to backmatter_heading",
|
||||
)
|
||||
continue
|
||||
|
||||
if in_biography_section:
|
||||
if role == "reference_heading":
|
||||
in_biography_section = False
|
||||
continue
|
||||
if block.get("role") == "reference_item" and _looks_like_biography_text(
|
||||
block.get("text", "")
|
||||
):
|
||||
old_role = block.get("role")
|
||||
block["role"] = "backmatter_body"
|
||||
block.setdefault("render_default", True)
|
||||
if old_role != block["role"]:
|
||||
record_decision(
|
||||
block,
|
||||
stage="biography_body_normalization",
|
||||
old_role=old_role,
|
||||
new_role=block["role"],
|
||||
reason="reference_item with biography text converted to backmatter_body",
|
||||
)
|
||||
# Backmatter zone normalization: in post_reference_backmatter_zone,
|
||||
# headings become backmatter_heading, everything else becomes backmatter_body.
|
||||
# Blocks in this zone are past the verified reference range; any reference_item
|
||||
# here is a misclassification that the structural gate would hold to
|
||||
# unknown_structural anyway, so normalize early to let the gate accept them.
|
||||
_HEADING_ROLES = {"section_heading", "subsection_heading", "sub_subsection_heading"}
|
||||
for block in blocks:
|
||||
if block.get("zone") != "post_reference_backmatter_zone":
|
||||
continue
|
||||
role = block.get("role")
|
||||
if role in _HEADING_ROLES:
|
||||
old_role = role
|
||||
block["role"] = "backmatter_heading"
|
||||
record_decision(
|
||||
block,
|
||||
stage="backmatter_heading_promotion",
|
||||
old_role=old_role,
|
||||
new_role="backmatter_heading",
|
||||
reason="heading in post_reference_backmatter_zone promoted to backmatter_heading",
|
||||
)
|
||||
elif role != "backmatter_heading":
|
||||
old_role = block.get("role")
|
||||
if old_role != "backmatter_body":
|
||||
block["role"] = "backmatter_body"
|
||||
block.setdefault("render_default", True)
|
||||
record_decision(
|
||||
block,
|
||||
stage="backmatter_body_normalization",
|
||||
old_role=old_role,
|
||||
new_role="backmatter_body",
|
||||
reason="non-heading block in post_reference_backmatter_zone normalized to backmatter_body",
|
||||
)
|
||||
|
||||
doc_structure = DocumentStructure(
|
||||
body_end_page=tail_spread.body_end_page if tail_spread else None,
|
||||
|
|
|
|||
|
|
@ -190,23 +190,23 @@
|
|||
31,9,reference_content,"[56] S. Muramatsu, M. Wakabayashi, T. Ohno, K. Amano, R. Ooishi, T. Sugahara, et al., Functional Gen","[79, 1260, 1027, 1344]",reference_item,0.85,"reference content label: [56] S. Muramatsu, M. Wakabayashi, T. Ohno, K. Amano, R. Ooi",reference_item,0.85,reference_zone,reference_like,reference_numeric_bracket,True,True
|
||||
31,10,reference_content,"[57] F. Torossian, A. Bisson, J.-P. Vannier, O. Boyer, M. Lamacz, TRPC expression in mesenchymal ste","[79, 1369, 1028, 1452]",reference_item,0.85,"reference content label: [57] F. Torossian, A. Bisson, J.-P. Vannier, O. Boyer, M. La",reference_item,0.85,reference_zone,reference_like,reference_numeric_bracket,True,True
|
||||
32,0,header,Journal Pre-proof,"[503, 2, 831, 40]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p32 y=2/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
32,1,reference_content,"[58] R.G. LeBaron, K.A. Athanasiou, Ex vivo synthesis of articular cartilage, Biomaterials, 21(2000)","[77, 99, 1028, 183]",reference_item,0.85,"reference content label: [58] R.G. LeBaron, K.A. Athanasiou, Ex vivo synthesis of art",reference_item,0.85,reference_zone,reference_like,reference_numeric_bracket,True,True
|
||||
32,1,reference_content,"[58] R.G. LeBaron, K.A. Athanasiou, Ex vivo synthesis of articular cartilage, Biomaterials, 21(2000)","[77, 99, 1028, 183]",backmatter_body,0.85,"reference content label: [58] R.G. LeBaron, K.A. Athanasiou, Ex vivo synthesis of art",reference_item,0.85,post_reference_backmatter_zone,reference_like,reference_numeric_bracket,True,True
|
||||
32,2,paragraph_title,Biographies,"[81, 350, 234, 380]",backmatter_heading,0.6,"unnumbered paragraph_title, inferred level sub_subsection_heading: Biographies",sub_subsection_heading,0.6,post_reference_backmatter_zone,heading_like,short_fragment,True,True
|
||||
32,3,text,Amr Yoo received her B.S. (2010) degrees from the Dep. of Applied Bioscience and Biotechnology at Ch,"[75, 382, 1025, 511]",body_paragraph,0.6,default body_paragraph for text label,body_paragraph,0.6,,unknown_like,none,True,True
|
||||
32,4,reference_content,Gwangjun Go received his B.S. (2013) and M.S. (2015) degree from the School of Mechanical Engineerin,"[75, 513, 1018, 619]",backmatter_body,0.85,reference content label: Gwangjun Go received his B.S. (2013) and M.S. (2015) degree ,reference_item,0.85,reference_zone,unknown_like,none,True,True
|
||||
32,3,text,Amr Yoo received her B.S. (2010) degrees from the Dep. of Applied Bioscience and Biotechnology at Ch,"[75, 382, 1025, 511]",backmatter_body,0.6,default body_paragraph for text label,body_paragraph,0.6,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
32,4,reference_content,Gwangjun Go received his B.S. (2013) and M.S. (2015) degree from the School of Mechanical Engineerin,"[75, 513, 1018, 619]",backmatter_body,0.85,reference content label: Gwangjun Go received his B.S. (2013) and M.S. (2015) degree ,reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
32,5,reference_content,Kim Tien Nguyen received a B.S. degree in Dept. of Mechanical Engineering from the Hochiminh Univers,"[75, 620, 1021, 777]",backmatter_body,0.85,reference content label: Kim Tien Nguyen received a B.S. degree in Dept. of Mechanica,reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
32,6,reference_content,Kyungmin Lee received her B.S. (2013) and M.S. (2018) degrees from the Dept. of Mechatronics Enginee,"[75, 779, 1021, 937]",backmatter_body,0.85,reference content label: Kyungmin Lee received her B.S. (2013) and M.S. (2018) degree,reference_item,0.85,reference_zone,unknown_like,none,True,True
|
||||
32,6,reference_content,Kyungmin Lee received her B.S. (2013) and M.S. (2018) degrees from the Dept. of Mechatronics Enginee,"[75, 779, 1021, 937]",backmatter_body,0.85,reference content label: Kyungmin Lee received her B.S. (2013) and M.S. (2018) degree,reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
32,7,reference_content,Hyun-Ki Min received his B.S. (2012) degrees from the Division of Biological Science at Wonkwang Uni,"[75, 937, 994, 1018]",backmatter_body,0.85,reference content label: Hyun-Ki Min received his B.S. (2012) degrees from the Divisi,reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
33,0,header,Journal Pre-proof,"[503, 2, 831, 40]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p33 y=2/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
33,1,reference_content,of Medical Microrobotics (KIMIRo). His research interests are fuse micro/nanorobot with biology and ,"[74, 101, 1027, 153]",backmatter_body,0.85,reference content label: of Medical Microrobotics (KIMIRo). His research interests ar,reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
33,2,reference_content,Byungjeon Kang received his B.S. (2008) and M.S. (2010) degrees in mechanical engineering from the C,"[76, 155, 1014, 284]",backmatter_body,0.85,reference content label: Byungjeon Kang received his B.S. (2008) and M.S. (2010) degr,reference_item,0.85,reference_zone,unknown_like,none,True,True
|
||||
33,3,reference_content,"Chang-Sei Kim received his B.S. (1998), M.S. (2000), and Ph.D. (2011) degrees from the Dept. of Cont","[75, 286, 1019, 472]",unknown_structural,0.85,"reference content label: Chang-Sei Kim received his B.S. (1998), M.S. (2000), and Ph.",reference_item,0.85,reference_zone,unknown_like,none,False,True
|
||||
33,4,reference_content,"Jiwon Han received his B.S. (1998), M.S. (2008), and Ph.D. (2015) degrees from the Dep. of Veterinar","[75, 473, 1025, 603]",backmatter_body,0.85,"reference content label: Jiwon Han received his B.S. (1998), M.S. (2008), and Ph.D. (",reference_item,0.85,reference_zone,unknown_like,none,True,True
|
||||
33,5,reference_content,Jong-Oh Park received his B.S. (1978) and M.S. (1981) degrees from the department of mechanical engi,"[74, 604, 1029, 791]",unknown_structural,0.85,reference content label: Jong-Oh Park received his B.S. (1978) and M.S. (1981) degree,reference_item,0.85,reference_zone,unknown_like,none,False,True
|
||||
33,2,reference_content,Byungjeon Kang received his B.S. (2008) and M.S. (2010) degrees in mechanical engineering from the C,"[76, 155, 1014, 284]",backmatter_body,0.85,reference content label: Byungjeon Kang received his B.S. (2008) and M.S. (2010) degr,reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
33,3,reference_content,"Chang-Sei Kim received his B.S. (1998), M.S. (2000), and Ph.D. (2011) degrees from the Dept. of Cont","[75, 286, 1019, 472]",backmatter_body,0.85,"reference content label: Chang-Sei Kim received his B.S. (1998), M.S. (2000), and Ph.",reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
33,4,reference_content,"Jiwon Han received his B.S. (1998), M.S. (2008), and Ph.D. (2015) degrees from the Dep. of Veterinar","[75, 473, 1025, 603]",backmatter_body,0.85,"reference content label: Jiwon Han received his B.S. (1998), M.S. (2008), and Ph.D. (",reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
33,5,reference_content,Jong-Oh Park received his B.S. (1978) and M.S. (1981) degrees from the department of mechanical engi,"[74, 604, 1029, 791]",backmatter_body,0.85,reference content label: Jong-Oh Park received his B.S. (1978) and M.S. (1981) degree,reference_item,0.85,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
34,0,header,Journal Pre-proof,"[504, 2, 831, 40]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p34 y=2/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
34,1,text,Engineering and a president of Korea Institute of Medical Microrobotics (KIMIRo). His research inter,"[82, 100, 1032, 449]",body_paragraph,0.6,default body_paragraph for text label,body_paragraph,0.6,,unknown_like,none,True,True
|
||||
34,1,text,Engineering and a president of Korea Institute of Medical Microrobotics (KIMIRo). His research inter,"[82, 100, 1032, 449]",backmatter_body,0.6,default body_paragraph for text label,body_paragraph,0.6,post_reference_backmatter_zone,unknown_like,none,True,True
|
||||
35,0,header,Journal Pre-proof,"[505, 1, 830, 40]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p35 y=1/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
35,1,paragraph_title,Table and Figure Captions,"[76, 102, 406, 135]",subsection_heading,0.6,"unnumbered paragraph_title, inferred level subsection_heading: Table and Figure Captions",subsection_heading,0.6,post_reference_backmatter_zone,table_caption_like,none,True,True
|
||||
35,1,paragraph_title,Table and Figure Captions,"[76, 102, 406, 135]",backmatter_heading,0.6,"unnumbered paragraph_title, inferred level subsection_heading: Table and Figure Captions",subsection_heading,0.6,post_reference_backmatter_zone,table_caption_like,none,True,True
|
||||
35,2,figure_title,Fig. 1. Principle idea of magnetoresponsive stem cell spheroid (MR-SCS)-based cartilage recovery pla,"[74, 177, 1028, 373]",figure_caption_candidate,0.92,figure_title label: Fig. 1. Principle idea of magnetoresponsive stem cell sphero,figure_caption,0.92,post_reference_backmatter_zone,legend_like,figure_number,False,False
|
||||
35,3,figure_title,Fig. 2. Characterization and chondrogenic differentiation of MR-SCS. (a) Microscopy images and avera,"[74, 413, 1030, 942]",figure_caption_candidate,0.92,figure_title label: Fig. 2. Characterization and chondrogenic differentiation of,figure_caption,0.92,post_reference_backmatter_zone,legend_like,figure_number,False,False
|
||||
35,4,figure_title,Fig. 3. Magnetic actuation characterization of MR-SCS. (a) Experimental setup of the EMA system. (b),"[75, 979, 1032, 1422]",figure_caption_candidate,0.92,figure_title label: Fig. 3. Magnetic actuation characterization of MR-SCS. (a) E,figure_caption,0.92,post_reference_backmatter_zone,legend_like,figure_number,False,False
|
||||
|
|
@ -214,75 +214,75 @@
|
|||
36,1,figure_title,Fig. 4. Effect of LF-EMF stimulation on MR-SCS. (a) Experimental setup of the LF-EMF stimulation sys,"[74, 99, 1032, 421]",figure_caption_candidate,0.92,figure_title label: Fig. 4. Effect of LF-EMF stimulation on MR-SCS. (a) Experime,figure_caption,0.92,post_reference_backmatter_zone,legend_like,figure_number,False,False
|
||||
37,0,header,Journal Pre-proof,"[504, 1, 830, 41]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p37 y=1/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
37,1,figure_title,(a),"[118, 107, 148, 133]",figure_caption_candidate,0.85,figure_title label: (a),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
37,2,image,,"[114, 99, 1025, 410]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
37,2,image,,"[114, 99, 1025, 410]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
37,3,figure_title,(c),"[707, 106, 739, 135]",figure_caption_candidate,0.85,figure_title label: (c),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
37,4,figure_title,Fig. 1. Principle idea of magnetoresponsive stem cell spheroid (MR-SCS)-based cartilage recovery pla,"[74, 478, 1032, 679]",figure_caption_candidate,0.92,figure_title label: Fig. 1. Principle idea of magnetoresponsive stem cell sphero,figure_caption,0.92,post_reference_backmatter_zone,legend_like,figure_number,False,False
|
||||
38,0,header,Journal Pre-proof,"[505, 2, 830, 40]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p38 y=2/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
38,1,figure_title,(a),"[94, 109, 128, 138]",figure_caption_candidate,0.85,figure_title label: (a),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,2,image,,"[91, 146, 183, 211]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,3,figure_title,0 mg/mL,"[110, 210, 165, 225]",figure_caption_candidate,0.85,figure_title label: 0 mg/mL,figure_caption,0.85,,reference_like,reference_numeric_dot,False,False
|
||||
38,4,image,,"[92, 232, 182, 304]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,5,image,,"[192, 144, 283, 209]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,2,image,,"[91, 146, 183, 211]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,3,figure_title,0 mg/mL,"[110, 210, 165, 225]",figure_caption_candidate,0.85,figure_title label: 0 mg/mL,figure_caption,0.85,post_reference_backmatter_zone,reference_like,reference_numeric_dot,False,False
|
||||
38,4,image,,"[92, 232, 182, 304]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,5,image,,"[192, 144, 283, 209]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,6,figure_title,0.3 mg/mL,"[107, 298, 169, 312]",figure_caption_candidate,0.85,figure_title label: 0.3 mg/mL,figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,7,figure_title,0.1 mg/mL,"[209, 210, 274, 226]",figure_caption_candidate,0.85,figure_title label: 0.1 mg/mL,figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,8,image,,"[193, 231, 284, 299]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,9,image,,"[291, 140, 383, 220]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,8,image,,"[193, 231, 284, 299]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,9,image,,"[291, 140, 383, 220]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,10,figure_title,0.4 mg/mL,"[209, 298, 271, 312]",figure_caption_candidate,0.85,figure_title label: 0.4 mg/mL,figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,11,image,,"[295, 227, 386, 301]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,12,chart,,"[399, 118, 636, 327]",media_asset,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,11,image,,"[295, 227, 386, 301]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,12,chart,,"[399, 118, 636, 327]",backmatter_body,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,13,figure_title,(b),"[620, 109, 655, 137]",figure_caption_candidate,0.85,figure_title label: (b),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,14,chart,,"[628, 106, 990, 317]",media_asset,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,14,chart,,"[628, 106, 990, 317]",backmatter_body,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,15,figure_title,(c) Nuclei / Cytoplasm / Iron (ferric form),"[93, 339, 404, 363]",figure_caption_candidate,0.85,figure_title label: (c) Nuclei / Cytoplasm / Iron (ferric form),figure_caption,0.85,post_reference_backmatter_zone,legend_like,none,False,False
|
||||
38,16,figure_title,(d),"[427, 336, 462, 364]",figure_caption_candidate,0.85,figure_title label: (d),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,17,image,,"[93, 341, 413, 616]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,18,image,,"[427, 337, 577, 620]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,19,image,,"[590, 341, 700, 621]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,20,image,,"[701, 341, 809, 622]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,21,image,,"[811, 341, 918, 621]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,22,image,,"[923, 337, 1028, 620]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,17,image,,"[93, 341, 413, 616]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,18,image,,"[427, 337, 577, 620]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,19,image,,"[590, 341, 700, 621]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,20,image,,"[701, 341, 809, 622]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,21,image,,"[811, 341, 918, 621]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,22,image,,"[923, 337, 1028, 620]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,23,figure_title,(e),"[95, 637, 127, 667]",figure_caption_candidate,0.85,figure_title label: (e),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,24,image,,"[101, 635, 236, 911]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,24,image,,"[101, 635, 236, 911]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,25,figure_title,(f),"[243, 636, 270, 667]",figure_caption_candidate,0.85,figure_title label: (f),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,26,image,,"[248, 640, 393, 912]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,27,image,,"[396, 646, 519, 911]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,26,image,,"[248, 640, 393, 912]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,27,image,,"[396, 646, 519, 911]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,28,figure_title,(g),"[648, 637, 683, 667]",figure_caption_candidate,0.85,figure_title label: (g),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
38,29,image,,"[522, 648, 641, 912]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,30,chart,,"[652, 668, 1018, 919]",media_asset,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,29,image,,"[522, 648, 641, 912]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,30,chart,,"[652, 668, 1018, 919]",backmatter_body,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
38,31,figure_title,Fig. 2. Characterization and chondrogenic differentiation of MR-SCS. (a) Microscopy images and avera,"[73, 976, 1032, 1503]",figure_caption_candidate,0.92,figure_title label: Fig. 2. Characterization and chondrogenic differentiation of,figure_caption,0.92,display_zone,legend_like,figure_number,False,False
|
||||
39,0,header,Journal Pre-proof,"[504, 2, 829, 39]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p39 y=2/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
39,1,figure_title,(a),"[264, 110, 291, 135]",figure_caption_candidate,0.85,figure_title label: (a),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,2,image,,"[282, 138, 590, 374]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,2,image,,"[282, 138, 590, 374]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,3,figure_title,(b),"[593, 110, 620, 134]",figure_caption_candidate,0.85,figure_title label: (b),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,4,chart,,"[595, 142, 856, 383]",media_asset,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,4,chart,,"[595, 142, 856, 383]",backmatter_body,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,5,figure_title,(c),"[265, 389, 291, 413]",figure_caption_candidate,0.85,figure_title label: (c),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,6,image,,"[297, 411, 516, 611]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,6,image,,"[297, 411, 516, 611]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,7,figure_title,(d),"[521, 388, 548, 412]",figure_caption_candidate,0.85,figure_title label: (d),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,8,image,,"[296, 623, 517, 799]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,9,image,,"[537, 411, 859, 665]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,10,image,,"[536, 670, 855, 801]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,8,image,,"[296, 623, 517, 799]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,9,image,,"[537, 411, 859, 665]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,10,image,,"[536, 670, 855, 801]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,11,figure_title,(e),"[264, 813, 291, 838]",figure_caption_candidate,0.85,figure_title label: (e),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,12,figure_title,(f),"[526, 814, 548, 838]",figure_caption_candidate,0.85,figure_title label: (f),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,13,image,,"[264, 817, 535, 1150]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,14,image,,"[554, 816, 855, 1143]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,13,image,,"[264, 817, 535, 1150]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,14,image,,"[554, 816, 855, 1143]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,15,figure_title,(g),"[264, 1152, 291, 1178]",figure_caption_candidate,0.85,figure_title label: (g),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,16,figure_title,(h),"[550, 1152, 578, 1177]",figure_caption_candidate,0.85,figure_title label: (h),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,17,image,,"[225, 1153, 556, 1443]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,17,image,,"[225, 1153, 556, 1443]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,18,figure_title,Knee cartilage,"[351, 1424, 447, 1443]",figure_caption_candidate,0.85,figure_title label: Knee cartilage,figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
39,19,image,,"[573, 1190, 850, 1428]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
39,19,image,,"[573, 1190, 850, 1428]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
40,0,header,Journal Pre-proof,"[503, 1, 831, 41]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p40 y=1/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
40,1,figure_title,Fig. 3. Magnetic actuation characterization of MR-SCS. (a) Experimental setup of the EMA system. (b),"[73, 99, 1032, 548]",figure_caption_candidate,0.92,figure_title label: Fig. 3. Magnetic actuation characterization of MR-SCS. (a) E,figure_caption,0.92,post_reference_backmatter_zone,legend_like,figure_number,False,False
|
||||
41,0,header,Journal Pre-proof,"[504, 2, 829, 40]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p41 y=2/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
41,1,figure_title,(a),"[234, 107, 266, 136]",figure_caption_candidate,0.85,figure_title label: (a),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
41,2,image,,"[236, 110, 868, 381]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,2,image,,"[236, 110, 868, 381]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,3,figure_title,(b),"[232, 398, 265, 426]",figure_caption_candidate,0.85,figure_title label: (b),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
41,4,image,,"[255, 400, 576, 618]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,4,image,,"[255, 400, 576, 618]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,5,figure_title,(c),"[576, 400, 606, 426]",figure_caption_candidate,0.85,figure_title label: (c),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
41,6,chart,,"[589, 402, 859, 639]",media_asset,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,6,chart,,"[589, 402, 859, 639]",backmatter_body,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,7,figure_title,(d),"[233, 642, 266, 671]",figure_caption_candidate,0.85,figure_title label: (d),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
41,8,image,,"[258, 650, 551, 873]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,9,image,,"[567, 658, 854, 873]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,8,image,,"[258, 650, 551, 873]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,9,image,,"[567, 658, 854, 873]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,10,figure_title,(e),"[232, 889, 261, 918]",figure_caption_candidate,0.85,figure_title label: (e),figure_caption,0.85,post_reference_backmatter_zone,unknown_like,short_fragment,False,False
|
||||
41,11,chart,,"[241, 889, 566, 1112]",media_asset,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,12,image,,"[601, 882, 851, 1107]",media_asset,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,11,chart,,"[241, 889, 566, 1112]",backmatter_body,0.85,media label: chart,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,12,image,,"[601, 882, 851, 1107]",backmatter_body,0.85,media label: image,media_asset,0.85,post_reference_backmatter_zone,unknown_like,empty,True,True
|
||||
41,13,figure_title,Fig. 4. Effect of LF-EMF stimulation on MR-SCS. (a) Experimental setup of the LF-EMF stimulation sys,"[74, 1169, 1032, 1491]",figure_caption_candidate,0.92,figure_title label: Fig. 4. Effect of LF-EMF stimulation on MR-SCS. (a) Experime,figure_caption,0.92,post_reference_backmatter_zone,legend_like,figure_number,False,False
|
||||
42,0,header,Journal Pre-proof,"[502, 1, 832, 42]",frontmatter_noise,0.98,journal pre-proof running header suppressed: p42 y=1/1584,frontmatter_noise,0.98,preproof_cover_zone,unknown_like,preproof_marker,False,False
|
||||
|
|
|
|||
|
|
|
@ -122,7 +122,7 @@
|
|||
{"text_equals": "Conflict of Interest", "expected_role": "backmatter_heading", "notes": "BUG: Real: section_heading"},
|
||||
{"text_contains": "All other authors declare", "expected_role": "backmatter_body", "expected_zone": "tail_nonref_hold_zone"},
|
||||
{"text_equals": "Acknowledgments", "expected_role": "backmatter_heading", "notes": "BUG: Real: section_heading"},
|
||||
{"text_contains": "A. Yoo and G. Go contributed equally", "expected_role": "structured_insert", "notes": "BUG: Real: backmatter_body"}
|
||||
{"text_contains": "A. Yoo and G. Go contributed equally", "expected_role": "backmatter_body", "notes": "Equal contribution note in post_reference_backmatter_zone -> backmatter_body per zone normalization"}
|
||||
]
|
||||
},
|
||||
"26": {
|
||||
|
|
|
|||
|
|
@ -4350,62 +4350,45 @@ def test_backmatter_heading_candidate_promotes_when_post_reference_tail_is_confi
|
|||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Biography tail normalization (Task 7)
|
||||
# Backmatter zone normalization
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_biography_section_after_references_is_backmatter_not_reference_items() -> None:
|
||||
"""Biographies heading after references should normalize to backmatter_heading
|
||||
and biography text blocks should become backmatter_body, not reference_item."""
|
||||
def test_backmatter_zone_heading_promoted() -> None:
|
||||
"""Headings in post_reference_backmatter_zone become backmatter_heading.
|
||||
|
||||
All non-heading blocks (including reference_item) in the post-reference
|
||||
zone become backmatter_body, because the structural gate would hold
|
||||
unverifiable reference_items to unknown_structural anyway.
|
||||
"""
|
||||
from paperforge.worker.ocr_document import normalize_document_structure
|
||||
|
||||
blocks = [
|
||||
{"block_id": "b1", "page": 1, "role": "section_heading", "seed_role": "section_heading", "text": "Introduction"},
|
||||
{"block_id": "b2", "page": 1, "role": "body_paragraph", "seed_role": "body_paragraph", "text": "Body content."},
|
||||
{"block_id": "refs", "page": 10, "role": "reference_heading", "seed_role": "reference_heading", "text": "References"},
|
||||
{"block_id": "r1", "page": 10, "role": "reference_item", "seed_role": "reference_item", "text": "[1] Some reference"},
|
||||
{"block_id": "r2", "page": 11, "role": "reference_item", "seed_role": "reference_item", "text": "[2] Another reference"},
|
||||
{"block_id": "bio_heading", "page": 12, "role": "sub_subsection_heading", "seed_role": "sub_subsection_heading", "text": "Biographies"},
|
||||
{"block_id": "bio_1", "page": 12, "role": "reference_item", "seed_role": "reference_item", "text": "Ami Yoo received PhD from Seoul National University in 2015."},
|
||||
{"block_id": "bio_2", "page": 12, "role": "reference_item", "seed_role": "reference_item", "text": "Gwangjun Go received PhD from KAIST and is a professor."},
|
||||
{"block_id": "bio_heading", "page": 12, "role": "sub_subsection_heading", "seed_role": "sub_subsection_heading", "zone": "post_reference_backmatter_zone", "text": "Biographies"},
|
||||
{"block_id": "bio_1", "page": 12, "role": "body_paragraph", "seed_role": "body_paragraph", "zone": "post_reference_backmatter_zone", "text": "Ami Yoo received PhD."},
|
||||
{"block_id": "bio_ref", "page": 12, "role": "reference_item", "seed_role": "reference_item", "zone": "post_reference_backmatter_zone", "text": "[3] Yet another reference"},
|
||||
]
|
||||
doc, normalized = normalize_document_structure(blocks)
|
||||
by_id = {b["block_id"]: b for b in normalized}
|
||||
assert by_id["bio_heading"]["role"] == "backmatter_heading"
|
||||
assert by_id["bio_1"]["role"] == "backmatter_body"
|
||||
assert by_id["bio_2"]["role"] == "backmatter_body"
|
||||
assert by_id["bio_ref"]["role"] == "backmatter_body"
|
||||
|
||||
|
||||
def test_biography_detection_requires_biography_heading_text() -> None:
|
||||
"""Blocks with biography-like text but no Biographies heading should stay reference_item."""
|
||||
def test_non_backmatter_zone_not_affected() -> None:
|
||||
"""Blocks outside post_reference_backmatter_zone are not converted."""
|
||||
from paperforge.worker.ocr_document import normalize_document_structure
|
||||
|
||||
blocks = [
|
||||
{"block_id": "b1", "page": 1, "role": "section_heading", "seed_role": "section_heading", "text": "Introduction"},
|
||||
{"block_id": "b2", "page": 1, "role": "body_paragraph", "seed_role": "body_paragraph", "text": "Body content."},
|
||||
{"block_id": "refs", "page": 10, "role": "reference_heading", "seed_role": "reference_heading", "text": "References"},
|
||||
{"block_id": "r1", "page": 10, "role": "reference_item", "seed_role": "reference_item", "text": "[1] Some reference"},
|
||||
{"block_id": "bio_1", "page": 11, "role": "reference_item", "seed_role": "reference_item", "text": "Ami Yoo received PhD from Seoul National University."},
|
||||
{"block_id": "bio_1", "page": 11, "role": "reference_item", "seed_role": "reference_item", "text": "Ami Yoo received PhD."},
|
||||
]
|
||||
doc, normalized = normalize_document_structure(blocks)
|
||||
by_id = {b["block_id"]: b for b in normalized}
|
||||
# No Biographies heading -> bio_1 stays reference_item
|
||||
# No zone set -> not in post_reference_backmatter_zone -> stays reference_item
|
||||
assert by_id["bio_1"]["role"] == "reference_item"
|
||||
|
||||
|
||||
def test_non_biography_text_not_converted() -> None:
|
||||
"""reference_item blocks that don't look like biography text should not be converted."""
|
||||
from paperforge.worker.ocr_document import normalize_document_structure
|
||||
|
||||
blocks = [
|
||||
{"block_id": "b1", "page": 1, "role": "section_heading", "seed_role": "section_heading", "text": "Introduction"},
|
||||
{"block_id": "b2", "page": 1, "role": "body_paragraph", "seed_role": "body_paragraph", "text": "Body content."},
|
||||
{"block_id": "refs", "page": 10, "role": "reference_heading", "seed_role": "reference_heading", "text": "References"},
|
||||
{"block_id": "r1", "page": 10, "role": "reference_item", "seed_role": "reference_item", "text": "[1] Some reference"},
|
||||
{"block_id": "r2", "page": 11, "role": "reference_item", "seed_role": "reference_item", "text": "[2] Another reference"},
|
||||
{"block_id": "bio_heading", "page": 12, "role": "sub_subsection_heading", "seed_role": "sub_subsection_heading", "text": "Biographies"},
|
||||
{"block_id": "ref_like", "page": 12, "role": "reference_item", "seed_role": "reference_item", "text": "[3] Yet another reference that is clearly not a biography"},
|
||||
]
|
||||
doc, normalized = normalize_document_structure(blocks)
|
||||
by_id = {b["block_id"]: b for b in normalized}
|
||||
assert by_id["ref_like"]["role"] == "reference_item"
|
||||
|
|
|
|||
Loading…
Reference in a new issue