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

网站怎么做敏感词过滤,敏感词过滤的思路和实践

敏感词过滤是一种在网站、应用程序或平台中实现内容审查的技术,用于阻止用户发布包含不适当、非法或不符合政策的内容。我们在实际的网站运营过程中,往往需要担心某些用户发布的内容中包含敏感词汇,这些词汇往往会导致我们的网站被用户举报,甚至被服务器运营商封禁、被相关部门约谈、罚款等。为了防止这种情况发生,我们需要对敏感词汇进行过滤。

敏感词过滤的实现涉及多个步骤,既包括技术实现,也包括策略制定。以下以安企CMS的敏感词过滤设计为例,展开说明。

定义敏感词库

敏感词库的构成,一般包含涉及SE情的、涉及政治的、涉及FAN动暴力的、涉及广告法的词汇。根据我们网站的不同定义,可以收集集中一部分获取全部的词汇。一般我们可以从网上下载或手动收集这些词汇。

在敏感词库的收集方面,安企CMS设计成了手动收集+系统同步双模式。默认系统没有敏感词,可以选择从官网同步官网预设好的敏感词库,也可以手动添加自定义的敏感词。

请添加图片描述

敏感词过滤的算法设计

针对日常的企业网站,我们不必要采用上下文分析、语义分析等 AI 算法。为了简便起见,我们可以使用最常见,也是最简单是的关键词匹配算法,为了更大的适应规则,我们还可以增加使用正则匹配类的模糊匹配算法来实现。

安企CMS 采用的就是关键词匹配 + 正则模糊匹配双模式进行处理。具体的替换代码如下:

具体代码是 GoLang 代码,因为 安企CMS 是 Go 语言开发,因此代码以 Go 语言为例。

func ReplaceSensitiveWords(content []byte, sensitiveWords []string) []byte {// 如果敏感词库为空,或内容为空,直接返回if len(sensitiveWords) == 0 || len(content) == 0 {return content}// 顶一个结构体,用于存储替换结果type replaceType struct {Key   []byteValue []byte}var replacedMatch []*replaceTypenumCount := 0//忽略所有html标签的属性,这是为了防止将标签属性替换成为*,导致页面出错reg, _ := regexp.Compile("(?i)<!?/?[a-z0-9-]+(\\s+[^>]+)?>")content = reg.ReplaceAllFunc(content, func(s []byte) []byte {key := []byte(fmt.Sprintf("{$%d}", numCount))replacedMatch = append(replacedMatch, &replaceType{Key:   key,Value: s,})numCount++return key})// 替换所有敏感词为星号for _, word := range sensitiveWords {if len(word) == 0 {continue}if bytes.Contains(content, []byte(word)) {content = bytes.ReplaceAll(content, []byte(word), bytes.Repeat([]byte("*"), utf8.RuneCountInString(word)))} else {// 支持正则表达式替换,定义正则表达式以{开头}结束,如:{[1-9]\d{4,10}}if strings.HasPrefix(word, "{") && strings.HasSuffix(word, "}") && len(word) > 2 {// 移除首尾花括号newWord := word[1 : len(word)-1]re, err := regexp.Compile(newWord)if err == nil {content = re.ReplaceAll(content, bytes.Repeat([]byte("*"), utf8.RuneCountInString(word)))}continue}}}// 将上面忽略的html标签属性还原回来for i := len(replacedMatch) - 1; i >= 0; i-- {content = bytes.Replace(content, replacedMatch[i].Key, replacedMatch[i].Value, 1)}return content
}

敏感词替换的时机

敏感词替换的可以在以下几种时机下进行:

  1. 提交实时过滤:用户在提交内容时,系统会自动检测并过滤敏感词。
  2. 批量过滤:系统定时扫描数据库中的内容,对敏感词进行批量过滤。
  3. 显示时过滤:在显示内容的时候,系统会自动检测并过滤敏感词。

安企CMS 使用主要使用的是第三种时机方案。在页面渲染的时候,系统自动过滤敏感词。这也是为了考虑有不同的数据输入来源,以及敏感词库的动态更新,在提交时实时过滤的话,后来补充的敏感词就无法生效,而批量过滤也可能经常因为不及时导致的敏感词失效。因此在显示时过滤处理更严谨一些,虽然这么做会牺牲一些性能。

为了实现显示时过滤敏感词,安企CMS重写了 ExecuteWriter 输出函数,具体的代码如下:

func (s *DjangoEngine) ExecuteWriter(w io.Writer, filename string, _ string, bindingData interface{}) error {// 如果开启了debug模式,每次渲染的时候,重新解析模板。if s.reload {if err := s.LoadStart(true); err != nil {return err}}ctx := w.(iris.Context)currentSite := provider.CurrentSite(ctx)if tmpl := s.fromCache(currentSite.Id, filename); tmpl != nil {data, err := tmpl.ExecuteBytes(getPongoContext(bindingData))if err != nil {return err}// 对data进行敏感词替换data = currentSite.ReplaceSensitiveWords(data)buf := bytes.NewBuffer(data)_, err = buf.WriteTo(w)return err}// 如果模板不存在,返回错误return view2.ErrNotExist{Name: filename, IsLayout: false, Data: bindingData}
}

以上的敏感词过滤的思路和实践。在实际使用过程中,我们应该根据实际需求进行优化和调整。在机器自动过滤的基础上,增加人工审核部分内容,定期巡查,特别是那些容易产生歧义或涉及深度语义分析的内容。

敏感词过滤是一个复杂且动态的过程,既需要高效的技术手段,也需要灵活应变的策略以适应不断变化的语言环境和政策要求。希望以上内容能帮助到您。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++排序
  • 探索802.1X:构筑安全网络的认证之盾
  • 嵌入式学习day17(数据结构)
  • 【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)
  • WARNING XXX is not overriding the create method in batch
  • IDEA XML文件去掉黄色和绿色底色
  • Qt第十六章 多媒体Multimedia
  • fscan下载和使用
  • 预训练语言模型PLM(课程笔记)
  • 数据结构:栈、队列详解篇
  • 找到sql里面参数字段占位符的位置,方便对字段进行加密存储
  • “软件定义汽车”下的软件虚拟化技术
  • Unity常用插件记录
  • MATLAB算法实战应用案例精讲-【人工智能】暗数据(概念篇)
  • 添加数据判断是否存在存在不添加,或存在更新
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [Vue CLI 3] 配置解析之 css.extract
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Computed property XXX was assigned to but it has no setter
  • es6
  • JavaWeb(学习笔记二)
  • JAVA并发编程--1.基础概念
  • spark本地环境的搭建到运行第一个spark程序
  • Vue官网教程学习过程中值得记录的一些事情
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 欢迎参加第二届中国游戏开发者大会
  • 悄悄地说一个bug
  • 如何设计一个比特币钱包服务
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 阿里云ACE认证学习知识点梳理
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 交换综合实验一
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (Forward) Music Player: From UI Proposal to Code
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (SpringBoot)第二章:Spring创建和使用
  • (离散数学)逻辑连接词
  • (排序详解之 堆排序)
  • (转)Google的Objective-C编码规范
  • (转)Mysql的优化设置
  • (自用)仿写程序
  • .net core 6 redis操作类
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET企业级应用架构设计系列之技术选型
  • @Bean注解详解
  • [100天算法】-实现 strStr()(day 52)
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [Android]使用Git将项目提交到GitHub
  • [C++]priority_queue的介绍及模拟实现
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [flutter]一键将YAPI生成的api.json文件转为需要的Dart Model类的脚本