本文目录导读:

针对脚本过滤违规文本的需求,需要根据违规类型(如色情、暴力、政治敏感、广告、辱骂等)和使用场景(实时聊天、用户评论、内容发布等)选择合适的过滤方案。
以下是几种主流的过滤策略及对应的脚本实现思路(以 Python 为例,但逻辑通用):
关键词黑名单匹配(基础方案)
最直接的方式,适用于过滤明确的辱骂、违禁词,但容易误伤(如“程序”包含“程序猿”中的“程序”)或被变体绕过(如“牛B”写成“牛B”)。
实现步骤:
- 准备一个违规关键词列表(
blacklist.txt)。 - 将用户输入文本与列表进行匹配。
- 命中则替换或拒绝。
Python 脚本示例:
import re
def load_blacklist(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
def filter_by_keyword(text, blacklist):
for keyword in blacklist:
# 忽略大小写和部分特殊字符(如*、空格)
pattern = re.escape(keyword).replace(r'\*', '.*?')
if re.search(pattern, text, re.IGNORECASE):
return True # 违规
return False
blacklist = load_blacklist('blacklist.txt')
user_input = input("输入文本: ")
if filter_by_keyword(user_input, blacklist):
print("【违规】包含敏感词")
else:
print("【通过】")
缺点: 无法处理拼音、谐音(“草泥马”)、缩写(“cnm”)、拆字(“***”)等变体。
正则表达式模糊匹配(增强版)
利用正则匹配变体,允许中间插入特殊字符、空格或替换同音字。
示例模式:
- 匹配中间带空格或特殊符号:
(f\s*u\s*c\s*k)或[\\s\\*_\\-] - 匹配部分同音字:
[你妳]|[草操艹]
脚本示例:
import re
# 预编译正则规则集
patterns = [
r'f\s*u\s*c\s*k', # f**k 变体
r'[草操艹]\s*[泥尼你]马', # 草泥马变体
r'[他她它]妈[的底]?', # 他妈/她妈的
r'\b(死|杀|打)\s*[人]?', # 带空格的暴力词
]
def regex_filter(text):
for pattern in patterns:
if re.search(pattern, text, re.IGNORECASE):
return True
return False
基于 NLP 的语义过滤(高级方案)
对于“大语言模型”或“智能客服”场景,关键词无法捕捉不带关键词的恶意内容(如“我建议你去死”不含关键词但违规),需要利用 NLP 模型进行意图识别。
常用方法:
- 文本分类模型:使用 BERT、LSTM 等模型,训练一个“违规/非违规”二分类器。
- 相似度匹配:将用户输入与现有违规样本进行相似度比对(使用 Sentence-BERT)。
Python 实现(使用预训练分类器):
from transformers import pipeline
# 加载一个针对有毒内容(toxic)的预训练模型
classifier = pipeline("text-classification",
model="unitary/toxic-bert")
def nlp_filter(text):
result = classifier(text)[0]
# 假设模型的标签是 'toxic' 且得分 > 0.7 判定为违规
if result['label'] == 'toxic' and result['score'] > 0.7:
return True
return False
print(nlp_filter("You are an idiot")) # 输出 True
混合过滤策略(推荐方案)
现实中通常组合使用以上方法,形成多级过滤:
- 第一级:本地关键词白名单/黑名单(极快,100%拦截明显违规词)
- 第二级:正则变体匹配(处理变体绕过)
- 第三级:NLP 语义模型(处理反讽、隐晦表达,但速度较慢)
- 第四级:人工审核队列(对无法确定的内容提交后台审核)
其他实用技巧
1 Unicode 规范化
用户可能使用全角、半角、特殊 Unicode 字符绕过。А(西里尔字母)冒充 A。
import unicodedata
text = unicodedata.normalize('NFKC', user_text) # 将全角转半角,统一字形
2 拼音、谐音检测
可以建立一个拼音到违规词的映射,将用户输入的拼音转换后再匹配。
from pypinyin import lazy_pinyin
def pinyin_check(text):
pinyin_list = lazy_pinyin(text) # ['ni', 'ma', 'bi']
combined = ''.join(pinyin_list)
if 'nima' in combined or 'cao' in combined:
return True
return False
3 频率与时间模式检测
如果用户在短时间内反复发送相似内容(刷屏、广告),即使内容不违规,可能也属于违规行为。
from collections import defaultdict
user_log = defaultdict(list)
def check_frequency(user_id, text, timestamp):
# 检查 30 秒内是否发送超过 5 条相似内容
recent = [msg for msg in user_log[user_id]
if timestamp - msg['time'] < 30]
if len(recent) >= 5:
# 进一步检查文本相似度
similar_count = sum(1 for msg in recent
if text_similarity(msg['text'], text) > 0.8)
if similar_count >= 3:
return True
return False
建议与注意事项
- 误判处理:不要直接删除违规文本,建议用 替换或提示“内容未通过审核”。
- 词库维护:定期更新黑名单和白名单(合法”词如“操作系统”不能因包含“操”被拦截)。
- 性能:NLP 模型通常较重,对于高并发场景(如实时聊天),建议先使用关键词快速过滤,仅对可疑内容调用 NLP 模型。
- 法律合规:不同地区对政治敏感、隐私保护的定义不同,需结合当地法规调整过滤策略。
如果需要更具体的代码实现(如获取违规位置、替换违规内容),可以提供更详细的需求(语言、过滤内容类型、平台限制等),我可以帮你定制脚本。