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

OCR, script, and navigation penalties apply at every text length, including short fragments — there is no length threshold below which they are skipped.

Tests quality scoring produces a score value in [0.0, 1.0]

Python
import asyncio
from xberg import extract, ExtractInput, ExtractInputKind
from xberg._xberg import ExtractionConfig
async def main() -> None:
input = ExtractInput(kind=ExtractInputKind("uri"), uri="https://example.com/pdf/fake_memo.pdf")
config = ExtractionConfig.from_json("{\"enable_quality_processing\":true}")
result = await extract(input, config)
print(result.results[0].quality_score)
asyncio.run(main())

Tests quality scoring produces a score value in [0.0, 1.0]

Python
import asyncio
from xberg import extract, ExtractInput, ExtractInputKind
from xberg._xberg import ExtractionConfig
async def main() -> None:
input = ExtractInput(kind=ExtractInputKind("uri"), uri="https://example.com/pdf/fake_memo.pdf")
config = ExtractionConfig.from_json("{\"enable_quality_processing\":true}")
result = await extract(input, config)
print(result.results[0].quality_score)
asyncio.run(main())