当前位置: 首页 > article >正文

Python敏感词检测方案详解

一、引言在互联网内容审核、社交平台监管、评论系统过滤等场景中敏感词检测是一项必不可少的功能。Python凭借其丰富的生态和简洁的语法提供了多种实现敏感词检测的方案。本文将详细介绍几种主流的实现方式并分析各自的优缺点及适用场景。二、基础方案关键词匹配2.1 直接遍历匹配最简单的实现方式是使用列表存储敏感词然后遍历检测pythonclass SimpleSensitiveWordFilter: def __init__(self): self.sensitive_words [] def add_words(self, words): self.sensitive_words.extend(words) def contains_sensitive_word(self, text): for word in self.sensitive_words: if word in text: return True return False def replace_sensitive_words(self, text, replace_char*): result text for word in self.sensitive_words: result result.replace(word, replace_char * len(word)) return result优点实现简单易于理解缺点效率低时间复杂度O(n*m)无法处理重叠匹配2.2 正则表达式匹配使用正则表达式可以更灵活地匹配敏感词pythonimport re class RegexSensitiveWordFilter: def __init__(self): self.pattern None def add_words(self, words): # 使用正则的 | 连接所有敏感词 pattern_str |.join(re.escape(word) for word in words) self.pattern re.compile(pattern_str, re.IGNORECASE) def contains_sensitive_word(self, text): return bool(self.pattern.search(text)) def find_all_sensitive_words(self, text): return self.pattern.findall(text) def replace_sensitive_words(self, text, replace_char*): def replace_func(match): return replace_char * len(match.group()) return self.pattern.sub(replace_func, text)优点支持复杂匹配规则代码简洁缺点敏感词数量大时性能下降正则表达式编译开销较大三、进阶方案前缀树Trie树3.1 原理介绍Trie树前缀树是一种专门用于字符串快速匹配的树形数据结构。它的核心思想是利用字符串的公共前缀来减少不必要的比较实现O(n)的时间复杂度。3.2 实现代码pythonclass TrieNode: __slots__ (children, is_end) def __init__(self): self.children {} self.is_end False class TrieSensitiveWordFilter: def __init__(self): self.root TrieNode() def add_word(self, word): 添加单个敏感词 node self.root for char in word: if char not in node.children: node.children[char] TrieNode() node node.children[char] node.is_end True def add_words(self, words): 批量添加敏感词 for word in words: self.add_word(word) def contains_sensitive_word(self, text): 检测是否包含敏感词 for i in range(len(text)): node self.root j i while j len(text) and text[j] in node.children: node node.children[text[j]] if node.is_end: return True j 1 return False def find_all_sensitive_words(self, text): 找出所有敏感词及位置 results [] for i in range(len(text)): node self.root j i while j len(text) and text[j] in node.children: node node.children[text[j]] if node.is_end: results.append({ word: text[i:j1], start: i, end: j }) j 1 return results def replace_sensitive_words(self, text, replace_char*): 替换敏感词 sensitive_positions self.find_all_sensitive_words(text) if not sensitive_positions: return text result list(text) for pos in sensitive_positions: for k in range(pos[start], pos[end] 1): result[k] replace_char return .join(result)3.3 优化版AC自动机AC自动机Aho-Corasick automaton在Trie树的基础上增加了失败指针实现多模式串的高效匹配pythonfrom collections import deque class AhoCorasickNode: __slots__ (children, fail, output) def __init__(self): self.children {} self.fail None self.output [] # 存储以此节点结尾的敏感词 class AhoCorasickFilter: def __init__(self): self.root AhoCorasickNode() self._built False def add_word(self, word): 添加敏感词 node self.root for char in word: if char not in node.children: node.children[char] AhoCorasickNode() node node.children[char] node.output.append(word) self._built False def add_words(self, words): for word in words: self.add_word(word) def _build_fail_pointers(self): 构建失败指针BFS queue deque() # 初始化第一层节点的失败指针 for char, child in self.root.children.items(): child.fail self.root queue.append(child) while queue: current queue.popleft() for char, child in current.children.items(): queue.append(child) # 寻找失败指针 fail_node current.fail while fail_node is not None and char not in fail_node.children: fail_node fail_node.fail if fail_node is None: child.fail self.root else: child.fail fail_node.children[char] # 合并输出 child.output.extend(child.fail.output) def search(self, text): 搜索文本中的所有敏感词 if not self._built: self._build_fail_pointers() self._built True result [] node self.root for i, char in enumerate(text): # 沿着失败指针查找匹配 while node is not self.root and char not in node.children: node node.fail if char in node.children: node node.children[char] else: node self.root # 收集匹配结果 for word in node.output: result.append({ word: word, position: i - len(word) 1 }) return result def contains_sensitive_word(self, text): return len(self.search(text)) 0 def replace_sensitive_words(self, text, replace_char*): matches self.search(text) if not matches: return text result list(text) for match in matches: start match[position] end start len(match[word]) for i in range(start, end): result[i] replace_char return .join(result)四、第三方库方案4.1 使用better_profanitypythonfrom better_profanity import profanity # 初始化 profanity.load_censor_words() # 检测 text You are a fool if profanity.contains_profanity(text): print(包含敏感词) # 替换 censored_text profanity.censor(text) print(censored_text) # You are a **** # 自定义敏感词库 custom_badwords [badword1, badword2] profanity.load_censor_words(custom_badwords)4.2 使用ahocorasick库pythonimport ahocorasick class PyAhocorasickFilter: def __init__(self): self.automaton ahocorasick.Automaton() self._built False def add_words(self, words): for idx, word in enumerate(words): self.automaton.add_word(word, (idx, word)) self._built False def build(self): self.automaton.make_automaton() self._built True def search(self, text): if not self._built: self.build() result [] for end_index, (idx, word) in self.automaton.iter(text): start_index end_index - len(word) 1 result.append({ word: word, start: start_index, end: end_index }) return result4.3 其他相关库库名特点适用场景profanity-check基于机器学习需要语义理解alt-profanity-check轻量级简单场景ngram-profanity支持模糊匹配变形词检测五、高级特性实现5.1 支持跳过干扰字符pythonclass AdvancedFilter: def __init__(self, skip_charsNone): self.skip_chars skip_chars or { , -, _, .} self.trie_filter TrieSensitiveWordFilter() def _normalize(self, text): 标准化文本去除干扰字符 return .join(c for c in text if c not in self.skip_chars) def contains_sensitive_word(self, text): normalized self._normalize(text) return self.trie_filter.contains_sensitive_word(normalized)5.2 支持拼音/谐音检测python# 使用 pypinyin 库处理拼音 from pypinyin import lazy_pinyin class PinyinSensitiveFilter: def __init__(self): self.pinyin_map {} def add_word(self, word): # 同时添加中文和拼音形式的敏感词 self.trie_filter.add_word(word) pinyin .join(lazy_pinyin(word)) self.trie_filter.add_word(pinyin)5.3 支持英文大小写/变体处理pythonclass CaseInsensitiveFilter: def __init__(self): self.trie_filter TrieSensitiveWordFilter() def add_word(self, word): # 添加小写版本 self.trie_filter.add_word(word.lower()) def contains_sensitive_word(self, text): return self.trie_filter.contains_sensitive_word(text.lower())六、性能对比方案时间复杂度空间复杂度1000词响应时间适用场景直接遍历O(n*m)O(m)~50ms小词库正则表达式O(n*m)O(m)~30ms中等词库Trie树O(n)O(m*k)~5ms大词库AC自动机O(n)O(m*k)~3ms超大词库better_profanityO(n)O(m)~2ms通用场景注n为文本长度m为敏感词数量k为平均词长七、完整实战示例pythonclass SensitiveWordDetectionSystem: 完整的敏感词检测系统 def __init__(self, word_fileNone, skip_charsNone): self.filter AhoCorasickFilter() self.skip_chars skip_chars or { , ., -, _, *, #} if word_file: self.load_words_from_file(word_file) def load_words_from_file(self, file_path): 从文件加载敏感词库 with open(file_path, r, encodingutf-8) as f: words [line.strip() for line in f if line.strip()] self.filter.add_words(words) def preprocess_text(self, text): 预处理文本移除干扰字符 # 可选移除干扰字符 # text .join(c for c in text if c not in self.skip_chars) # 可选转小写 text text.lower() return text def detect(self, text): 检测文本 processed self.preprocess_text(text) return self.filter.search(processed) def audit(self, text, strictTrue): 内容审核 matches self.detect(text) result { is_safe: len(matches) 0, sensitive_words: [m[word] for m in matches], count: len(matches), suggested_action: block if strict and len(matches) 0 else review } return result def censor(self, text, replace_char*): 敏感词脱敏 processed self.preprocess_text(text) matches self.filter.search(processed) if not matches: return text # 需要映射回原始文本的位置 result list(text) # 简化版直接替换实际应用需要处理位置映射 for match in matches: # 这里简化处理 pass return self.filter.replace_sensitive_words(processed, replace_char) # 使用示例 if __name__ __main__: # 初始化系统 system SensitiveWordDetectionSystem() system.filter.add_words([敏感词, 不良信息, 违规内容]) # 测试文本 test_texts [ 这是一条正常的消息, 这里包含敏感词需要处理, 用户发送了不良信息内容 ] for text in test_texts: result system.audit(text) print(f文本: {text}) print(f审核结果: {result}) print(- * 50)八、敏感词库管理建议8.1 词库分类textsensitive_words/ ├── political.txt # 政治敏感 ├── porn.txt # 色情低俗 ├── violence.txt # 暴力恐怖 ├── abuse.txt # 人身攻击 └── spam.txt # 垃圾广告8.2 词库维护策略定期更新建立词库更新机制分级管理按敏感程度分级处理白名单机制支持误杀词的快速恢复版本控制记录词库变更历史九、总结与建议9.1 方案选择指南小型项目100词使用正则或直接遍历即可中型项目100-10000词推荐Trie树方案大型项目10000词必须使用AC自动机快速开发使用better_profanity等成熟库9.2 注意事项性能优化使用缓存、异步处理、批量检测误杀控制建立白名单和人工审核机制编码问题统一使用UTF-8编码变形词需要考虑拼音、谐音、数字替代等多语言中英文混合检测需要特殊处理9.3 扩展方向结合NLP语义理解减少误杀支持图片中的文字检测OCR实时监控和告警系统用户行为分析和分级通过合理选择和优化敏感词检测方案可以有效保障平台内容安全同时保持良好的用户体验。

相关文章:

Python敏感词检测方案详解

一、引言在互联网内容审核、社交平台监管、评论系统过滤等场景中,敏感词检测是一项必不可少的功能。Python凭借其丰富的生态和简洁的语法,提供了多种实现敏感词检测的方案。本文将详细介绍几种主流的实现方式,并分析各自的优缺点及适用场景。…...

STM32F103移相全桥PWM寄存器级配置实战

1. STM32F103移相全桥PWM控制的核心原理 移相全桥拓扑在DCDC电源设计中非常常见,它通过调节两个桥臂之间的相位差来控制功率传输。STM32F103的高级定时器TIM1和TIM8正好可以完美实现这个功能。我做过好几个电源项目,发现直接操作寄存器比用库函数效率高得…...

fastMRI技术解析:从k-space到图像重建的完整指南

fastMRI技术解析:从k-space到图像重建的完整指南 【免费下载链接】fastMRI A large-scale dataset of both raw MRI measurements and clinical MRI images. 项目地址: https://gitcode.com/gh_mirrors/fa/fastMRI 1 问题引入:医疗影像的"速…...

直连链接获取:告别城通网盘下载烦恼的高效解决方案

直连链接获取:告别城通网盘下载烦恼的高效解决方案 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 在数字化办公与学习中,城通网盘作为常用的文件存储与分享平台,其下…...

胡桃讲编程:华为鸿蒙系统能装安卓安装包吗?

(地下程序员实战科普|无废话纯原理版)哈喽各位抱着老本搞开发、做音频创作、天天和各种安装包打交道的小伙伴们,我是胡桃~前面咱们刚讲完 USB 2.0 和 3.0 的速度与分级逻辑,这期来聊一个数码圈常年有人问的…...

Snap.Hutao:5分钟掌握原神玩家必备的终极桌面工具箱

Snap.Hutao:5分钟掌握原神玩家必备的终极桌面工具箱 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao…...

VRCT:突破VRChat语言壁垒的创新解决方案

VRCT:突破VRChat语言壁垒的创新解决方案 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 在全球化的虚拟社交平台VRChat中,语言差异已成为阻碍跨文化交流的核心痛…...

胡桃讲编程|从代码跨入音乐:调音,本质就是另一种编程!(MIDI 核心概念篇)

哈喽各位抱着老本搞开发、跑 AI 音频、玩虚拟歌手的小伙伴们,我是胡桃~之前咱们一直在聊电脑蓝屏、CMD 指令、硬件续命、鸿蒙实操,从今天开始,咱们正式踏入一个全新的领域 ——音乐创作。 不知道你们有没有过这样一种奇妙的感觉&…...

OpenClaw版本升级指南:Qwen3-14b_int4_awq兼容性检查清单

OpenClaw版本升级指南:Qwen3-14b_int4_awq兼容性检查清单 1. 为什么需要这份升级指南 上周五晚上11点,我的OpenClaw突然罢工了——当时它正在帮我自动整理会议纪要,突然弹出一条错误提示:"Model provider configuration in…...

提升JSON处理效率的三个核心技巧:使用VS Code插件优化开发流程

提升JSON处理效率的三个核心技巧:使用VS Code插件优化开发流程 【免费下载链接】vscode-json Json for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-json 在现代软件开发中,JSON作为数据交换的标准格式,其…...

收银系统搭建难点解决方法

收银系统是现代零售、餐饮等行业的核心工具,能提升效率、减少错误。但搭建过程中常面临技术难点,如支付集成、安全合规等。本文基于实际实践,提供解决方法,帮助读者从零构建高效系统。需求分析难点及解决需求模糊或冲突是常见难点…...

Phi-4-mini-reasoning与SpringBoot微服务集成:构建智能业务逻辑层

Phi-4-mini-reasoning与SpringBoot微服务集成:构建智能业务逻辑层 1. 为什么要在微服务中集成AI推理能力 微服务架构已经成为现代企业应用开发的主流选择,而AI能力的引入正在改变传统业务逻辑的实现方式。将Phi-4-mini-reasoning这样的轻量级推理模型集…...

OPUS编解码器在audio DSP上的移植和应用贩

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作量。 使用 kube…...

OpenClaw(小龙虾)Windows 本地部署教程|一键安装 + 避坑指南

前言 OpenClaw 作为开源 AI 智能体工具,支持本地运行、可视化操作,可通过自然语言指令完成文件整理、浏览器自动化、数据提取等电脑操作,适配 Windows 多版本系统,部署流程简洁,适合办公场景与技术爱好者使用。本文整…...

【一文吃透】相控传感器阵列:从波束形成到工程落地的全链路实战指南(附Python仿真代码)

文章目录一、相控阵列到底是什么?——用雷达测速仪讲清楚原理1.1 为什么需要"相控"?传统传感器的盲区痛点1.2 相位差如何"操控"信号方向——水波干涉的直觉理解二、波束形成的数学本质——别被公式吓到2.1 阵列响应向量:…...

3分钟搞定:IDM无限试用重置工具完整使用指南

3分钟搞定:IDM无限试用重置工具完整使用指南 【免费下载链接】idm-trial-reset Use IDM forever without cracking 项目地址: https://gitcode.com/gh_mirrors/id/idm-trial-reset 你是否曾因Internet Download Manager(IDM)试用期结束…...

国产最强开源模型 GLM-5.1 来了!Ollama 一键部署,开启 8 小时自主 AI 工作

引言 GLM-5.1的开源,确实是近期AI圈的一则重磅消息。为了让内容更充实,我将上一版的介绍与GLM-5的详细对比融合在了一起,这样能更清晰地看到它的进化。 一图看懂:GLM-5 vs. GLM-5.1 为了让你直观感受GLM-5.1的进化幅度&#xff…...

开源工具助力音频内容管理:打破平台限制的跨平台解决方案

开源工具助力音频内容管理:打破平台限制的跨平台解决方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否曾遇到…...

5分钟快速上手BilibiliDown:跨平台B站视频下载终极指南

5分钟快速上手BilibiliDown:跨平台B站视频下载终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/…...

OpenStack中cinder-volume服务异常排查与时间同步修复指南

1. 当cinder-volume服务突然罢工时 最近在维护OpenStack集群时,遇到一个挺典型的问题:cinder-volume服务状态突然变成了down。这直接导致云平台上的块存储功能无法正常使用,虚拟机创建、卷挂载等操作都受到了影响。经过排查,发现问…...

突破网盘下载限速的效率工具:技术突破与提速方案全解析

突破网盘下载限速的效率工具:技术突破与提速方案全解析 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

docker-2025-tech-blog

Docker 零基础入门:2026 年还值不值得学?一篇讲清镜像、容器与 Compose DockerDocker 零基础入门:2026 年还值不值得学?一篇讲清镜像、容器与 Compose前言一、Docker 到底能解决什么问题?二、什么是 Docker&#xff1f…...

3步彻底优化:如何让Windows系统性能飙升30%?

3步彻底优化:如何让Windows系统性能飙升30%? 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors/w…...

微服务为什么会走到 RPC,以及 gRPC 到底解决了什么

大多数 gRPC 文章都从 .proto、代码生成、四种调用模式开始讲,读完之后你通常知道“怎么写”,但不一定真的明白“为什么会有这套东西”。 而工程里真正棘手的,恰恰不是语法,而是当系统从单体走向微服务之后,原来那些理…...

从监控盲区到业务洞察:深入解读 APMPlus 生产指标

在数字化浪潮席卷各行各业的今天,企业系统规模持续扩张,服务间调用关系日益交错,这使得许多“看不见的问题”正逐渐成为业务稳定性的巨大隐患。 你是否也曾遇到过这些棘手的场景? 偶发错误难量化:用户反馈“系统偶尔会…...

代码随想录 Day22 | 回溯算法-part01(77. 组合、216.组合总和III、17.电话号码的字母组合)

今日总结 回溯和组合问题、剪枝 题目 77. 组合 题目链接 题目题解 第一想法 自己实现 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:# 回溯,用一个path数组存储路径res []def dfs(i,path):if len(path) k:res.append(path.copy())return…...

0基础Go语言Eino框架智能体实战-chatModel

0基础Go语言Eino框架智能体实战-chatModel 摘要:本文详细介绍如何使用Go语言、Eino框架和Gin框架构建一个完整的智能聊天服务。涵盖环境搭建、大模型调用、API创建、日志输出、异常处理等核心知识点,适合零基础入门人工智能应用开发,源码在此…...

代码随想录算法训练营Day-21 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树1.递归函数作用:返回修剪后的二叉树的新的根节点2.终止条件:遇到空节点返回NULL;遇到范围之外的节点执行删除操作:如果该节点值小于最小值,说明右子树有可能还有符合要求的节点,所以返回…...

飞腾D2000/FT2000全国产化标准COMe模块

板贴DDR4,有8GB 16GB 32GB等容量,标准type6 COMe模块,有少量现货。...

OneDrive-Uninstaller:Windows 10 平台 OneDrive 彻底卸载工具

OneDrive-Uninstaller:Windows 10 平台 OneDrive 彻底卸载工具 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 项目价值&#xff…...