ssingh22/reddit-subreddit-nsfw-classification
Reddit Subreddit NSFW Classification A subreddit-level NSFW / SFW / borderline classification of 67,120 subreddits, built for responsible, ethical, and reproducible social-science research on Reddit. This dataset is released as part of the Accelerating Social Science with Agents and Responsible Research Using Reddit initiative. The goal of the initiative is to leverage Reddit and other social datasets for responsible and ethical social science, and we will release a series of… See the full description on the dataset page: https://huggingface.co/datasets/ssingh22/reddit-subreddit-nsfw-classification.
Reddit Subreddit NSFW Classification
A subreddit-level NSFW / SFW / borderline classification of 67,120 subreddits, built for responsible, ethical, and reproducible social-science research on Reddit.
This dataset is released as part of the Accelerating Social Science with Agents and Responsible Research Using Reddit initiative. The goal of the initiative is to leverage Reddit and other social datasets for responsible and ethical social science, and we will release a series of such datasets under this listing. This particular release identifies and cleans out primarily NSFW-oriented subreddits so that downstream corpora can either (a) filter them out, or (b) explicitly and deliberately study them.
Reference date: the classification reflects Reddit as of the 2025-01 subreddit metadata crawl combined with the full Reddit post archives (post-level over_18 flags) analyzed on 2026-07-20. Subreddit status on Reddit (bans, activity, NSFW self-labeling) changes over time; treat this as a snapshot.
Why this dataset
Large-scale studies and preregistered experiments on Reddit require a defensible, transparent, and reusable decision about which communities are in scope. Ad-hoc, per-project NSFW filtering is neither reproducible nor auditable. This dataset provides a single, documented, citable filtering decision for every analyzed subreddit, so that both human researchers and autonomous agents can:
- filter out primarily-NSFW communities before building a study corpus,
- or intentionally include them when the research question is about NSFW, adult, or fringe communities,
- and cite a fixed, reproducible list in a preregistration.
We remove content at the subreddit level, never the post level: a subreddit is either kept in full (including any incidental NSFW posts) or removed entirely. This keeps within-community context intact for legitimate topics that carry some incidental NSFW content (e.g. medical, harm-reduction, gaming).
Dataset structure
One row per analyzed subreddit. The data is split into three files by NSFW band (sfw, borderline, nsfw); the borderline split additionally carries the guideline / manual review verdict.
Note that classification is the content signal (the observed NSFW-post ratio band), while final_decision is the action. They can differ: a low-NSFW subreddit can still be removed if it is dead/insignificant (no_meta_discard), and a borderline subreddit can be keept if its NSFW content is incidental to a legitimate non-sexual topic.
Loading
from datasets import load_dataset
ds = load_dataset("<namespace>/<dataset-name>")
sfw = ds["sfw"] # kept-outright communities
borderline = ds["borderline"] # reviewed against the guidelines
nsfw = ds["nsfw"] # primarily-NSFW communities (removed)
# communities safe to keep for a study corpus
keep = [r["subreddit"] for split in ds.values() for r in split if r["final_decision"] == "keep"]Filtering methodology
The pipeline runs in stages. Every subreddit ends in exactly one decision_stage.
Stage 0 - post-level analysis. Every post in the Reddit archive is scanned and its over_18 flag counted per subreddit, yielding a per-subreddit NSFW post ratio. 2,449,502,948 posts across 38,727 subreddits were scanned; the overall over_18 ratio is 22.09%.
Stage 1 - subreddits absent from the 2025-01 crawl ("no-meta"). Some archived subreddits have no metadata in the crawl (banned, brand-new, or renamed). These are judged from the archive alone: a sub needs >= 100 posts and a last post on/after 2023-01-01 to proceed; otherwise it is discarded as dead/insignificant (no_meta_discard).
Stage 2 - NSFW ratio bands. Using thresholds t_low = 0.20 and t_high = 0.70:
nsfw_ratio < 0.20-> sfw, kept outright (ratio_keep).nsfw_ratio >= 0.70-> nsfw, removed outright as primarily NSFW (ratio_purge).0.20 <= nsfw_ratio < 0.70-> borderline, sent to Stages 3-4.
Stage 3 - borderline auto-purge. A borderline sub is auto-removed (borderline_auto_purge) if it is insignificant (subscribers < 5000 and posts < 1000) or inactive (last post before 2023-01-01). These would never be useful for a study regardless of topic.
Stage 4 - borderline guideline review. The remaining borderline subs are judged against the purge guidelines. The core policy: over_18 conflates two different things - (1) sexual/adult content, which we remove, and (2) incidental graphic content (surgery, gore, injury, drugs, game art), which is not a reason to remove. A borderline sub is kept only if its NSFW is incidental to a legitimate non-sexual topic; otherwise it is removed.
- KEEP (incidental NSFW): medical / health / body-health; drugs / harm-reduction / drug-culture; mental-health / recovery / support; gaming / hobby with genuinely incidental game art at a modest ratio; non-sexual controversy / news / edgy-meme communities where the flag is gore/crude text, not sex.
- PURGE (sexual purpose or unwanted): explicit fetish / adult / porn; celebrity/attractiveness "ogling"; dating / r4r / hookup / personals; NSFW-heavy roleplay; sexual-adjacent challenge subs; adult-art marketplaces; AI-generated NSFW imagery; toxic/harmful subs where the harm is the content; insignificant subs.
An automated pass (apply_guidelines.py) assigns each borderline sub a topic by keyword on its name and metadata title. The default for borderline is PURGE; it is flipped to KEEP only on a clear incidental-topic signal with no sexual signal. Anything ambiguous (both signals, or no signal) is routed to needs_eyeball for human/agent review (final_decision = review). Human/agent review decisions are recorded as manual overrides that take precedence over the keyword logic. Ecchi/fanservice anime with a high NSFW ratio is purged - "anime" is not a free pass; "survivor"/"support" title matches are overridden for toxic/edgy subs.
Update (2026-08-12): fresh 2025-06/2026-06 sample for previously-uncovered over18 subs
The original crawl classified 38,727 subreddits. Of the Reddit over18=True subreddits it left uncovered, this update samples up to 5,000 posts/sub from the 2025-06 and 2026-06 monthly post archives (combined) and measures the actual over_18 ratio, using the same t_low=0.20 / t_high=0.70 thresholds as Stage 2 above:
ratio > 0.70-> nsfw / remove (fresh_sample_ratio_purge).0.20 <= ratio <= 0.70-> borderline, default keep (fresh_sample_review_default_keep) — flagged viareview_reason, butfinal_decision = keep(unlike Stage 4'sreview, this is a live default, not a held-for-eyeball state).ratio < 0.20(with>= 20samples) -> sfw / keep (fresh_sample_ratio_keep).< 20samples -> left uncovered (no signal; most of the long tail).
This adds 28,393 subreddits with a real verdict (dataset total now 67,120). See DatasetDiscovery `scripts/filtering/` for the reproducing code (build_nsfw_list.py, publish_nsfw_dataset.py) and docs/dataset_rebuild.md §3.0/§7.7/§7.5 for the full writeup. Current totals — keep: 31,192, remove: 35,559, review: 369.
Companion dataset: per-subreddit activity/retention statistics (comment/post volume, distinct authors, retention gate) are in `ssingh22/reddit-activity`.
Statistics
Classification bands (content signal):
Final decisions (action):
Decision stage breakdown:
Borderline review outcomes (741 subs): KEEP 107 | PURGE 210 | EYEBALL (review) 369 | auto-decided 55.
Per-subreddit NSFW-ratio histogram (all 38,727 subs):
Top NSFW subreddits by NSFW post volume (all removed): JerkOffChat, GaySnapchatImages, GaySnapchatShare, HentaiAndRoleplayy, onlyfansgirls101, GOONED, KinkTown, OnlyFans101, DirtyChatPals, ... (see the nsfw split).
Intended uses
- Preregistered experiments & large-scale social studies on Reddit. Cite this fixed list to define, transparently and reproducibly, which communities are in or out of scope.
- Corpus cleaning. Filter
final_decision == "remove"(orclassification == "nsfw") before building a general-purpose Reddit corpus. - Deliberate study of NSFW / fringe communities. Use the
nsfwsplit (or thereview_reasontopics) to explicitly select adult, fetish, or edgy communities when that is the object of study. - Agentic research. Autonomous research agents can consume this as a ready-made, auditable filtering decision when constructing study populations.
Limitations and biases
- Snapshot in time. Reflects the 2025-01 metadata crawl and post archives analyzed 2026-07-20; subreddit status changes over time.
- `over_18` is coarse. Reddit's post-level
over_18flag conflates sexual content with incidental graphic content; the guidelines mitigate but do not eliminate this. Some residual NSFW remains inside kept subreddits. - Keyword-based borderline routing can mislabel; 369 borderline subs are left as
reviewprecisely because automation was not confident. - Subreddit-level granularity. Kept communities may contain individual NSFW posts; removed communities may contain non-NSFW posts.
- English-centric. Metadata language and keyword lists are English-oriented.
License
Research-only. This dataset is released for non-commercial academic and research use as part of the Accelerating Social Science with Agents and Responsible Research Using Reddit initiative. It contains only subreddit-level metadata and aggregate statistics (no post text or personal data). By using it you agree to use it for responsible, ethical research and to cite the sources below. Reddit content remains subject to Reddit's own terms and user rights.
Citation
If you use the NSFW subreddit list / classification, please cite:
@article{gupta2026accelerating,
title={Accelerating Social Science Research via Agentic Hypothesization and Experimentation},
author={Gupta, Jishu Sen and SI, Harini and Singh, Somesh Kumar and Tawseeq, Syed Mohamad and Singla, Yaman Kumar and Doermann, David and Shah, Rajiv Ratn and Krishnamurthy, Balaji},
journal={arXiv preprint arXiv:2602.07983},
year={2026}
}If you use the HyperLogLog inactivity / activity list (and related per-subreddit user/temporal statistics), please cite:
@article{si2026zipp,
title={ZIPP: Zero-shot Image Personalization from Personas},
author={SI, Harini and Singh, Somesh and Singla, Yaman Kumar and Doermann, David and Shah, Rajiv Ratn},
journal={arXiv preprint arXiv:2606.08841},
year={2026}
}Acknowledgements
Part of the Accelerating Social Science with Agents and Responsible Research Using Reddit initiative. More datasets will be released under this listing.
