揭秘 profanity-check 训练数据:20 万条人工标注样本如何炼成 95% 准确率
【免费下载链接】profanity-checkA fast, robust Python library to check for offensive language in strings.项目地址: https://gitcode.com/gh_mirrors/pr/profanity-check
脏话检测是内容审核的第一道防线,但大多数 Python 库仍停留在"黑名单匹配"的原始阶段。profanity-check是一款基于机器学习的 Python 脏话检测库,它没有一行硬编码的脏话词表,却能单条文本 0.2 毫秒内完成判定、测试准确率高达 95%。这份成绩的秘密,就藏在大约 20 万条人工标注样本(实际 184,354 条)的训练数据里。本文将拆解这些数据的来源、结构与分布,并剖析它们如何"喂"出一个又快又准的模型。
为什么不用黑名单?机器学习方案完胜 🧠
传统方案如 profanity、better-profanity 依赖人工维护的脏话词表,只要词表漏词就会误判。举个典型例子:"You cocksucker"这句脏话,profanity库因为词表里没有"cocksucker"会判定为"干净"。
profanity-check 则完全不同——它通过 20 万条人工标注样本训练模型,让模型自动学习哪些词是"脏"的、脏到什么程度。词表是死的,模型是活的,这就是它能脱颖而出的根本原因。
20 万条训练数据从哪里来:两大公开数据源 📚
训练数据并非凭空制造,而是合并了两个权威公开数据集:
| 数据源 | 说明 |
|---|---|
| Hate Speech and Offensive Language | 来自 Davidson 等人论文Automated Hate Speech Detection and the Problem of Offensive Language的配套数据 |
| Toxic Comment Classification Challenge | Kaggle 知名"毒性评论分类挑战赛"的维基百科评论数据 |
两份数据合并、去重、清洗后,沉淀为项目中的 clean_data.csv(约 63MB),这也是整个模型的地基。
训练数据内部结构:一行一条人工标注 📋
打开 clean_data.csv,结构非常简单:每一行是一条文本样本,由is_offensive(是否冒犯)和text(文本内容)两列组成,1代表脏话、0代表干净:
is_offensive,text 0,Then go to the village pump and suggest they change the language... 1,Dis hoe wasnt dis violent on Lottery Ticket 😂😂 0,Nonetheless lactose has a hemiacetal group...注意,文本字段里可能包含换行,所以文件共 58 万余行,但实际样本是184,354 条,与 README 宣称的"约 20 万条"基本吻合。想亲手查看数据,可以克隆仓库后直接翻阅:
git clone https://gitcode.com/gh_mirrors/pr/profanity-check80% 干净 + 20% 脏话:数据分布有讲究 ⚖️
统计全部标注结果,会发现一个精心设计的比例:
- ✅ 干净样本:147,509 条(约 80%)
- 🚫 冒犯样本:36,845 条(约 20%)
这个分布很关键:脏话样本只占两成,模型必须学会在大量正常文本中精准找出少数脏话,而不是无脑判负。同时,约 20% 的正样本占比也保证了模型见过足够多"脏话长什么样",从而学到词与词之间的细微差别——比如把"go to hell, you scum"识别为冒犯。
从数据到模型:三步流水线炼成 95% 准确率 🔧
原始文本不会直接喂给模型,而是经过 profanity_check.py 背后这条三步流水线:
- 词袋向量化:用
CountVectorizer把每条文本拆成词频向量 - 线性分类:用
LinearSVC(线性支持向量机)根据词向量判断是否冒犯 - 概率校准:用
CalibratedClassifierCV把分类结果转化为 0~1 的置信概率
训练完成后,词向量器与模型被序列化为两个文件随库分发:vectorizer.joblib(3.9MB)与 model.joblib(607KB),使用时直接加载、无需重训。模型"记住"的是每个词在脏话样本中的出现频率,等于自动从 20 万条数据中提炼出了一份动态黑名单——比人工词表聪明得多。
实测对决:95% 准确率碾压同类库 🏆
用维基百科毒性评论数据测试,profanity-check 的成绩全面领先:
| 库 | 准确率 | 平衡准确率 | 精确率 | 召回率 | F1 |
|---|---|---|---|---|---|
| profanity-check | 95.0% | 93.0% | 86.1% | 89.6% | 0.88 |
| profanity-filter | 91.8% | 83.6% | 85.4% | 70.2% | 0.77 |
| profanity | 85.6% | 65.1% | 91.7% | 30.8% | 0.46 |
尤其注意召回率:profanity只有 30.8%,意味着近七成脏话被放行;而 profanity-check 的召回率达到 89.6%,真正做到了"漏得少、判得准"。
性能怪兽:比同类库快 300–4000 倍 ⚡
准确率高还不够,在批量审核场景下速度就是生命线。同一份基准测试中(2018 款 MacBook Pro):
| 库 | 1 条预测 | 10 条预测 | 100 条预测 |
|---|---|---|---|
| profanity-check | 0.2ms | 0.5ms | 3.5ms |
| profanity-filter | 60ms | 1200ms | 13000ms |
| profanity | 0.3ms | 1.2ms | 24ms |
得益于线性 SVM 的轻量计算,profanity-check 比深度学习路线的 profanity-filter快 300~4000 倍,同时准确率还更高——鱼与熊掌兼得。
两分钟上手:安装与快速检测 🚀
安装只需一行命令:
pip install profanity-check使用同样简单,核心就两个函数:
from profanity_check import predict, predict_prob predict(['fuck you']) # [1] 表示冒犯 predict(['Hello there, how are you']) # [0] 表示干净 predict_prob(['go to hell, you scum']) # [0.76] 冒犯概率predict返回 0/1 判定,predict_prob返回冒犯概率,两者都直接返回 numpy 数组,方便接入你的过滤逻辑。配套的 test_profanity_check.py 中还覆盖了大小写混合(fUcK u)、空文本、超长文本等边界情况,可作为使用参考。
别把 95% 当 100%:模型的边界与正确用法 ⚠️
最后必须泼一盆冷水:profanity-check 并非完美。由于训练语料中变体拼写出现频率太低,它对"f4ck you"、"you b1tch"这类数字替换的脏话识别效果不佳。
正确姿势是:把它当作启发式过滤器(Heuristic)而非绝对真理。先用它快速筛出高概率冒犯文本,再配合人工审核兜底——兼顾速度、准确率与误伤控制。这也是 20 万条标注数据最合理的打开方式。
【免费下载链接】profanity-checkA fast, robust Python library to check for offensive language in strings.项目地址: https://gitcode.com/gh_mirrors/pr/profanity-check
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考