What Is Actually In A Filipino Hate-Speech Corpus
One openly published benchmark of 27,383 labelled posts from the 2016 and 2022 election campaigns, opened and measured. No post text appears anywhere on this page — the corpus is abuse aimed at real people, and quoting it to decorate a chart would republish it.
Opening one dataset properly beats listing six. This corpus is well balanced, quietly leaky, and shaped as much by a platform's character limit as by how anyone writes.
- 273 posts appear in more than one split — 1.0% of the corpus. A model can be graded on text it was trained on, so any accuracy reported against this benchmark is flattered by an unknown amount.
- 79.03% of posts fit inside 140 characters, with a hard cliff there in the length distribution. That is Twitter's pre-2017 limit, not a fact about Filipino writing: the corpus spans campaigns on either side of the change.
- Hate-labelled posts are markedly more Tagalog. 64.79% of their function words are Tagalog against 49.32% for the rest — and 47.01% of them show no English markers at all, against 27.03%.
- That last one needs care. It may say what abuse sounds like, or it may say which language annotators were readier to call abusive. This data cannot separate the two, and the difference matters if anyone trains on it.
The Corpus
27,383 posts across 3 splits, each labelled hate or not. Class balance is the first thing to check on any benchmark: if one label dominates, a model that always guesses it scores well and accuracy stops meaning anything.
Total posts
Across train, validation and test.
Hate-labelled
50.42% of the corpus — close enough to even that accuracy is a fair measure here.
Not hate
The balance is deliberate and holds inside every split, not just overall.
The Benchmark Leaks
Splits exist so a model is graded on text it has never seen. That guarantee only holds if the splits are disjoint. Here they are not.
Posts in more than one split
The same text is both trained on and graded on.
As a share
Small, but it moves in one direction only: every published accuracy figure for this benchmark is flattered by some amount nobody has measured.
Rows beyond first occurrence
Counting all repeats, not just cross-split ones. Reported rather than deduplicated here — removing it would hide the leak from anyone comparing against published scores.
A Platform's Fingerprint
Post length, in twenty-character buckets. The shape is not about how Filipinos write. It is about what the platform allowed: Twitter's limit was 140 characters until November 2017 and 280 after, and this corpus spans campaigns on both sides of that change.
Within 140 characters
A hard cliff at exactly the old limit, visible in the histogram.
141–280 characters
The post-2017 regime.
Longer than 280
Longest is 669 characters — threads and quote-tweets that the collection flattened into single rows.
Which Language
Every post is checked against two fixed lists of grammatical function words, one Tagalog and one English. A post matching both is counted as mixed. This is a blunt instrument by design, and it undercounts: it misses loanwords, misspellings and Taglish morphology entirely.
Mixed
Both lists matched. A floor on code-switching, not a measurement of it.
Tagalog markers only
Against 25.38% showing English markers only.
Neither list matched
Short posts, hashtags, names and heavy slang. The honest residual of a word-list method, published rather than distributed away.
The Register Difference, And Its Catch
The clearest signal in the corpus, and the one most likely to be misread. Hate-labelled posts lean substantially more Tagalog than the rest.
Hate-labelled
Of matched function words. And 47.01% of these posts show no English marker at all.
Not hate
A 15.47-point gap in register between the two classes.
What it might not mean
Two readings fit equally well: abuse is more often written in Tagalog, or annotators more readily judged Tagalog posts abusive. Nothing in this data separates them — and a model trained here would learn the pattern either way, including if it is an artefact of labelling.
Why There Are No Examples On This Page
Every write-up of a hate-speech dataset quotes a few rows to show the reader what it looks like. This one does not, and the constraint was set before the analysis rather than after.
These are real people
The corpus is election-period abuse directed at named candidates and named individuals. Reprinting it to illustrate a chart republishes the harassment, with better formatting and a wider audience.
So no content words either
A "most frequent words" table on this corpus is a slur list. The only token-level output here is the frequency of grammatical function words — ang, the, sa, of — taken from two lists fixed in advance so they could not be tuned to produce a tidier answer.
The findings survived it
The leak, the character-limit cliff and the register gap are
all aggregate properties. A check in
checks.sql asserts that no output CSV carries
anything but function words, so this cannot erode by accident
later.
What This Page Does Not Cover
The version this replaced claimed six datasets, six NLP tasks and an 87.2% best model accuracy, plus charts of emotion detection, hashtag frequency, mention patterns, toxicity scores and posting times. No model was trained and no dataset was opened.
No model, so no accuracy
Nothing here reports a classification score, because nothing here trained a classifier. If one is ever trained, the leak in section 02 has to be dealt with first or the number will be wrong in a flattering direction.
The other five datasets
The Filipino fake-news and dengue-sentiment corpora exist and are cited widely, but their Hugging Face entries no longer serve a machine-readable conversion — the datasets-server returns no info for them. One dataset opened beats six listed.
Hashtags, mentions, timestamps
This corpus is text and a label. There are no timestamps, no user handles and no engagement counts in it, so temporal and network charts could not be built from it at all.
Method
One fetcher, eight CSVs, no key.
Source
Hugging Face's datasets-server publishes parquet conversions of public datasets. DuckDB reads them straight over HTTP — about 2 MB for the whole corpus, so nothing is cached or committed except the aggregates.
Language detection
Two fixed function-word lists, written before looking at the data. Deliberately crude: it cannot see loanwords or Taglish morphology, so the mixed share is a lower bound. The 11.54% that matched neither list is published rather than redistributed into the others.
An integer-division bug
The length histogram bucketed on
length / 20 * 20. DuckDB's / is float
division, so that returns the length unchanged and produced 591
buckets instead of 16 — a "histogram" with one bar per
distinct length. Fixed with //.
Leakage is measured, not fixed
Deduplicating across splits here would produce a cleaner corpus that no longer matches the published one, and would hide the problem from anyone comparing against published scores. It is counted and reported instead.
Balance is asserted
A check fails if any split drifts outside 40–60% on either label, because accuracy as a headline metric depends on that balance holding.
Verification
Eleven assertions in checks.sql, including the
one that matters most here: no output CSV may contain a token
outside the two function-word lists.
Key Findings & Summary
- The corpus holds 27,383 labelled posts and is well balanced at 13,807 hate against 13,576 not — so accuracy is a meaningful metric on it, which is not true of every benchmark.
- It leaks. 273 posts sit in more than one split, so published accuracy figures are flattered by an unmeasured amount. Reported here rather than quietly deduplicated.
- 79.03% of posts fit the pre-2017 140-character limit, against 18.54% in the 141–280 band. The length distribution is a fingerprint of platform policy, not of writing style.
- Code-switching is at least 25.99% of posts by a deliberately crude word-list test, with 11.54% matching neither list — a residual that a fancier method would hide rather than remove.
- Hate-labelled posts run 15.47 points more Tagalog in function-word register than the rest (64.79% against 49.32%). Whether that is a fact about abuse or about annotation is not decidable from this data, and a model trained on it would learn the pattern either way.
Sources & Citations
Every figure on this page traces to one of these, through a CSV in
data/ph-textcorpus/. Each is checked against its source query on every
build.
2016-2022 Filipino hate speech corpusPrimary
27383 labelled election-period posts — Read from the Hugging Face parquet conversion; no post text is reproduced in any output
Let's Discuss This Analysis
Interested in Filipino NLP, hate speech detection, or social media text analysis research?
Have a dataset you'd like analyzed or need a mini AI project as a starter guide? Send me your suggestions!
Prefer the plain-English version?
I wrote a companion post — “I Opened One Dataset Instead Of Listing Six” — in simple, everyday words.