DFA 敏感词过滤系统

相关项目
https://github.com/fwwdn/sensitive-stop-words
https://github.com/antlinker/go-dirtyfilter
https://github.com/importcjj/sensitive
https://github.com/syyongx/go-wordsfilter
https://github.com/871041532/ZMatchForLua
https://github.com/houbb/sensitive-word
https://github.com/elulis/sensitive-words
https://github.com/lsj575/wordfilter
https://github.com/zoooozz/filter-service
https://gitee.com/jshzhj/associate
https://github.com/miraclesu/keywords-filter
https://github.com/smartwalle/sx
https://github.com/syyongx/go-wordsfilter
https://github.com/killtw/lemonade
https://giters.com/topics/sensitive-word-filter
https://git.pandolar.top/pyloque/fastscan
https://github.com/toolgood/ToolGood.Words
https://github.com/NitroRCr/Words-away
https://github.com/observerss/textfilter



能够实现敏感词过滤功能的方法有很多



方法有很多,我简单罗列了几个。



1、直接将敏感词组织成String后,利用indexOf方法来查询。



2、传统的敏感词入库后SQL查询。



3、利用Lucene建立分词索引来查询。



4、利用DFA算法来进行。



显然,方法1和方法2在性能上基本无法满足IM系统高效处理消息的需求,放弃。



方法3,采用Lucene建立本地分词索引,将消息内容分词后,在索引库里搜索。这个方法较复杂,且分词效率也不会很高,放弃。



大多数的敏感词过滤系统采用的是方法4,DFA算法。



二、DFA简介



DFA是什么?这里有必要简单介绍一下这个概念(这部分看不懂没关系,可以跳过)。



1、DFA定义



DFA翻译成中文是“确定有穷自动机 ”



定义:一个确定有穷自动机(DFA)M是一个五元组:M=(K,Σ,f,S,Z)其中



① K是一个有穷集,它的每个元素称为一个状态;



② Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号字母表;



③ f是转换函数,是K×Σ→K上的映射(且可以是部分函数),即,如 f(ki,a)=kj,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;



④ S ∈ K是唯一的一个初态;



⑤ Z⊂K是一个终态集,终态也称可接受状态或结束状态。



2、DFA例子



3、DFA状态图表示



假定DFA M含有m个状态,n个输入字符,那么这个状态图含有m个节点,每个节点最多有n个弧射出,整个图含有唯一一个初态点和若干个终态点,初态节点冠以双箭头“=>”,终态节点用双圈表示,若f(ki ,a)=kj,则从状态结点ki到状态节点kj画标记为a的弧。



4、DFA所接受



对于Σ* 中的任何符号串t,若存在一条从初态到某一终态的道路,且这条道路上所有弧的标记连接成的字符串等于t,则称t可为DFA M所接受,若M的初态同时又是终态,则空字可为M所识别(接受)。



即:若 t∈ Σ* , f(S, t)=P, 其中S为M的开始状态,P∈Z,Z为 终态集。



则称 t 为 DFA M所接受(识别)。



如果看懂了DFA的介绍,我们可以这么理解敏感词过滤系统。用需要被过滤的敏感词构建一个DFA(确定有穷自动机 ),然后遍历需要过滤的文本,判断文本中是否有DFA可接受(识别)的字符串即可。



如果没有看懂DFA,看下边一节也OK。



三、用Trie树构建DFA



Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。



假设有b,abc,abd,bcd,abcd,efg,hii 这7个单词(实际使用中,这些单词就是敏感词),我们构建的树

https://www.pianshen.com/article/50321135652/
https://www.fx361.com/page/2020/0513/6655491.shtml



https://www.cnblogs.com/c-cloud/p/3224788.html
https://golangrepo.com/tag/sensitive-word-filter
https://www.mianshigee.com/project/syyongx-go-wordsfilter
https://cloud.tencent.com/developer/article/1525526
https://my.oschina.net/mickelfeng/blog/845545
https://blog.csdn.net/ma2595162349/article/details/113778396
https://www.cnblogs.com/sunlong88/p/11980046.html?ivk_sa=1024320u
https://www.jianshu.com/p/b8e982dcb093?hmsr=toutiao.io
https://pythonrepo.com/repo/toolgood-ToolGood-Words-python-text-processing
https://blog.csdn.net/liyunlong41/article/details/85160209
https://studygolang.com/articles/20848
https://www.cnblogs.com/sunlong88/p/11980046.html
https://www.jianshu.com/p/b8e982dcb093



相关服务供应商
https://www.ishumei.com/new/product/tj/text
https://ai.baidu.com/tech/textcensoring?track=cp:ainsem%7Cpf:pc%7Cpp:chanpin-neirongshenhe%7Cpu:neirongshenhe-guolv%7Cci:%7Ckw:10014538
https://dun.163.com/product/text-detection?from=baiduP_FLJ_C210326PX156&sdclkid=ASD6AOApALFs15fGAo&renqun_youhua=1892658


Category arch