Skip to content

Quality Processing

Score extracted text on a 0.0–1.0 scale, where 1.0 is highest quality. Scoring starts from 1.0 for clean prose: OCR, script, and navigation noise subtract penalties, while document structure and metadata add bonuses. The result is clamped to [0.0, 1.0]. Empty text scores 0.0; text shorter than 10 characters scores 0.1.

Factor Max weight Effect Detects
OCR Artifacts 30% Penalty Scattered chars, repeated punctuation, malformed words
Script Content 20% Penalty JavaScript, CSS, HTML tags
Navigation Elements 10% Penalty Breadcrumbs, pagination, skip links
Document Structure 20% Bonus Sentence/paragraph length, punctuation distribution
Metadata Quality 10% Bonus Title, author, subject, description, keywords

Script and navigation penalties apply only to text longer than 1000 characters; shorter text is scored on OCR artifacts and structure alone.

Python
import asyncio
from xberg import ExtractInput, ExtractionConfig, extract
async def main() -> None:
config: ExtractionConfig = ExtractionConfig(
enable_quality_processing=True
)
result = await extract(ExtractInput.from_uri("document.pdf"), config)
quality_score: float = result.quality_score or 0.0
print(f"Quality score: {quality_score:.2f}")
asyncio.run(main())
Python
from xberg import ExtractInput, extract, ExtractionConfig
config = ExtractionConfig(enable_quality_processing=True)
result = extract(ExtractInput.from_uri("scanned_document.pdf"), config)
quality_score = result.quality_score or 0.0
if quality_score < 0.5:
print(f"Warning: Low quality extraction ({quality_score:.2f})")
print("Consider re-scanning with higher DPI or adjusting OCR settings")
else:
print(f"Quality score: {quality_score:.2f}")