mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-30 04:40:16 +00:00
- Added grid‑card layouts, icons, and admonitions to all reference pages - Removed all mkdocstrings ::: directives that caused alias‑resolution errors - Fixed export module alias issue (RDFExporter) by cleaning the docs - Updated README‑style sections for better readability - Added a PowerShell helper script (remove_mkdocstrings.ps1) for future clean‑ups
372 lines
7.4 KiB
Markdown
372 lines
7.4 KiB
Markdown
# Parse Module
|
|
|
|
The `parse` module provides comprehensive document parsing capabilities for extracting content, metadata, and structure from various file formats.
|
|
|
|
## Overview
|
|
|
|
- **Document Parsing**: PDF, DOCX, XLSX, PPTX, and more
|
|
- **OCR Processing**: Extract text from images and scanned documents
|
|
- **Table Extraction**: Extract tables with structure preservation
|
|
- **Metadata Extraction**: Author, title, dates, and custom metadata
|
|
- **Structure Analysis**: Headings, sections, lists, and document hierarchy
|
|
- **Multi-Format Support**: 50+ file formats with specialized parsers
|
|
|
|
---
|
|
|
|
## Algorithms Used
|
|
|
|
### PDF Parsing
|
|
- **Text Extraction**: PDFMiner algorithm for text layout analysis
|
|
- **OCR**: Tesseract with preprocessing (deskewing, noise reduction)
|
|
- **Table Detection**: Hough transform for line detection + clustering
|
|
- **Layout Analysis**: XY-cut algorithm for reading order determination
|
|
|
|
### OCR Algorithms
|
|
- **Preprocessing**: Otsu's thresholding, morphological operations
|
|
- **Text Detection**: EAST/CRAFT deep learning models
|
|
- **Recognition**: Tesseract LSTM + language models
|
|
- **Post-processing**: Spell correction, confidence filtering
|
|
|
|
### Table Extraction
|
|
- **Rule-based**: Line detection + cell clustering
|
|
- **ML-based**: Deep learning table structure recognition
|
|
- **Hybrid**: Combine rules + ML for robustness
|
|
|
|
---
|
|
|
|
# Parse with options
|
|
docs = parser.parse(
|
|
sources=["documents/"],
|
|
formats=["pdf", "docx", "xlsx"],
|
|
metadata={"source": "company_docs"}
|
|
)
|
|
|
|
# Access parsed data
|
|
for doc in docs:
|
|
print(f"Title: {doc.metadata.get('title')}")
|
|
print(f"Author: {doc.metadata.get('author')}")
|
|
print(f"Pages: {doc.metadata.get('pages')}")
|
|
print(f"Text length: {len(doc.text)} characters")
|
|
```
|
|
|
|
---
|
|
|
|
### PDFParser
|
|
|
|
|
|
**Example Usage:**
|
|
|
|
```python
|
|
from semantica.parse import PDFParser
|
|
|
|
# Basic PDF parsing
|
|
parser = PDFParser()
|
|
doc = parser.parse("document.pdf")
|
|
|
|
# Advanced PDF parsing with OCR
|
|
parser = PDFParser(
|
|
ocr_enabled=True,
|
|
ocr_language="eng",
|
|
extract_tables=True,
|
|
extract_images=True,
|
|
dpi=300
|
|
)
|
|
|
|
doc = parser.parse("scanned_document.pdf")
|
|
|
|
# Access PDF-specific data
|
|
print(f"Pages: {doc.metadata['pages']}")
|
|
print(f"PDF version: {doc.metadata['pdf_version']}")
|
|
print(f"Tables extracted: {len(doc.tables)}")
|
|
|
|
# Access tables
|
|
for i, table in enumerate(doc.tables):
|
|
print(f"Table {i+1}:")
|
|
print(table.to_dataframe())
|
|
```
|
|
|
|
---
|
|
|
|
### DOCXParser
|
|
|
|
|
|
**Example Usage:**
|
|
|
|
```python
|
|
from semantica.parse import DOCXParser
|
|
|
|
# Parse Word document
|
|
parser = DOCXParser()
|
|
doc = parser.parse("document.docx")
|
|
|
|
# With structure preservation
|
|
parser = DOCXParser(
|
|
preserve_structure=True,
|
|
extract_tables=True,
|
|
extract_images=True
|
|
)
|
|
|
|
doc = parser.parse("report.docx")
|
|
|
|
# Access structure
|
|
print(f"Headings: {doc.structure['headings']}")
|
|
print(f"Sections: {len(doc.structure['sections'])}")
|
|
print(f"Tables: {len(doc.tables)}")
|
|
```
|
|
|
|
---
|
|
|
|
### ExcelParser
|
|
|
|
|
|
**Example Usage:**
|
|
|
|
```python
|
|
from semantica.parse import ExcelParser
|
|
|
|
# Parse Excel file
|
|
parser = ExcelParser()
|
|
doc = parser.parse("data.xlsx")
|
|
|
|
# Parse specific sheets
|
|
parser = ExcelParser(
|
|
sheets=["Sheet1", "Data"],
|
|
header_row=0,
|
|
skip_empty_rows=True
|
|
)
|
|
|
|
doc = parser.parse("workbook.xlsx")
|
|
|
|
# Access data
|
|
for sheet_name, df in doc.dataframes.items():
|
|
print(f"Sheet: {sheet_name}")
|
|
print(f"Rows: {len(df)}, Columns: {len(df.columns)}")
|
|
print(df.head())
|
|
```
|
|
|
|
---
|
|
|
|
### HTMLParser
|
|
|
|
|
|
**Example Usage:**
|
|
|
|
```python
|
|
from semantica.parse import HTMLParser
|
|
|
|
# Parse HTML
|
|
parser = HTMLParser()
|
|
doc = parser.parse("page.html")
|
|
|
|
# Advanced parsing
|
|
parser = HTMLParser(
|
|
extract_metadata=True,
|
|
extract_links=True,
|
|
remove_scripts=True,
|
|
remove_styles=True
|
|
)
|
|
|
|
doc = parser.parse("article.html")
|
|
|
|
# Access extracted data
|
|
print(f"Title: {doc.metadata['title']}")
|
|
print(f"Links: {len(doc.links)}")
|
|
print(f"Main content: {doc.main_content}")
|
|
```
|
|
|
|
---
|
|
|
|
### JSONParser
|
|
|
|
|
|
**Example Usage:**
|
|
|
|
```python
|
|
from semantica.parse import JSONParser
|
|
|
|
# Parse JSON
|
|
parser = JSONParser()
|
|
doc = parser.parse("data.json")
|
|
|
|
# Flatten nested JSON
|
|
parser = JSONParser(
|
|
flatten=True,
|
|
separator=".",
|
|
extract_schema=True
|
|
)
|
|
|
|
doc = parser.parse("nested_data.json")
|
|
|
|
# Access schema
|
|
print(f"Schema: {doc.schema}")
|
|
print(f"Flattened keys: {list(doc.flattened_data.keys())}")
|
|
```
|
|
|
|
---
|
|
|
|
### ImageParser
|
|
|
|
|
|
**Example Usage:**
|
|
|
|
```python
|
|
from semantica.parse import ImageParser
|
|
|
|
# Parse image with OCR
|
|
parser = ImageParser(
|
|
ocr_enabled=True,
|
|
ocr_language="eng",
|
|
detect_orientation=True
|
|
)
|
|
|
|
doc = parser.parse("scanned_page.jpg")
|
|
|
|
# Access OCR results
|
|
print(f"Extracted text: {doc.text}")
|
|
print(f"Confidence: {doc.metadata['ocr_confidence']}")
|
|
print(f"Orientation: {doc.metadata['orientation']}")
|
|
```
|
|
|
|
---
|
|
|
|
### CodeParser
|
|
|
|
|
|
**Example Usage:**
|
|
|
|
```python
|
|
from semantica.parse import CodeParser
|
|
|
|
# Parse source code
|
|
parser = CodeParser(
|
|
language="python",
|
|
extract_functions=True,
|
|
extract_classes=True,
|
|
extract_docstrings=True
|
|
)
|
|
|
|
doc = parser.parse("module.py")
|
|
|
|
# Access code structure
|
|
print(f"Functions: {len(doc.functions)}")
|
|
print(f"Classes: {len(doc.classes)}")
|
|
|
|
for func in doc.functions:
|
|
print(f"Function: {func.name}")
|
|
print(f" Parameters: {func.parameters}")
|
|
print(f" Docstring: {func.docstring}")
|
|
```
|
|
|
|
---
|
|
|
|
## Common Patterns
|
|
|
|
### Pattern 1: Batch Parsing
|
|
|
|
```python
|
|
from semantica.parse import DocumentParser
|
|
from pathlib import Path
|
|
|
|
parser = DocumentParser()
|
|
|
|
# Get all files
|
|
files = list(Path("documents/").rglob("*.*"))
|
|
|
|
# Parse in batches
|
|
batch_size = 10
|
|
for i in range(0, len(files), batch_size):
|
|
batch = files[i:i+batch_size]
|
|
docs = parser.parse(batch)
|
|
# Process docs
|
|
```
|
|
|
|
### Pattern 2: Format-Specific Parsing
|
|
|
|
```python
|
|
from semantica.parse import PDFParser, DOCXParser, ExcelParser
|
|
|
|
# Route to appropriate parser
|
|
def parse_document(file_path):
|
|
if file_path.endswith('.pdf'):
|
|
parser = PDFParser(ocr_enabled=True)
|
|
elif file_path.endswith('.docx'):
|
|
parser = DOCXParser(preserve_structure=True)
|
|
elif file_path.endswith('.xlsx'):
|
|
parser = ExcelParser()
|
|
else:
|
|
raise ValueError(f"Unsupported format: {file_path}")
|
|
|
|
return parser.parse(file_path)
|
|
```
|
|
|
|
### Pattern 3: Error Handling
|
|
|
|
```python
|
|
from semantica.parse import DocumentParser, ParseError
|
|
|
|
parser = DocumentParser()
|
|
|
|
successful = []
|
|
failed = []
|
|
|
|
for file_path in file_paths:
|
|
try:
|
|
doc = parser.parse(file_path)
|
|
successful.append(doc)
|
|
except ParseError as e:
|
|
print(f"Failed to parse {file_path}: {e}")
|
|
failed.append((file_path, str(e)))
|
|
|
|
print(f"Parsed: {len(successful)}, Failed: {len(failed)}")
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
```yaml
|
|
# config.yaml - Parse Configuration
|
|
|
|
parse:
|
|
pdf:
|
|
ocr_enabled: true
|
|
ocr_language: eng
|
|
extract_tables: true
|
|
extract_images: true
|
|
dpi: 300
|
|
|
|
docx:
|
|
preserve_structure: true
|
|
extract_tables: true
|
|
extract_images: true
|
|
|
|
excel:
|
|
header_row: 0
|
|
skip_empty_rows: true
|
|
infer_types: true
|
|
|
|
html:
|
|
extract_metadata: true
|
|
extract_links: true
|
|
remove_scripts: true
|
|
remove_styles: true
|
|
|
|
image:
|
|
ocr_enabled: true
|
|
ocr_language: eng
|
|
detect_orientation: true
|
|
|
|
code:
|
|
extract_functions: true
|
|
extract_classes: true
|
|
extract_docstrings: true
|
|
```
|
|
|
|
---
|
|
|
|
## See Also
|
|
|
|
- [Ingest Module](ingest.md) - Data ingestion
|
|
- [Normalize Module](normalize.md) - Data cleaning and normalization
|
|
- [Semantic Extract Module](semantic_extract.md) - Entity and relationship extraction
|