首页 > 编程语言 >敏感词检测-DFA算法笔记及实现

敏感词检测-DFA算法笔记及实现

时间:2024-04-08 09:33:49浏览次数:17  
标签:self 笔记 敏感 算法 DFA 节点 输入

引子   敏感词检测,这个是很多文字类服务都要遇到的问题,最近项目上接触到,特此调研梳理下这部分的内容。比如当我们输入一些包含暴力或者色情的文本,系统会阻止信息提交。敏感词过滤就是检查用户输入的内容有没有敏感词。OK,让我们开始吧。 一、算法原理简介   一般敏感词检测之后有两个处理策略。(1)直接阻止信息保存,接口返回错误信息(2)允许信息保存,但是会把敏感词替换为***。不管是哪种策略,首先都得找到是否包含敏感词,这个判断一般是在服务端完成的。要判断用户输入有无敏感词,就需要有个敏感词库。例如,现在敏感词库中有两个敏感词:“abcd”和“cdef”。最容易想到的方法是遍历敏感词库,依次判断输入内容是否有“abcd”和“cdef”。这种方法是可靠的,但是真实的敏感词库里存放的敏感词是非常多的,如果遍历敏感词库的性能较低,而且大部分情况下用户输入的内容都是不包含敏感词的,大部分情况下遇到的都是算法计算量大的情况,那么就需要找到一种高效的敏感词检测方法。经过调研,发现DFA算法可以做到。 DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。敏感词过滤很适合用DFA算法,用户每次输入都是状态的切换,如果出现敏感词,即是终态,就可以结束判断。我们把数组形式的敏感词整理为一个树状结构,准确的说是一个森林。 0     这样,就把查找敏感词就变成了一个查找路径的问题,如果用户输入的内容中包含一个从根节点到叶子节点的完整路径,就说明包含敏感词。算法实现逻辑是循环用户输入的字符串,依次查找每个字符是否出现在树的节点上,比如用户输入“打倒日本人”,从第一个字开始判断,“打”不在树的根节点上,进入下一步,“倒”也不在根节点上,进入下一步,“日”出现在了根节点上,这时状态切换,下一步的查找范围变为“日”的子节点;“本”出现在子节点中,状态再次切换为“本”的子节点,“人”出现在子节点中,并且为叶子节点,所以包含敏感词。 二、部分代码

class SensitiveWords():
    def __init__(self, model_file,resp_json):
        with open(model_file,'rb') as f:
            self.keywords = [x.decode('utf8').strip() for x in f.readlines()]
        # print("self.keywords=", self.keywords)
        self.dfa =  DFA(self.keywords)

    def __call__(self, message):
        text = message["datas"][0]
        # print("message=", message)
        res = []
        for start_index, end_index in self.dfa.search(text):
            res.append([start_index, end_index])
        return res

  

 

标签:self,笔记,敏感,算法,DFA,节点,输入
From: https://www.cnblogs.com/nick-algorithmer/p/18120428

相关文章

  • 三种算法实例(二分查找算法、插入排序算法、贪心算法)
    当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应用到日常生活中了。下面我将举......
  • 蓝桥杯练习系统(算法训练)ALGO-963 转圈游戏
    资源限制内存限制:128.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s问题描述n个小伙伴(编号从0到n-1)围坐一圈玩游戏。按照顺时针方向给n个位置编号,从0到n-1。最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置,……,依此类推。游戏规......
  • 蓝桥杯练习系统(算法训练)ALGO-962 积木大赛
    资源限制内存限制:128.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s问题描述THU幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。在搭建开始......
  • 有趣的算法
    青蛙跳台问题现在一共有n个台阶,一只青蛙每次只能跳一阶或是两阶,那么一共有多少种跳到顶端的方案?例如n=2,那么一共有两种方案,一次性跳两阶或是每次跳一阶。现在请你设计一个Java程序,计算当台阶数为n的情况下,能够有多少种方案到达顶端。解决方法假设青蛙已经站在了顶端(n),那么......
  • C++学习笔记九--模版
    目录前言1.函数模版1.函数模版的概念和定义2.函数模版的实例化2.类模版1.类模版的概念和定义2.类模版的实例化3.示例代码前言        这篇文章介绍下C++中的模版,包括函数模版和类模版。1.函数模版    在编程的过程中,编写函数都会考虑将其写......
  • 协同过滤笔记
    笔记记录一下学习工作中遇到的一些知识,以防遗忘,不清楚的可以回来再看。一些专有名词embedding:隐向量非常重要无处不在召回:粗略计算要返回结果,例如从100W商品中取比较可能的100个负采样负采样(NegativeSampling)是一种用于训练词嵌入模型的技术。在自然语言处理中,词嵌入......
  • Python基础笔记01-Python基础
    Python基础-day1!!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失。观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022Python的web开发(完整版)入门全套教程,零基础入门到项目实战1.文档工具typora2.环境搭建安装Python解释器学习Python语法Python......
  • 基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Alg
    前言协同过滤推荐系统,包括基于用户的、基于项目的息肉通过率等,今天我们读一篇基于项目的协同过滤算法的论文。今天读的论文为一篇名叫《基于项目的协同过滤推荐算法》(Item-BasedCollaborativeFilteringRecommendationAlgorithms)。摘要Recommendersystemsapplyknowledg......
  • 狂神说Java Web学习笔记_HTTP
    HTTP详解HTTP超文本传输协议(HyperTextTransferProtocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。文本:html,字符串….超文本:图片,音乐,视频,定位,地图…….默认端口:80HTTPSHTTPS(全称:HyperTextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP......
  • 狂神说Java Web学习笔记_Maven
    Maven项目架构管理工具我们目前用它就是为了方便导入jar包,可以帮你自动导入一个jar包所依赖的其他jar包。Maven的核心思想:约定大于配置配置环境变量配置阿里云加速镜像maven安装目录的conf/settings.xml在<mirrors></mirrors>标签中添加mirror子节点<mirrors......