A separate, local dataset of individual posts identified in the preserved GRI website. It includes articles, blog posts, columns, news releases, testimony and multimedia posts, with formats recorded separately. The capture files and existing databases were read without modification. No network requests were used to build this dataset.
Open the searchable article index or Topics over time. This share copy includes all 3,949 index records and their excerpts. Index CSV downloads the fields shown by the browser. Full-text JSONL, SQLite and the original research CSV remain in the local research dataset.
The extraction checks all 6,859 saved HTML responses in capture_2026-09-20/coverage_review/coverage.sqlite3. Individual posts are identified by WordPress's single-post marker and Article/NewsArticle/BlogPosting structured data. An Open Graph article label alone is insufficient: GRI also uses that label on static pages.
The result contains 3,949 distinct posts represented by 3,972 saved responses. The 23 duplicate URL responses are grouped by WordPress post ID. All variants remain in source_responses.csv. Static pages and archive/category/date listings are excluded; all 2,887 exclusions are accounted for in page_classification.csv. One distinct article was outside the seed-only text index previously used for podcast research.
Displayed publication dates range from 2008-12-28 to 2026-09-21. These are the dates in the captured site, not a claim that the organization began publishing in 2008. Deleted pages, uncaptured historical posts and unsaved external media are outside this dataset.
Each article retains its primary coverage-database source ID, original URL, capture timestamp, response reference and extracted-text hash. source_responses.csv retains the archive response hash and all duplicate response references. The extraction verifies archived response integrity using the existing archive reader.
| Field | Meaning |
|---|---|
article_id |
Stable gri- identifier based on the WordPress post ID. |
title, url |
Article heading and normalized canonical URL. |
publication_date |
Publication day shown on the captured page. |
publication_date_basis |
Where the selected day came from. |
displayed_publication_date |
Original visible date text. |
publication_timestamp |
Original publication timestamp, including timezone. |
modified_timestamp |
Separate update timestamp; never used as the publication date. |
authors |
Best supported article attribution: explicit byline, signed contribution, named testimony sender, closing author biography, or site credit. See the attribution basis. |
author_kind |
Whether that attribution identifies a person or remains an organization/series credit. |
author_attribution_basis |
Method supporting the selected attribution. A testimony sender is not proof of who drafted every word. |
site_author_credit |
Unchanged site author field, even when a body byline identifies somebody else. |
body_byline_authors |
Names explicitly printed in opening body bylines. |
testimony_signatories |
Named senders identified in testimony headers or an explicit introductory attribution. |
key_topics |
Up to five principal topic labels from site categories and full-text rules, with targeted review corrections. |
topic_method |
Automated classification or targeted agent review of saved text. |
key_terms |
Up to six corpus-weighted words/phrases extracted from the title/body; these may include names. |
site_categories, site_keywords |
Original website taxonomy, separately preserved. |
content_formats |
Article/column, testimony, news release, multimedia, etc.; format is separate from topic. |
original_publication_notes |
Explicit republication notices retained as source text. These may refer to an earlier publication elsewhere. |
dateline_notes |
Dated release/testimony text, separately retained rather than substituted for the site's publication date. |
body_text, word_count |
Extracted article prose. Full text is in JSONL and SQLite, not the main CSV. |
same_text_article_ids |
Other distinct posts with identical extracted prose of at least 30 words. These remain separate records because reused testimony can be published for different hearings. |
review_flags |
Attribution, date, topic or body-text issues requiring attention. |
CSV list fields use | delimiters. JSONL and SQLite retain those fields as JSON arrays. Blank metadata is not filled with guessed values.
The body byline takes precedence over a site upload credit. For example, the Jamie Story interview is attributed to Mark Coleman, while GRI's institutional site credit remains recorded. Explicit republication introductions recover additional writers. A small number of articles identify their contributor through a closing biography; those cases remain flagged and their attribution method is explicit.
article_authors.csv keeps each observed credit, its role, the exact supporting excerpt and whether it was selected for the main record. Named testimony senders remain distinguishable from bylined authors. Speakers, interview subjects, quoted experts and authors of reports merely discussed in a post are not automatically made authors of that post.
authors.csv groups spelling variants through conservative punctuation/case/credential normalization. It is an attribution index, not a fully resolved person registry: it does not automatically equate different first names or merge uncertain identities.
The date visible to readers is the primary publication date. The structured publication timestamp is retained alongside it. Some timestamps fall on a different day when converted to Honolulu time; those discrepancies are flagged, not silently resolved. Original publication notices and release datelines can also differ from the website publication date.
All article bodies are processed locally. The baseline classification maps GRI's substantive categories to topics and applies a documented vocabulary to the title and full text. Title hits and site categories receive greater weight than passing body mentions. Format labels such as “Multimedia” and “President's Corner” are not themselves substantive topics.
topics.json contains the baseline vocabulary. article_topics.csv retains the selected topic, score, site category, matched terms and a body excerpt. Scores rank lexical evidence; they are not calibrated probabilities. A short description that supplies only weak topical signals receives a low_signal_topic flag. review_overrides.json records targeted corrections after reading problematic source text, including author attributions and topics. This is automated corpus classification with targeted review, not a claim that every topic label has been individually reviewed.
The separate key_terms field uses local TF-IDF weighting over literal words and adjacent word pairs. It provides a more specific search aid alongside the broader topic labels; it is not a generated summary.
Embedded audio, video and image contents have not been transcribed or interpreted. An article with no substantive saved prose can still have a title, date and site author. Where neither text nor metadata establishes a topic, it remains unassigned and flagged.
| File | Contents |
|---|---|
articles.csv |
One row per individual post, for spreadsheet use. |
articles.jsonl |
Same records with arrays, full article text and structured provenance. |
articles.sqlite3 |
Main table plus authors, topics, provenance, classification and review tables; full-text search in article_search. |
article_authors.csv |
Author/credit evidence and role distinctions. |
authors.csv |
Normalized attribution index and article counts. |
article_topics.csv |
Topic assignments and their evidence. |
source_responses.csv |
Every included archive response and its article ID. |
page_classification.csv |
Disposition of every saved HTML response, including exclusions. |
review_queue.csv |
One row per issue, so an article can appear more than once. An organizational credit is not an extraction failure. |
summary.json |
Exact counts, yearly totals, methods and quality flags. |
validation.json |
Results of dataset integrity and selected metadata checks. |
extracted_pages.jsonl |
Intermediate extraction cache of every saved HTML response. |
index.html |
Offline searchable metadata browser with article excerpts. |
Requires Python 3, lxml, the preserved capture folder and its existing coverage_review/audit.py. No model service, API key or network access is required.
python3 article_dataset/extract_pages.py
python3 article_dataset/build_dataset.py
python3 article_dataset/validate_dataset.py
python3 article_dataset/build_browser.py
The first command can be skipped when the extraction cache is unchanged. Rebuilding replaces only generated files in article_dataset/.
Example SQLite queries:
SELECT title, publication_date, authors, key_topics
FROM articles
WHERE publication_date BETWEEN '2009-01-01' AND '2009-12-31';
SELECT a.title, a.publication_date, t.topic, t.method
FROM articles a JOIN article_topics t USING(article_id)
WHERE t.topic = 'Think-tank and advocacy networks';
SELECT a.title, a.url
FROM article_search s JOIN articles a USING(article_id)
WHERE article_search MATCH '"Atlas Network"';