Skip to content

jh941213/ollama-document-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“„ ollamaparser

κ³ κΈ‰ PDF λ¬Έμ„œ νŒŒμ‹± μ‹œμŠ€ν…œ β€” Layout Detection + OCR + Vision Language Model(VLM)을 κ²°ν•©ν•˜μ—¬ PDFλ₯Ό μ§€λŠ₯ν˜• ꡬ쑰화 λ¬Έμ„œλ‘œ λ³€ν™˜

🎯 ν”„λ‘œμ νŠΈ κ°œμš”

λ³΅μž‘ν•œ λ ˆμ΄μ•„μ›ƒμ˜ PDF λ¬Έμ„œλ₯Ό μžλ™μœΌλ‘œ μ΄ν•΄ν•˜κ³  κ΅¬μ‘°ν™”λœ Markdown으둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

  • πŸ“ μ •ν™•ν•œ λ ˆμ΄μ•„μ›ƒ 뢄석 β€” YOLO 기반 μš”μ†Œ 감지
  • πŸ”€ κ³ ν’ˆμ§ˆ ν…μŠ€νŠΈ μΆ”μΆœ β€” λ”₯λŸ¬λ‹ OCR
  • 🎨 이미지 μžλ™ 해석 β€” 차트/κ·Έλž˜ν”„ 뢄석
  • 🧠 μ§€λŠ₯ν˜• 읽기 μˆœμ„œ β€” μžμ—°μŠ€λŸ¬μš΄ λ¬Έμ„œ 흐름
  • ⚑ κ³ μ„±λŠ₯ 병렬 처리 β€” ThreadPoolExecutor ν™œμš©

βš™οΈ 핡심 λ©”μ»€λ‹ˆμ¦˜ (5단계)

1️⃣ λ ˆμ΄μ•„μ›ƒ 감지 (Layout Detection)

PDF νŽ˜μ΄μ§€ 이미지 β†’ DocLayout-YOLO β†’ μš”μ†Œ λΆ„λ₯˜ 및 μœ„μΉ˜ νŒŒμ•…

μ—­ν• :

  • 각 νŽ˜μ΄μ§€μ—μ„œ μ˜λ―ΈμžˆλŠ” λͺ¨λ“  μš”μ†Œ μžλ™ 감지
  • 감지 μš”μ†Œ: 제λͺ©, λ³Έλ¬Έ, ν‘œ, 차트, 이미지, 주석, μΊ‘μ…˜ λ“±
  • 각 μš”μ†Œμ˜ Bounding Box(μ’Œν‘œ), νƒ€μž…, 신뒰도 μ‚°μΆœ

좜λ ₯ μ˜ˆμ‹œ:

{
  "type": "figure",
  "bbox": {"left": 100, "top": 200, "right": 500, "bottom": 400},
  "confidence": 0.95
}

2️⃣ 읽기 μˆœμ„œ μΆ”λ‘  (Reading Order)

κ°μ§€λœ μš”μ†Œ μœ„μΉ˜ β†’ K-means 컬럼 ν΄λŸ¬μŠ€ν„°λ§ β†’ μžμ—°μŠ€λŸ¬μš΄ μˆœμ„œ κ²°μ •

μ•Œκ³ λ¦¬μ¦˜:

  1. Yμ’Œν‘œ 기반 ν΄λŸ¬μŠ€ν„°λ§ β€” ν–‰(row) μžλ™ 감지
  2. ν–‰ λ‚΄ μ •λ ¬ β€” Xμ’Œν‘œλ‘œ μ’Œβ†’μš° μ •λ ¬
  3. ν–‰ κ°„ μ •λ ¬ β€” μœ„β†’μ•„λž˜ μˆœμ„œ ν™•μ •

닀단 λ ˆμ΄μ•„μ›ƒ 처리:

μ‹ λ¬Έ/μž‘μ§€ 2단 λ ˆμ΄μ•„μ›ƒ:
[μ™Όμͺ½ 상단] β†’ [였λ₯Έμͺ½ 상단] β†’ [μ™Όμͺ½ ν•˜λ‹¨] β†’ [였λ₯Έμͺ½ ν•˜λ‹¨]

3️⃣ ν…μŠ€νŠΈ μΆ”μΆœ (OCR)

이미지 μ˜μ—­ β†’ DeepSeek-OCR (Ollama) β†’ 고정확도 ν…μŠ€νŠΈ

νŠΉμ§•:

  • ν•œκΈ€/영문 ν˜Όν•© λ¬Έμ„œ μ™„λ²½ 지원
  • ν• λ£¨μ‹œλ„€μ΄μ…˜ 필터링 β€” λΆ€μ •ν™•ν•œ OCR κ²°κ³Ό μžλ™ 제거
  • 포맷 μœ μ§€ β€” ν‘œ, μ½”λ“œ 블둝 λ“± λ§ˆν¬λ‹€μš΄ 포맷 보쑴

4️⃣ μ‹œκ° μ½˜ν…μΈ  해석 (VLM)

차트/κ·Έλž˜ν”„ 이미지 β†’ Gemma3/Qwen3-VL β†’ μžλ™ 해석 및 μš”μ•½

뢄석 ν•­λͺ©:

  • μš”μ•½ β€” μ΄λ―Έμ§€μ˜ 핡심 λ‚΄μš© μš”μ•½
  • 핡심 포인트 β€” μ£Όμš” 수치 및 νŠΈλ Œλ“œ
  • μ£Όμ˜μ‚¬ν•­ β€” νŠΉλ³„νžˆ μ£Όλͺ©ν•  점

좜λ ₯ ꡬ쑰:

- μš”μ•½: κΈ€λ‘œλ²Œ μΈν”Œλ ˆμ΄μ…˜μ€ 2022λ…„ 정점을 찍은 ν›„ ν•˜λ½ μΆ”μ„Έ...
- 핡심:
  1. 2022λ…„ 8% 초과
  2. 2024λ…„ 3% μˆ˜μ€€ μ˜ˆμƒ
- 주의: λ―Έκ΅­ μ •μ±… λ³€ν™” μ£Όμ‹œ ν•„μš”

5️⃣ 병렬 처리 (Parallel Execution)

μ—¬λŸ¬ μš”μ†Œμ˜ OCR/VLM μž‘μ—… β†’ ThreadPoolExecutor둜 λ™μ‹œ μ‹€ν–‰

μ„Έ κ°€μ§€ μ‹€ν–‰ λͺ¨λ“œ:

λͺ¨λ“œ νŠΉμ§• μ‚¬μš© μ‹œμ 
Parallel λͺ¨λ“  OCR/VLM λ™μ‹œ μ‹€ν–‰ 고속 처리 ν•„μš”, μΆ©λΆ„ν•œ λ©”λͺ¨λ¦¬
Grouped OCR μ™„λ£Œ ν›„ VLM λ©”λͺ¨λ¦¬ νš¨μœ¨μ„± μš°μ„ 
Interleaved μš”μ†Œλ³„ OCRβ†’VLM 순차 κ· ν˜•μž‘νžŒ μ„±λŠ₯

πŸš€ 핡심 κΈ°λŠ₯ μš”μ•½

βœ… μ •ν™•ν•œ λ ˆμ΄μ•„μ›ƒ 뢄석 β€” DocLayout-YOLO둜 ν…Œμ΄λΈ”, ν…μŠ€νŠΈ, 차트, 이미지 μžλ™ 감지 βœ… κ³ ν’ˆμ§ˆ OCR β€” DeepSeek-OCR (Ollama) 기반 ν•œκΈ€/영문 ν˜Όν•© λ¬Έμ„œ 지원 βœ… μ§€λŠ₯ν˜• VLM 해석 β€” Gemma3/Qwen3-VL둜 μ°¨νŠΈΒ·κ·Έλ¦ΌΒ·λ„ν‘œ μžλ™ 뢄석 및 μš”μ•½ βœ… μžμ—°μŠ€λŸ¬μš΄ 읽기 μˆœμ„œ β€” K-means 기반 닀단 λ ˆμ΄μ•„μ›ƒ 처리 βœ… κ³ μ„±λŠ₯ 병렬 처리 β€” ThreadPoolExecutor둜 OCR/VLM μž‘μ—… λ™μ‹œ μ‹€ν–‰


πŸ“Š 전체 처리 흐름

PDF 파일
  β”‚
  β”œβ”€β–Ί [Step 1] PDF λ Œλ”λ§
  β”‚   └─ pypdfium2둜 νŽ˜μ΄μ§€ 이미지 생성
  β”‚   └─ ν…μŠ€νŠΈ λ ˆμ΄μ–΄ μΆ”μΆœ
  β”‚
  β”œβ”€β–Ί [Step 2] λ ˆμ΄μ•„μ›ƒ 감지
  β”‚   └─ DocLayout-YOLO둜 μš”μ†Œ 감지
  β”‚   └─ BBox + νƒ€μž… + 신뒰도 μ‚°μΆœ
  β”‚
  β”œβ”€β–Ί [Step 3] 감지 κ²°κ³Ό 필터링
  β”‚   └─ 신뒰도 μž„κ³„κ°’ 필터링
  β”‚   └─ IoU 기반 쀑볡 제거
  β”‚
  β”œβ”€β–Ί [Step 4] 읽기 μˆœμ„œ μΆ”λ‘ 
  β”‚   └─ K-means ν΄λŸ¬μŠ€ν„°λ§
  β”‚   └─ μžμ—°μŠ€λŸ¬μš΄ μˆœμ„œ κ²°μ •
  β”‚
  β”œβ”€β–Ί [Step 5] OCR/VLM 처리 (병렬/순차)
  β”‚   β”œβ”€ OCR: ν…μŠ€νŠΈ μ˜μ—­ μΆ”μΆœ
  β”‚   β”œβ”€ VLM: 이미지 뢄석
  β”‚   └─ Ollama μ„œλ²„ 호좜
  β”‚
  β”œβ”€β–Ί [Step 6] ν…μŠ€νŠΈ μ •μ œ
  β”‚   └─ ν• λ£¨μ‹œλ„€μ΄μ…˜ 필터링
  β”‚   └─ HTML β†’ Markdown λ³€ν™˜
  β”‚
  └─► [Step 7] 좜λ ₯ 생성
      β”œβ”€ out.md (λ§ˆν¬λ‹€μš΄)
      β”œβ”€ out.meta.json (메타데이터)
      β”œβ”€ pages/ (λ Œλ”λ§ 이미지)
      β”œβ”€ crops/ (VLM용 이미지)
      └─ detections/ (감지 κ²°κ³Ό μ‹œκ°ν™”)

πŸ“‹ μ‹€μ œ 처리 μ˜ˆμ‹œ

λ ˆμ΄μ•„μ›ƒ 감지 κ²°κ³Ό

DocLayout-YOLOκ°€ PDF νŽ˜μ΄μ§€μ—μ„œ μžλ™μœΌλ‘œ μš”μ†Œλ₯Ό κ°μ§€ν•œ κ²°κ³Ό:

Detection Example

κ°μ§€λœ μš”μ†Œλ“€:

  • title (0.93) - νŽ˜μ΄μ§€ 제λͺ©
  • plain_text (0.96) - λ³Έλ¬Έ ν…μŠ€νŠΈ
  • figure (0.96, 0.82, 0.81) - 차트/κ·Έλž˜ν”„ μ˜μ—­
  • figure_caption (0.86, 0.68, 0.58) - κ·Έλ¦Ό μΊ‘μ…˜
  • table_footnote (0.82) - 좜처/각주
  • abandon (0.65, 0.93, 0.90) - λ¬΄μ‹œν•  μ˜μ—­ (둜고, νŽ˜μ΄μ§€ 번호 λ“±)

VLM 차트 해석

κΈ€λ‘œλ²Œ μΈν”Œλ ˆμ΄μ…˜ 좔이 차트

Inflation Chart

VLM 해석 κ²°κ³Ό:

- μš”μ•½: κΈ€λ‘œλ²Œ μΈν”Œλ ˆμ΄μ…˜μ€ 2022λ…„ 정점을 찍은 ν›„ λ‘”ν™” 좔세이며, 
       2025λ…„κΉŒμ§€ ν•˜ν–₯ μ•ˆμ •ν™”λ  κ²ƒμœΌλ‘œ μ „λ§λ©λ‹ˆλ‹€.
- 핡심:
    1. 2022λ…„ κΈ€λ‘œλ²Œ μΈν”Œλ ˆμ΄μ…˜μ€ 8%λ₯Ό λ„˜λŠ” μ΅œκ³ μ μ„ 기둝
    2. 2024λ…„ 이후 μΈν”Œλ ˆμ΄μ…˜μ€ 3% μˆ˜μ€€μœΌλ‘œ ν•˜λ½ μ˜ˆμƒ
    3. μ•„μ‹œμ•„ μ‹ ν₯κ΅­ > 유럽 μ‹ ν₯κ΅­ > κΈ€λ‘œλ²Œ 순으둜 μΈν”Œλ ˆμ΄μ…˜ μˆ˜μ€€
- 주의: 2025λ…„ 미ꡭ의 μ •μ±… λ³€ν™”κ°€ μ£Όμš”κ΅­ κ²½μ œμ— 영ν–₯ κ°€λŠ₯

μ£Όμš”κ΅­ κ²½μ œμ„±μž₯λ₯  전망 차트

GDP Chart

VLM 해석 κ²°κ³Ό:

- μš”μ•½: 2025λ…„ κΈ€λ‘œλ²Œ 경제 μ„±μž₯λ₯ μ€ μ£Όμš”κ΅­μ˜ 톡상정책 λ³€ν™” λŒ€μ‘μ— 따라 
       차별화될 κ²ƒμœΌλ‘œ μ˜ˆμƒλ©λ‹ˆλ‹€.
- 핡심:
    - 쀑ꡭ: 5.2% β†’ 4.8% β†’ 4.5% (ν•˜λ½ μΆ”μ„Έ)
    - λ―Έκ΅­: 2.9% β†’ 2.8% β†’ 2.2%
    - ν•œκ΅­: 1.4% β†’ 2.2% β†’ 2.0%
- 주의: ꡭ가별 κ²½μ œμ„±μž₯ μ „λ§μΉ˜μ— 큰 차이 쑴재

μ΅œμ’… Markdown 좜λ ₯ (일뢀)

# Parsed Document

## Page 8

κΈ€λ‘œλ²Œ 경제 β€” '25λ…„ κΈ€λ‘œλ²Œ μ €μ„±μž₯Β·μΈν”Œλ ˆ ν•˜ν–₯ μ•ˆμ •ν™” κ΅­λ©΄ 속 λ―Έκ΅­ μ˜ˆμ™Έμ£Όμ˜

'24λ…„ μ—°μ΄ˆ 전망 λŒ€λΉ„ λ―Έκ΅­κ³Ό 쀑ꡭ 경제 κ±΄μ‘°ν•œ μ„±μž₯μ„Έ μ‹œν˜„ν•˜λ©΄ μ „λ°˜μ μœΌλ‘œ 
μΈν”Œλ ˆμ΄μ…˜ ν•˜ν–₯ μ•ˆμ •ν™”. '25λ…„ λ―Έκ΅­ μ˜ˆμ™Έμ£Όμ˜κ°€ μ˜ˆμƒλ˜λŠ” 반면 μ£Όμš”κ΅­ κ²½μ œλŠ” 
κΈ€λ‘œλ²Œ λ¬΄μ—­ν™˜κ²½ 변화와 톡화정책 λΆˆν™•μ‹€μ„±μ— λŒ€ν•œ λŒ€μ‘λ ₯에 λ”°λ₯Έ 차별화 전망

## κΈ€λ‘œλ²Œ μΈν”Œλ ˆμ΄μ…˜ 좔이 및 전망

![figure](crops/page_0008_elem_005.jpg)

**이미지 해석:**
- μš”μ•½: κΈ€λ‘œλ²Œ μΈν”Œλ ˆμ΄μ…˜μ€ 2022λ…„ 정점을 찍은 ν›„ λ‘”ν™” μΆ”μ„Έ...
- 핡심: ...
- 주의: ...

πŸ—οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

μ»΄ν¬λ„ŒνŠΈ 관계도

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       ollamaparser                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                β”‚
β”‚  Input Layer:                                                 β”‚
β”‚  β”œβ”€ pdf_render.py      ──► Pages β†’ Images                    β”‚
β”‚  β”œβ”€ detectors.py       ──► Layout Detection                  β”‚
β”‚  └─ detection_filter.py ──► Filter & Clean                   β”‚
β”‚                                                                β”‚
β”‚  Processing Layer:                                            β”‚
β”‚  β”œβ”€ layout_order.py     ──► Reading Order (K-means)          β”‚
β”‚  β”œβ”€ ocr_vlm.py          ──► Task Execution (Parallel/Seq)   β”‚
β”‚  └─ providers/          ──► Ollama Integration               β”‚
β”‚                                                                β”‚
β”‚  Output Layer:                                                β”‚
β”‚  β”œβ”€ text_clean.py       ──► Clean Text                       β”‚
β”‚  β”œβ”€ markdown_writer.py  ──► Generate Markdown               β”‚
β”‚  └─ metadata.py         ──► Generate Metadata               β”‚
β”‚                                                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

데이터 흐름

PDF File
  ↓ [pdf_render.py]
  └─→ PageAsset[] {image, text, size}
       ↓ [detectors.py]
       └─→ DetectedElement[] {bbox, type, confidence}
            ↓ [detection_filter.py]
            └─→ Filtered Elements {confidence > threshold}
                 ↓ [layout_order.py]
                 └─→ Sorted Elements {reading order}
                      ↓ [ocr_vlm.py]
                      β”œβ”€β†’ OCR Results {text}
                      └─→ VLM Results {interpretation}
                           ↓ [text_clean.py]
                           └─→ Cleaned Text
                                ↓ [markdown_writer.py]
                                └─→ out.md, out.meta.json

πŸ“ λͺ¨λ“ˆλ³„ 상세 μ„€λͺ…

1️⃣ 핡심 νƒ€μž… μ •μ˜

파일 μ—­ν• 
types.py PageAsset β€” λ Œλ”λ§λœ νŽ˜μ΄μ§€ (이미지 경둜, 크기, ν…μŠ€νŠΈ)
layout_types.py BBox, DetectedElement β€” 감지 κ²°κ³Ό (μ’Œν‘œ, νƒ€μž…, 신뒰도)

2️⃣ PDF 처리

파일 μ—­ν•  κΈ°λŠ₯
pdf_render.py λ Œλ”λ§ PDFium 기반 고해상도 이미지 λ³€ν™˜

ν”„λ‘œμ„ΈμŠ€:

render_pdf_pages(pdf_path, dpi=150)
β”œβ”€ 각 νŽ˜μ΄μ§€λ₯Ό μ΄λ―Έμ§€λ‘œ λ³€ν™˜
β”œβ”€ ν…μŠ€νŠΈ λ ˆμ΄μ–΄ μΆ”μΆœ (κ°€λŠ₯ν•œ 경우)
└─ PageAsset[] λ°˜ν™˜

3️⃣ λ ˆμ΄μ•„μ›ƒ 감지

파일 μ—­ν•  κΈ°λŠ₯
detectors.py 감지 DocLayout-YOLO 기반 μš”μ†Œ 감지
detection_filter.py 필터링 IoU 쀑볡 제거, 신뒰도 필터링

필터링 μ•Œκ³ λ¦¬μ¦˜:

1. 신뒰도 필터링 (confidence < threshold 제거)
2. IoU 기반 쀑볡 제거 (κ²ΉμΉ¨ > threshold μ‹œ 높은 μ‹ λ’°λ„λ§Œ μœ μ§€)
3. μ£Όλ³€ μ»¨ν…μŠ€νŠΈ μΆ”μΆœ (VLM μž…λ ₯용)

4️⃣ 읽기 μˆœμ„œ μΆ”λ‘ 

파일 μ—­ν• 
layout_order.py K-means 기반 ν–‰ ν΄λŸ¬μŠ€ν„°λ§ 및 μˆœμ„œ κ²°μ •

μ•Œκ³ λ¦¬μ¦˜:

1단계: Yμ’Œν‘œ β†’ K-means ν΄λŸ¬μŠ€ν„°λ§ (ν–‰ κ·Έλ£Ήν™”)
2단계: 각 ν–‰ λ‚΄ Xμ’Œν‘œ μ •λ ¬ (μ’Œβ†’μš°)
3단계: ν–‰ κ°„ μˆœμ„œ ν™•μ • (μœ„β†’μ•„λž˜)

5️⃣ OCR/VLM μ‹€ν–‰

파일 μ—­ν• 
ocr_vlm.py TaskExecutor β€” 병렬/순차 μž‘μ—… μ‹€ν–‰

μ‹€ν–‰ λͺ¨λ“œ:

- execute_parallel()  ──► λͺ¨λ“  μž‘μ—… λ™μ‹œ μ‹€ν–‰ (빠름)
- execute_sequential() ──► OCRβ†’VLM 순차 (λ©”λͺ¨λ¦¬ 효율)
- execute_interleaved() ──► μš”μ†Œλ³„ 순차 (κ· ν˜•)

6️⃣ 제곡자 (Providers)

파일 μ—­ν• 
providers/base.py Protocol μ •μ˜ (OCRModel, VisionLanguageModel)
providers/ollama/client.py Ollama HTTP ν΄λΌμ΄μ–ΈνŠΈ
providers/ollama/ocr.py OCR κ΅¬ν˜„ (DeepSeek-OCR 지원)
providers/ollama/vlm.py VLM κ΅¬ν˜„ (Gemma3/Qwen3-VL 지원)

Ollama 톡신:

Python Client β†’ HTTP /api/generate β†’ Ollama Server
                                    β”œβ”€ deepseek-ocr (OCR_MODEL)
                                    β”œβ”€ gemma3:27b (VLM_MODEL)
                                    └─ qwen3-vl:30b (VLM_MODEL)

λͺ¨λΈ ꡬ성:

  • OCR_MODEL ν™˜κ²½ λ³€μˆ˜λ‘œ OCR λͺ¨λΈ λ³€κ²½ κ°€λŠ₯
  • VLM_MODEL ν™˜κ²½ λ³€μˆ˜λ‘œ VLM λͺ¨λΈ λ³€κ²½ κ°€λŠ₯
  • .env νŒŒμΌμ—μ„œ κΈ°λ³Έκ°’ μ„€μ • κ°€λŠ₯

7️⃣ ν›„μ²˜λ¦¬

파일 μ—­ν• 
text_clean.py ν…μŠ€νŠΈ μ •μ œ (ν• λ£¨μ‹œλ„€μ΄μ…˜ ν•„ν„°, HTMLβ†’MD)
quality_check.py ν’ˆμ§ˆ 뢄석 (κ²ΉμΉ¨, 빈 μ˜μ—­ λ“±)

8️⃣ 좜λ ₯ 생성

파일 μ—­ν• 
markdown_writer.py Markdown λΉŒλ” (final/debug μŠ€νƒ€μΌ)
metadata.py 메타데이터 JSON 생성

πŸ”§ μ„€μΉ˜

# κΈ°λ³Έ μ„€μΉ˜
uv sync

# DocLayout-YOLO 포함 μ„€μΉ˜
uv sync --extra detector

μš”κ΅¬μ‚¬ν•­

  • Python 3.10+
  • Ollama (둜컬 LLM μ„œλ²„)
# Ollama λͺ¨λΈ λ‹€μš΄λ‘œλ“œ
ollama pull deepseek-ocr
ollama pull gemma3:27b
# λ˜λŠ”
ollama pull qwen3-vl:30b

ν™˜κ²½ μ„€μ • (.env)

ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— .env νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ λͺ¨λΈμ„ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€:

# .env 파일 μ˜ˆμ‹œ
OCR_MODEL=deepseek-ocr:latest
VLM_MODEL=gemma3:27b
OLLAMA_HOST=http://localhost:11434

ν™˜κ²½ λ³€μˆ˜:

  • OCR_MODEL: OCR에 μ‚¬μš©ν•  λͺ¨λΈ (κΈ°λ³Έκ°’: deepseek-ocr:latest)
  • VLM_MODEL: VLM에 μ‚¬μš©ν•  λͺ¨λΈ (κΈ°λ³Έκ°’: gemma3:27b)
  • OLLAMA_HOST: Ollama μ„œλ²„ μ£Όμ†Œ (κΈ°λ³Έκ°’: http://localhost:11434)

λͺ¨λΈ λ³€κ²½ μ˜ˆμ‹œ:

# λ‹€λ₯Έ OCR λͺ¨λΈ μ‚¬μš©
OCR_MODEL=custom-ocr:v2 uv run ollamaparser-parse --pdf document.pdf --out_dir ./output

# λ‹€λ₯Έ VLM λͺ¨λΈ μ‚¬μš©
VLM_MODEL=qwen3-vl:30b uv run ollamaparser-parse --pdf document.pdf --out_dir ./output

# 원격 Ollama μ„œλ²„ μ‚¬μš©
OLLAMA_HOST=http://192.168.1.100:11434 uv run ollamaparser-parse --pdf document.pdf --out_dir ./output

πŸ’» μ‚¬μš©λ²•

κΈ°λ³Έ μ‹€ν–‰

uv run ollamaparser-parse \
  --pdf "document.pdf" \
  --out_dir ./output \
  --detector doclayout-yolo \
  --yolo-weights "juliozhao/DocLayout-YOLO-DocStructBench" \
  --yolo-from-pretrained \
  --ocr-provider deepseek-ollama \
  --ocr-scope elements \
  --vlm-provider ollama-vlm \
  --vlm-scope visuals \
  --execution-mode parallel

μ£Όμš” μ˜΅μ…˜

Detector μ˜΅μ…˜

μ˜΅μ…˜ μ„€λͺ…
--detector doclayout-yolo / pdfium-text / fallback
--yolo-weights YOLO κ°€μ€‘μΉ˜ 경둜 λ˜λŠ” HF repo_id
--yolo-from-pretrained HuggingFaceμ—μ„œ κ°€μ€‘μΉ˜ λ‹€μš΄λ‘œλ“œ
--save-detections 감지 κ²°κ³Ό 이미지/JSON μ €μž₯

OCR μ˜΅μ…˜

μ˜΅μ…˜ μ„€λͺ…
--ocr-provider none / deepseek-ollama
--ocr-scope none / page / elements
--ocr-mode markdown / free
--figure-ocr κ·Έλ¦Ό μ˜μ—­λ„ OCR μˆ˜ν–‰

VLM μ˜΅μ…˜

μ˜΅μ…˜ μ„€λͺ…
--vlm-provider none / ollama-vlm
--vlm-scope none / page / visuals
--ollama-vlm-model gemma3:27b / qwen3-vl:30b
--vlm-use-image VLM에 이미지 전달
--figure-vlm κ·Έλ¦Ό μ˜μ—­ VLM 해석

μ‹€ν–‰ λͺ¨λ“œ

μ˜΅μ…˜ μ„€λͺ…
--execution-mode grouped / interleaved / parallel
--parallel-workers 병렬 μ›Œμ»€ 수 (κΈ°λ³Έ: 4)

좜λ ₯ μ˜΅μ…˜

μ˜΅μ…˜ μ„€λͺ…
--md-style final (깔끔) / debug (bbox 포함)
--metadata/--no-metadata 메타데이터 JSON 생성 μ—¬λΆ€

πŸ“‚ 좜λ ₯ ꡬ쑰

output/
β”œβ”€β”€ pages/                    # λ Œλ”λ§λœ νŽ˜μ΄μ§€ 이미지
β”‚   β”œβ”€β”€ page_0001.png
β”‚   └── page_0002.png
β”œβ”€β”€ crops/                    # VLM용 크둭 이미지
β”‚   β”œβ”€β”€ page_0001_elem_005.jpg
β”‚   └── page_0002_elem_012.jpg
β”œβ”€β”€ detections/               # 감지 κ²°κ³Ό (--save-detections)
β”‚   β”œβ”€β”€ page_0001.jpg         # λ°”μš΄λ”©λ°•μŠ€ μ˜€λ²„λ ˆμ΄
β”‚   └── page_0001.json        # κ°μ§€λœ μš”μ†Œ JSON
β”œβ”€β”€ out.md                    # μ΅œμ’… Markdown 좜λ ₯
β”œβ”€β”€ out.meta.json             # 메타데이터 (선택)
└── run.log                   # μ‹€ν–‰ 둜그

πŸ“¦ μ˜μ‘΄μ„±

Core

  • pypdfium2 - PDF λ Œλ”λ§
  • pillow - 이미지 처리
  • typer - CLI ν”„λ ˆμž„μ›Œν¬
  • pydantic - 데이터 검증
  • requests - Ollama API 호좜
  • scikit-learn - K-means ν΄λŸ¬μŠ€ν„°λ§

Optional (detector)

  • doclayout-yolo - DocLayout-YOLO SDK
  • huggingface-hub - λͺ¨λΈ λ‹€μš΄λ‘œλ“œ

πŸ“ λΌμ΄μ„ μŠ€

MIT License

ollama-document-parser

About

No description, website, or topics provided.

Resources

Stars

13 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors