textpress

textpress is an R toolkit for building text corpora and searching them -- no custom object classes, just plain data frames from start to finish. It collects URLs from durable sources -- RSS and Atom feeds, Wikipedia and its citations, or URLs you already have -- then reads, processes, and searches the resulting text through a consistent four-step API: Fetch, Read, Process, Search.


Installation

From CRAN:

install.packages("textpress")

Development version:

remotes::install_github("jaytimm/textpress")

A source-to-corpus example

Select a small set of known publishers, retrieve their recent feed entries, then read the linked pages. read_urls() retains the RSS discovery metadata.

feeds <- textpress::rss_local_rags |>
  subset(state_abbr == "NM") |>
  head(2)

articles <- textpress::fetch_rss(feeds$url)
corpus <- textpress::read_urls(articles)

corpus$text
corpus$meta

There are three ways into the same pipeline:

Starting point Entry point Best for
Known publishers rss_politics or rss_local_rags -> fetch_rss() Recent, source-led collections
A topic fetch_wiki_urls() -> fetch_wiki_refs() Topic- and citation-led discovery
Existing URLs read_urls() directly Curated or externally collected corpora

Each route converges on read_urls() -> nlp_*() -> search_*().


The textpress API

Conventions: corpus is a data frame with a text column plus identifier column(s) passed to by (default doc_id). All outputs are plain data frames or data.tables; pipe-friendly.

1. Fetch (fetch_*)

Collect URLs and provenance from stable sources -- not full article text. textpress does not provide general-purpose live web search. Pass fetch results to read_urls() to retrieve their content.

2. Read (read_*)

Scrape and parse URLs into a structured corpus.

3. Process (nlp_*)

Prepare text for search or indexing.

4. Search (search_*)

Four retrieval modes over the same corpus. Data-first, pipe-friendly.

Function Query type Use case
search_regex(corpus, query) Regex pattern Specific strings, KWIC with inline highlighting.
search_dict(corpus, terms) Term vector Exact phrases and MWEs; built-in dict_generations, dict_political.
search_index(index, query) Keywords BM25 ranked retrieval over a token index.
search_vector(embeddings, query) Numeric vector Semantic nearest-neighbor search; use util_fetch_embeddings() to embed.

RAG & LLM pipelines

textpress is designed to compose cleanly into retrieval-augmented generation pipelines.

Hybrid retrieval -- run search_index() and search_vector() over the same chunks, then merge with reciprocal rank fusion (RRF).

Context assembly -- nlp_roll_chunks() with context_size > 0 gives each chunk a focal sentence plus surrounding context, so retrieved passages are self-contained when passed to an LLM.

Because the stages exchange plain data frames, their outputs can also be inspected, filtered, saved, or passed to an LLM without conversion to a custom corpus class.


Vignettes


License

MIT © Jason Timm

Citation

citation("textpress")

Issues

Report bugs or request features at https://github.com/jaytimm/textpress/issues