A heavily cleaned, English-only, genre-filtered subset of the Genius Song Lyrics with Language Information Kaggle dataset. Reduced from 9+ GB to 2.56 GB through language filtering, genre filtering, artifact removal, and deduplication. Optimized for language model fine-tuning, lyric generation, and music NLP research.
No train/validation/test splitsThis dataset ships as a single train split. You should create validation and test splits appropriate to downstream task
Overview
The raw Genius dataset contains millions of song entries across dozens of languages, genres, and quality levels — including non-music content like poetry, book excerpts, and miscellaneous text tagged as misc. This cleaned version retains only English-language songs from verified music genres, with lyrics scrubbed of Genius UI artifacts, HTML residue, and duplicates. The result is a high-signal corpus suitable for causal language model pretraining or supervised fine-tuning on lyric generation tasks.
.th { font-family: Fira Code, Consolas, monospace; font-size: 13px; font-weight: 700; fill: #e6edf3; } .td-label { font-family: Fira Code, Consolas, monospace; font-size: 12px; fill: #e6edf3; } .td-value { font-family: Fira Code, Consolas, monospace; font-size: 12px; fill: #e6edf3; } Metric Value Total rows 3,179,588 Dataset size ~4.51 GB Download size ~2.38 GB Split train only Path data/train-* num_bytes 4847179321 num_examples 3179588 task_categories text-generation task_ids anguage-modeling size_categories 1M<n<10M
Cleaning Pipeline
The following steps were applied in order:
- Language filter — Retained only rows where
language == 'en', removing all non-English entries. - Genre filter — Dropped the
misctag (which contains books, poems, speeches, and other non-music content). Retained only the 15 confirmed music genre tags listed below. - Artifact removal — Applied regex cleaning to remove:
- Genius embed counters (e.g.,
1234Embedat end of lyrics) - UI strings like
"See [Artist] Live","Get tickets","You might also like" - Residual HTML tags (
<...>)
- Genius embed counters (e.g.,
- Section header normalization — Simplified attributed headers:
[Chorus: Cam'ron & Jay-Z]→[Chorus], preserving verse structure while removing contributor meta. - Whitespace normalization — Collapsed 3+ consecutive newlines to 2, and collapsed horizontal whitespace.
- Stub removal — Dropped any entry whose cleaned lyrics are under 100 characters.
- Exact deduplication — Removed entries with identical cleaned lyrics.
- Near-deduplication — For entries sharing the same
artist+title, retained the version with the highest view count.
Data Structure
.ds-th { font-family: Fira Code, Consolas, monospace; font-size: 13px; font-weight: 700; fill: #7C3AED; } .ds-label { font-family: Fira Code, Consolas, monospace; font-size: 12px; fill: #e6edf3; } .ds-type { font-family: Fira Code, Consolas, monospace; font-size: 12px; fill: #7C3AED; } .ds-desc { font-family: Fira Code, Consolas, monospace; font-size: 11px; fill: #8b949e; } Field Type Description title string Song title as listed on Genius artist string Primary artist name tag string Genre tag (one of 15 values; see below) year float64 Release year (may be NaN for entries with missing metadata) lyrics string Cleaned, deduplicated lyrics with normalized section headers
The dataset includes the following 15 genre values: rap · trap · pop · rb · rock · country · metal · folk · jazz · indie · electronic · reggae · soul · blues · latin
Training Format
Each row's lyrics field contains plain cleaned lyrics with normalized section headers ([Verse 1], [Chorus], [Bridge], etc.). For models that benefit from soft conditioning, you can reconstruct a prompt-formatted version of each example at training time:
python def format_training_example (row): year = int (row[ 'year' ]) if pd.notna(row[ 'year' ]) else 'Unknown' header = ( f"[Genre: {row['tag']}]\n" f"[Artist: {row['artist']}]\n" f"[Year: {year}]\n" f"[Title: {row['title']}]\n\n" ) return header + row[ 'lyrics' ]
This soft-conditioning format allows models to learn genre, artist, and era as implicit style tokens without hard task prefixes.
Token Length Distribution
Based on word-count proxies measured during cleaning: • The majority of entries fall under 512 words, well-suited for 512–1024 token context windows. • Setting max_seq_length=1024 captures the vast majority of examples without truncation.
Sources
carlosgdcj/genius-song-lyrics-with-language-information ~9+ GB (CSV) — Original Kaggle dataset with language detection metadata theelderemo/genius-lyrics-cleaned ~2.56 GB — Cleaned, English-only, genre-filtered subset
The original dataset was collected by scraping Genius.com and includes language detection metadata alongside raw lyrics.
Curation
The raw dataset is large and noisy. The misc category alone contributes a significant portion of non-music content. Language diversity, while useful for multilingual tasks, is a source of noise for English-only modeling. This cleaned version provides a high-quality, ready-to-train English lyric corpus.
Citation
If you use this dataset in research or a project, please cite both the upstream Kaggle source and this repository:
@misc{christopher_dickinson_2026,
author = { Christopher Dickinson },
title = { genius-lyrics-cleaned (Revision 9742989) },
year = 2026,
url = { https://huggingface.co/datasets/theelderemo/genius-lyrics-cleaned },
doi = { 10.57967/hf/7978 },
publisher = { Hugging Face }
}