Building a High-Volume OCR Ingestion Flow for Recurring Research and Quote Feeds
Design a resilient OCR ingestion flow for daily research and quote feeds with dedupe, queues, retries, and quality gates.
Building a High-Volume OCR Ingestion Flow for Recurring Research and Quote Feeds
When your source set refreshes daily, the problem is rarely “can we OCR this one PDF?” The real problem is building a production-grade AI factory that can ingest repetitive document sources, detect what changed, extract text reliably, and do it again tomorrow without duplicates, backlog explosions, or quality regressions. That is especially true for market research pages, quote feeds, and other recurring publications where content is similar day over day, but small edits matter. In this guide, we’ll design an OCR pipeline architecture for high-volume ingestion with deduplication, queue processing, retry logic, batch OCR, and quality gates built for operational durability. We’ll also ground the discussion in practical patterns used by teams that manage volatile, repetitive updates similar to daily market reports and quote pages.
Source material such as recurring market snapshots and quote pages often looks “lightweight” to humans, but it creates disproportionate operational complexity for data systems. A page may keep the same URL while the body changes in one paragraph, a price field updates, a disclaimer shifts, or a table gains a new row. That means simple crawling is not enough; you need document feed processing that understands versioning, content fingerprints, processing states, and downstream freshness requirements. For a companion perspective on resilient change handling, see how daily recaps build habit in recurring content systems and templates for covering market shocks with repeatable workflows.
1) Why recurring research and quote feeds need a different OCR design
High repetition changes the bottleneck
In single-document OCR, the core challenge is extraction quality. In recurring ingestion, the bottleneck is orchestration. You are not just recognizing text; you are deciding whether to process a page again, how to prioritize it, and whether its output is materially different from yesterday’s. This is where throughput optimization and feed-awareness matter more than brute-force OCR capacity. If you don’t account for recurrence, you will burn compute on duplicates, increase storage costs, and create noisy downstream analytics.
In practice, these feeds behave like a continuously updated data product, similar to what teams see in scalable ETL patterns for document-derived analytics. The right mental model is not a one-time document upload, but a versioned event stream. Each fetch can produce a new revision, and each revision should move through the pipeline exactly once unless a retry or correction is needed. That means your architecture must keep the original source URL, a normalized content hash, a fetch timestamp, a processing status, and a downstream version identifier.
OCR alone is not enough for feed processing
Recurring research pages often contain a mix of machine-rendered HTML, embedded charts, screenshots, and PDFs. If you rely only on OCR for the entire pipeline, you are using a sledgehammer where a scalpel is better. A better design combines HTML parsing, PDF text extraction, image OCR, and quality scoring. This hybrid approach reduces OCR load and improves accuracy by reserving OCR for rasterized or image-heavy content only. It also makes the system cheaper to run at scale because you are not OCRing text that is already available digitally.
This is where strong integration patterns matter. A useful framing is the decision process from build-vs-buy architecture decisions: buy the commodity extraction capability, but build your feed-specific orchestration, dedupe rules, and quality policy around it. If your team already ships systems with strict contracts, the article on data contracts and quality gates is a useful parallel for defining acceptable input, output, and failure modes.
Operational risk compounds with market-sensitive content
For market pages and quote feeds, stale or duplicated data can create bad decisions quickly. A missing update in a daily market research digest may break dashboards, alerting, or trading workflows. That is why feed ingestion should be treated like an operational system with reliability targets, not a background scraper. Latency, freshness, and repeatability matter just as much as extraction accuracy. A page that updates daily but arrives six hours late can be less useful than a slightly less accurate page that arrives on time and is corrected downstream.
Pro Tip: For recurring feeds, define “fresh enough” and “correct enough” separately. Freshness is a pipeline SLA; correctness is a quality SLA. Mixing them leads to bad tradeoffs.
2) Reference architecture: from fetch to normalized document
Source discovery and change detection
The first stage is a source registry. Each feed source should have a canonical URL, a fetch cadence, a source type, and a change-detection policy. For recurring pages, use a combination of HTTP metadata checks, page-level content hashing, and structural fingerprinting. Structural fingerprints are especially useful when layout changes slightly but the semantic content remains similar. If the feed is quote-like or table-driven, you want to detect row-level changes rather than reprocessing every minor HTML variation.
After fetch, create a normalized artifact. Strip noisy chrome, normalize whitespace, standardize dates, and extract image assets. For documents that combine text and visual elements, store both the raw version and the normalized render. This improves auditability and lets you compare the output of different OCR passes later. Teams doing recurring reporting often benefit from lessons in claim verification using open data because the same principle applies: preserve provenance and normalize before you decide.
Queue-first processing and idempotent jobs
Once a new revision is identified, publish a job to a queue rather than calling OCR inline. Queueing gives you backpressure control, retry isolation, and horizontal scaling. Each job should be idempotent, meaning the same job can be executed multiple times without duplicating results. A strong idempotency key usually includes source ID, version hash, and OCR strategy version. Without this, retries can produce duplicate records or inconsistent outputs, which is deadly in high-volume ingestion.
For teams already using cloud-native platforms, the article on automation platforms for faster operations is a useful reminder that orchestration wins when you clearly separate triggers, workers, and approvals. In OCR systems, the worker should never have to guess whether a document is “new enough” to process. That decision belongs upstream, at the event or scheduler layer. This separation makes the entire data pipeline easier to reason about during incident response.
OCR execution and post-processing
Run OCR in batches when possible, but keep batch size bounded by latency and memory constraints. Batch OCR can dramatically improve throughput if your workload consists of many small pages or images with similar preprocessing steps. However, a batch that is too large will increase tail latency and make retries expensive. A practical approach is micro-batching: group jobs that share the same model settings, source type, or language profile, then dispatch them to a worker pool. This is one of the most effective patterns for scalable extraction.
Post-processing should include language normalization, token cleanup, table reconstruction, and confidence scoring. Never assume OCR output is final just because it is returned by the engine. For repetitive research feeds, you often care more about preserving the exact numeric fields, dates, and headings than about producing perfectly formatted prose. That means domain-specific parsing rules should sit directly after OCR. For pricing and cost-aware scaling guidance, see FinOps thinking for cloud systems and cost-conscious AI hosting options.
3) Deduplication strategy: prevent the same document from being processed twice
Three layers of dedupe
Deduplication should happen at three layers: source-level, revision-level, and record-level. Source-level dedupe ensures the same URL doesn’t enter the system twice due to scheduling overlap. Revision-level dedupe ensures the same content hash is not reprocessed if the page was fetched repeatedly without any meaningful changes. Record-level dedupe removes duplicated outputs when OCR reveals the same text through multiple paths, such as HTML parsing and image OCR. This layered approach is more robust than a single hash check because recurrence is messy in real-world feeds.
Revision hashes should be built from normalized content, not raw bytes. If you hash raw HTML, you will trigger false positives from trivial changes like tracking parameters, timestamps, or whitespace. If you hash only OCR text, you may miss layout changes that matter to downstream parsing. The better answer is a composite fingerprint: normalized visible text, asset signatures, structural layout markers, and a source-specific canonicalization rule. That gives you a much better signal for document feed processing and version tracking.
Deduping market research pages and quote feeds
Recurring market pages often resemble the Yahoo quote examples in the source set: a stable URL pattern, a predictable page title, and a body that may change daily. In such feeds, the right dedupe strategy usually begins with page fingerprinting and ends with semantic diffing. If only the headline or a key numeric value changed, you can store a new revision but avoid re-OCRing unchanged sections. That can reduce compute usage significantly at scale. If the page is entirely unchanged, skip the OCR worker and mark the job as a no-op.
For daily market intelligence content, this behavior is similar to recurring reporting workflows discussed in dashboards that drive action. The practical lesson is that repeated inputs should lead to selective updates, not full recomputation. When your feed contains thousands of pages, that difference becomes the line between a stable ingestion system and an expensive, noisy one. It also improves observability because meaningful changes stand out in your event stream.
Record identity and downstream joins
Deduplication is not only an OCR concern; it is a data modeling concern. Every extracted entity, table row, or quote metric should have its own identity strategy. If you later join OCR output to market history, analytics, or notifications, you need stable keys. That usually means source ID plus revision ID plus record type. Without stable keys, you’ll struggle to reconcile updates, corrections, and historical snapshots. For teams using analytics catalogs, the article on automating data discovery offers a useful mental model for making data assets discoverable and traceable.
| Layer | Goal | Technique | Failure Mode Prevented |
|---|---|---|---|
| Source-level | Prevent duplicate jobs | Scheduler locks, idempotency keys | Double-processing the same URL |
| Revision-level | Skip unchanged content | Normalized content hash | Wasted OCR compute |
| Semantic-level | Detect meaningful edits | Structure-aware diffing | Missing real updates |
| Record-level | Prevent duplicate entities | Stable record IDs | Duplicate rows in downstream tables |
| Audit-level | Support traceability | Immutable processing log | Unexplainable output changes |
4) Queue processing and retry logic that won’t melt under load
Use queues to isolate failure domains
A queue is not just a buffer; it is a control plane. It lets you absorb spikes, spread load across workers, and isolate failures when one source or file type misbehaves. In a high-volume ingestion flow, queues should separate fetch jobs, normalization jobs, OCR jobs, and validation jobs. This creates a clean boundary between concerns and helps you scale each stage independently. It also means a burst in source discovery won’t immediately overwhelm OCR workers.
A good queue design should support priorities. Daily market research pages with tight freshness requirements can be assigned higher priority than archival or long-tail sources. Likewise, pages with expiring content windows should skip the line ahead of lower-value updates. This is especially helpful in environments where OCR compute is limited or billed per minute. For broader architecture inspiration, see why smaller distributed infrastructure can improve resilience and lessons from distributed test environments.
Retry logic needs categories, not just counts
Retries should be classified by failure type. A network timeout should retry quickly with jitter. A corrupt PDF may need a fallback path. A confidence failure should not be retried blindly unless a different model or preprocessing route is available. “Retry 3 times” is not a strategy; it is a symptom of missing error taxonomy. Smart retry logic reduces wasted work and protects your queue from poison messages.
For OCR pipelines, the best practice is to separate transient failures from deterministic failures. Transient failures include rate limits, temporary service unavailability, and worker crashes. Deterministic failures include unreadable images, unsupported encodings, and source-side blocks. Transient failures get exponential backoff and requeue; deterministic failures go to a dead-letter queue with enough metadata for triage. Teams building resilient systems can borrow patterns from real-time monitoring toolkits because the underlying problem is similar: rapid detection and fast response to a changing environment.
Dead-letter queues are a feature, not a failure
Dead-letter queues are where you preserve exceptional cases for human review or secondary automation. Do not delete these jobs after repeated failures. They are a goldmine for improving model selection, preprocessing, and source rules. For example, if a specific research site always fails because it embeds text in low-resolution images, you can add a site-specific preprocessing step or route it to a different OCR model. That is how mature ingestion systems improve over time: they learn from the edge cases.
If your organization is serious about operational maturity, the article on auditing signed document repositories is a useful parallel for exception handling and traceability. The same discipline applies here: every failure must be explainable, timestamped, and recoverable. That is how you make high-volume systems auditable enough for enterprise buyers and internal stakeholders.
5) Quality checks and extraction confidence scoring
Quality gates should happen before downstream writes
Quality checks are your defense against silent corruption. At minimum, validate that extracted content has expected sections, non-empty key fields, and reasonable length. For numeric feeds, enforce range checks and formatting checks. For research pages, compare the structure against a source template and flag anomalies when headings disappear or tables shrink unexpectedly. These checks should run before data reaches the canonical store so bad payloads do not contaminate production tables.
Quality gates are most effective when they combine deterministic and probabilistic signals. Deterministic rules catch hard failures such as missing values or invalid date formats. Probabilistic scores capture OCR confidence, text density, and structural consistency across revisions. Together, they give you a far better view than raw OCR confidence alone. This is particularly important in recurring feeds because a low-confidence page may still be usable if only one small field changed, while a high-confidence page may still be wrong if it was fetched from the wrong source.
Confidence thresholds should be source-specific
One threshold does not fit all sources. A clean PDF from a research publisher may deserve a stricter threshold than a noisy screenshot from a market quote page. Likewise, some feeds are better treated as “human review required” when confidence falls below a certain bar, while others can be automatically accepted if only non-critical fields are uncertain. Build per-source policies and revise them based on observed error rates. That is how you balance speed and reliability in a real data pipeline.
For operational guidance on balancing security and change, the article on secure AI development reinforces a useful principle: controls should be specific, testable, and proportional to risk. Do not over-control low-risk content. Do not under-control content that drives decisions. In feed ingestion, the “risk” is often the business cost of a wrong extraction multiplied by volume.
Human-in-the-loop is a scaling tool
Human review is often described as a fallback, but in high-volume environments it is really a calibration mechanism. A small review queue can help you tune thresholds, compare OCR engine outputs, and build better source rules. The key is to make review targeted: only send ambiguous records, not the whole corpus. This preserves throughput while improving accuracy where it matters most. Over time, review feedback becomes training data for source-specific improvements.
Pro Tip: Track “manual review avoided” as a KPI. If quality gates improve enough to cut review volume by 30%, that is a direct operational win, not just a model metric.
6) Throughput optimization: how to scale without losing accuracy
Separate compute-heavy and I/O-heavy stages
One of the most common mistakes in OCR pipeline architecture is running fetch, render, preprocess, OCR, and parse inside the same worker. That creates resource contention and makes scaling impossible to reason about. Instead, split the pipeline into stages with distinct compute profiles. Fetchers are I/O bound, renderers are mixed, OCR workers are CPU/GPU bound, and validators are usually light. When each stage has its own queue and autoscaling rule, throughput becomes much easier to tune.
This design also helps cost control. If OCR is your expensive stage, you want to minimize the number of documents that reach it. Use cheap filters first: MIME type checks, HTML extraction, image heuristics, and duplicate detection. Only after these filters should a document be sent into batch OCR. That pattern is one reason scalable systems often feel deceptively simple: the expensive step is used surgically, not indiscriminately. The article on cost visibility and FinOps is relevant here because throughput optimization is really spend optimization.
Micro-batching, concurrency, and backpressure
Micro-batching is the sweet spot for many recurring feed systems. It gives you some of the efficiency of large batches without the latency and retry penalties of monolithic jobs. Concurrency should be tuned by source profile and worker memory, not by a generic global value. If some documents are image-heavy and others are text-light, they should not compete for the same worker pool. Backpressure should be explicit so your queue can slow intake when downstream systems saturate.
As your volume grows, monitor end-to-end metrics: documents per minute, median and p95 processing time, queue depth, retry rate, dedupe hit rate, and validation failure rate. These are not vanity metrics; they tell you where the bottleneck lives. If queue depth is rising while OCR latency is stable, your fetch rate may be too high. If retry rate is rising, you may have a source-specific failure cluster. If dedupe hit rate is high, your scheduler may be polling too aggressively. You can’t optimize what you don’t instrument.
Benchmarking should reflect real feed behavior
Benchmarks for recurring feeds should not use only clean PDFs. Include screenshots, partially rendered pages, pages with tiny edits, and malformed documents. Real source behavior is messy. A useful benchmark suite should measure OCR accuracy, processing cost per page, retry overhead, and duplicate suppression effectiveness. If you only benchmark on pristine documents, your architecture will look strong until it encounters the actual feed. That’s why production-ready benchmarking should mirror source entropy.
For broader message framing and operational transparency, the piece on visible leadership and trust offers a useful parallel: the best systems make their decisions legible. In OCR pipelines, that means logs, traces, diff snapshots, and quality explanations should be easy to inspect when something goes wrong.
7) Data modeling for recurring document feeds
Store raw, normalized, and extracted layers
Recurring document systems should never store only the final text output. Keep at least three layers: raw source capture, normalized render, and extracted structured output. Raw capture is your forensic record. Normalized render is what the OCR system actually saw. Structured output is what downstream consumers use. When a discrepancy appears, you can compare layers to determine whether the problem came from the source, the renderer, the OCR engine, or the parser.
This layered storage model also makes reprocessing possible. If your OCR engine improves, you can re-run normalized renders without refetching the source. If a parsing bug is fixed, you can regenerate structured records from the same OCR text. That is a major operational advantage in high-volume ingestion, because it avoids repeated network fetches and simplifies replay. It also supports vendor changes and model upgrades without rebuilding the entire pipeline from scratch.
Versioning is not optional
Version every stage: source version, render version, OCR model version, parser version, and validation rules version. Without versioning, you cannot explain why output changed between runs. Versioning also supports A/B testing of OCR engines and preprocessing methods. If one source performs better with a different binarization setting or language model, you can route it deliberately rather than globally. This is a practical way to improve extraction quality without introducing chaos.
Version-aware systems are also easier to audit. Teams working with sensitive or regulated document flows should read the security questions to ask before approving a scanning vendor because vendor due diligence often comes down to traceability, access control, and data handling. Even if your feed content is public, your processing pipeline should still follow the same enterprise discipline.
Analytics-ready output structure
Downstream consumers usually want more than free text. They want rows, fields, sentiment tags, dates, prices, or quotes. Design your extracted schema to support incremental updates, not only full reloads. Include source identifiers, timestamps, confidence scores, and change markers. If you are feeding dashboards or alerts, downstream consumers need to know what changed and why, not just the final text. This approach is consistent with the ideas in dashboard design that drives action: the output should guide decisions, not merely archive content.
8) Security, privacy, and compliance in a recurring ingestion flow
Minimize sensitive exposure
Even when content is public, the pipeline can still process sensitive metadata, user agents, IPs, access tokens, or licensed data feeds. Apply least privilege, isolate source credentials, and encrypt stored artifacts. Keep raw captures in restricted buckets and expose only necessary derivatives to downstream systems. Privacy-first design is not just for regulated industries; it is a practical way to reduce blast radius if a feed or worker is compromised.
Access control should be tied to roles, not ad hoc sharing. Fetchers need source access, OCR workers need artifact access, analysts need extracted output, and auditors need read-only logs. Avoid giving every service the same permissions. That reduces the chance that a bug or misconfiguration leaks data across layers. For a related governance lens, see IP ownership considerations in content workflows.
Retention and deletion policies matter
Recurring systems create a lot of historical data. Define retention windows for raw artifacts, normalized renditions, OCR outputs, and logs. Keep what you need for debugging, compliance, and replay; delete what you do not. Because the system is high-volume, storage costs can silently grow faster than compute costs. A policy-based retention strategy is much easier to operate than manual cleanup.
Auditability is part of product quality
For commercial buyers, trust depends on explainability. If a customer asks how a quote changed or why a research page was reprocessed, you need an answer. That means immutable logs, processing timestamps, dedupe traces, and lineage metadata. If you can reconstruct a document’s journey through the pipeline, you will handle support issues and compliance reviews much faster. This is one reason operational data compliance is not a separate concern from ingestion quality; it is part of the same system.
9) Example implementation pattern for a daily research feed
Step 1: Discover and fingerprint
Suppose you ingest 1,000 daily research pages. A scheduler checks each URL, fetches the page, and computes a normalized fingerprint. If the fingerprint matches yesterday’s version, the page is skipped. If not, the page is queued for render and extraction. This alone can eliminate a large fraction of unnecessary OCR work. The key is that the fingerprinting step is cheap enough to run at high frequency.
Step 2: Route by content type
Next, the pipeline inspects the page. If the page has extractable HTML text, use parser-first extraction. If it contains charts or embedded screenshots, send those assets to OCR. If it contains a PDF attachment, extract text directly where possible and OCR only scanned pages. This hybrid routing can dramatically reduce total compute time and improve accuracy. It also makes the system easier to scale because each content type follows a tailored path.
Step 3: Validate, store, and notify
After extraction, run quality checks. Validate critical fields, compare against the previous version, and compute change summaries. Store the raw artifact, normalized render, OCR text, and structured output. If the page changed materially, publish a downstream event to analytics or alerting systems. If it failed quality checks, route it to a review queue with context. This is the architecture that turns a fragile scraper into a reliable ingestion product.
To sharpen the decision-making side of the system, borrow from AI-discovery optimization and audit-to-brief workflows: capture signals, summarize deltas, and package the result for the next consumer. In your case, the “consumer” may be an analyst, an alerting engine, or a pricing model.
10) Production checklist and operating model
What to measure every day
Daily operating metrics should include source fetch success rate, dedupe hit rate, OCR throughput, p95 latency, retry rate, dead-letter count, quality pass rate, and downstream freshness lag. These indicators give you a complete view of the ingestion system’s health. If any one metric changes sharply, you can usually infer where the issue lies. This is the difference between reactive firefighting and managed operations.
How to scale safely
Scale by increasing queue capacity and worker pools only after confirming that your dedupe and validation stages are stable. Scaling a broken pipeline simply increases the rate at which it fails. Before widening concurrency, replay a sample of real documents and verify that output fidelity holds. If you are adding new sources, onboard them gradually and compare error rates against established feeds. This controlled rollout model is similar to other disciplined production systems discussed in production hookup patterns and safe queue-backed agent memory workflows.
How to keep costs predictable
Predictable cost comes from selective OCR, deduplication, micro-batching, and retention discipline. The best high-volume systems do less work, not more. If a page can be skipped, skip it. If a page can be parsed without OCR, do that first. If a result can be validated automatically, do not send it to human review. Every avoided compute cycle lowers cost and raises capacity headroom. This is the core of throughput optimization in practice.
FAQ
How do I know if a page should be re-OCRed?
Compare the normalized content fingerprint, not just the URL or timestamp. If the visible text or structural layout changed meaningfully, reprocess it. If only metadata or whitespace changed, skip OCR and keep the previous extracted result. For recurring feeds, version-aware fingerprinting is the safest approach.
Should I use OCR on every document in the feed?
No. Use a hybrid pipeline. Parse HTML and embedded text first, then apply OCR only to rasterized sections, screenshots, and scanned PDFs. This reduces cost, improves throughput, and often improves accuracy because OCR is reserved for the content that truly needs it.
What is the best retry strategy for OCR jobs?
Use failure-type-specific retries. Transient network or service errors should be retried with exponential backoff and jitter. Deterministic failures should go to a dead-letter queue. Avoid blind retries on corrupt files or unsupported formats, because they waste queue capacity and hide the real issue.
How do I prevent duplicate extracted records downstream?
Use stable record IDs that combine source ID, revision ID, and record type. Also dedupe at the revision level before OCR and at the record level after extraction. This layered approach prevents both duplicate processing and duplicate storage.
What metrics matter most for high-volume ingestion?
Monitor freshness lag, queue depth, dedupe hit rate, OCR throughput, retry rate, validation pass rate, and p95 processing latency. These metrics tell you whether the system is keeping up, whether it is wasting compute, and whether the extracted data is trustworthy enough to publish.
How do I handle low-confidence OCR output?
Apply source-specific thresholds and route ambiguous records to human review or secondary processing. Do not accept all low-confidence output, and do not reject all of it either. The right policy depends on the business impact of errors and the type of content being processed.
Conclusion: treat recurring ingestion as a product, not a script
The difference between a brittle OCR script and a production ingestion system is architecture. High-volume recurring feeds require a design that assumes repetition, partial change, and operational noise. That means source fingerprints, idempotent jobs, queue isolation, smart retry logic, layered deduplication, and quality gates before downstream writes. It also means measuring freshness, accuracy, and cost as first-class outcomes rather than afterthoughts. If you build for recurrence, your system gets faster and cheaper over time instead of slower and more fragile.
For teams evaluating the next step, the most useful mindset is to treat the pipeline as a continuously improving product. Add source-specific rules where the data demands it, keep your audit trail complete, and iterate on throughput only after quality is stable. For more guidance on adjacent design patterns, see user-centric application design, cost and speed evaluation frameworks, and vendor security evaluation checklists. Those principles, applied rigorously, are what turn OCR ingestion into durable infrastructure.
Related Reading
- OCR Pipeline Architecture for Production Teams - A deeper look at workers, queues, and rendering stages.
- Deduplication Strategies for Document Feed Processing - Learn how to suppress duplicate revisions safely.
- Batch OCR Throughput Optimization - Practical tuning tips for micro-batching and concurrency.
- Retry Logic and Dead-Letter Queues - Build resilient failure handling for noisy sources.
- Quality Gates for Extraction Workflows - Define validation rules that block bad data before it ships.
Related Topics
Avery Coleman
Senior SEO Content Strategist
Senior editor and content strategist. Writing about technology, design, and the future of digital media. Follow along for deep dives into the industry's moving parts.
Up Next
More stories handpicked for you
Compliance Patterns for OCR Pipelines Handling Regulatory and Proprietary Market Research
How to Build a Scalable Document Capture Pipeline for Multi-Region Teams
Parsing Financial Quote Pages at Scale: OCR vs HTML Scraping for Repeated Option Chain Documents
How to Build a Market-Intelligence OCR Pipeline for Specialty Chemical Reports
Designing a Document Workflow for Regulated Life Sciences Teams
From Our Network
Trending stories across our publication group