序
最近有需求做敏感词过滤,网上查询了相关的资料,其中看到了DFA这个名词,哟呵!这词亲切啊!好歹我也是编译原理满学分的人。虽然时间过去挺久了,很多东西都忘记了。词法分析,语法分析,语义分析…这些名词还是历历在目,遥想那年:“最后一排靠门的同学,来回答一下问题” ,“我们的考试,是在炎热的夏天” …
问题思考
好了,打住。从某种意义上来说:判断敏感词这件事 和 词法分析这个过程 是有些类似的。此法分析的时候使用了NFA,DFA来将源row分解成能够阅读的词。而判明敏感词这件事是确定词的终结状态,终结状态很明显:是敏感词,不是敏感词。同时将 词中的字符 作为输入符号。ok,消化一下..
解决思路:将敏感词的每个字符视为改变状态的动作,在词结束之前 任何一个字符都不能让自动机达到最终状态。
接下来思考另一个问题,该用什么数据结构来做这件事。(其实我不假思索就决定要用前缀树来做这事….) 判断敏感词 换个角度可以看做是搜索:搜索一个词的属性。这个属性是 是否为敏感词。说道这里,前缀树来做这种事情不是很适合么?(一切都确定下来了,胜利的方程式已经写下…)
开始实践
模型创建
首先我需要一棵前缀树,所以要想富,先种树…
1 | /* |
代码实现
Talk is cheap, show me the code!
1 | public class SensitiveWordUtil{ |
大功告成?
到这里,其实我已经发现了一个问题了….很多理论上的东西我已经不记得了,本来还想着画个DFA的状态图,结果发现…画出了NFA的图之后就进行不下去了,百度回忆了一下。嗯…子集构造法,最小DFA,抹去死状态….告辞!
结语
整片文就没几个汉字,是我懒了还是不会说话了。我觉得应该是这篇文选题的问题,理论上的东西已经忘记了,只记得个大约摸的操作方法,好在代码还是会写的。我在想啥时候重新开始更新设计模式这个大坑呢?毕竟那边话多…
最后还是要感谢沈老师,要不是那几句魔咒一般的口头禅,我不可能会记住这些东西…还有借我抄笔记的学霸…
Lastvt 拜拜~