Unprofane

Benchmarks

Two benchmarks, and both count the false alarms. One is open for anyone to run against their own filter. The other puts Unprofane beside the Perspective API, OpenAI moderation and the npm filters on the same judged texts.

Head to head

Real text in 17 languages, labelled blind by AI judges. Every system answers the same texts, and each is also read at the same false-alarm rate.

89.0%

toxic text caught by Unprofane, flagging 7.0% of clean text

58.4%

Perspective at the same rate

40.8%

OpenAI moderation at the same rate

The private test set, 9,029 texts, read once on 2026-09-28

See the results

The Scunthorpe Test

Disguised spellings by technique, and innocent words that contain a profane string. Download the public split and run it on any filter.

0.918

F1, Unprofane's rules alone

0.0%

false positives on innocent words and names

The public split, 15,530 items, run of 2026-10-12

See the results

Which one answers your question

Head to headThe Scunthorpe Test
The questionWhich filter catches more abuse in real text without flagging more clean text?Can a filter be fooled by a disguised spelling, and does it block Scunthorpe?
The textsComments, chat and usernames from open datasets, and disguised spellings, labelled blind by AI judgesGenerated from graded seeds: each disguise made by one named technique, and innocent words bare and in sentences
What runsUnprofane with its model, the Perspective API, OpenAI moderation and the npm filtersUnprofane in each mode, the models alone and the npm filters
Who can run itUs: the texts are third-party and not ours to republishAnyone: the split, the runner and the method are on GitHub