大多数论坛和网站为了方便管理都设置了敏感词。
在大多数网站中,敏感词一般是指具有敏感政治倾向(或反执政党倾向)、暴力倾向、不健康色彩或不文明语言的词,有些网站根据自己的实际情况设置了一些只适用于本网站的特殊敏感词。
比如你发了一篇有一些预设词的帖子,就不能发了。或者该单词自动被星号(*)或叉号(x)等代替。或者它是和谐的。
在我看来,过滤敏感词最重要的是写过滤词汇的算法,以及如何过滤掉大量的敏感词。我觉得DFA有个好主意
DFA简介
DFA是文本过滤算法中唯一较好的算法。DFA是确定性有限自动机,即确定性有限自动机,通过事件和当前状态获得下一个状态,即事件状态=nextstate。下图显示了其状态的转换
在这张图片中,大写字母(S,U,V,Q)都是状态,小写字母A和B是动作。通过上图,我们可以看到以下关系
美联航空公司
在敏感词过滤算法中,必须减少计算量,而DFA算法中几乎没有计算量,只有状态转移。
用Java实现DFA算法过滤敏感词
在Java中实现敏感词过滤的关键是DFA算法的实现。首先,我们分析上图。在这个过程中,我们认为下面的结构会更清晰。
同时,没有状态转换,没有操作,只有查询。我们可以认为通过S查询U,V,通过U查询V,p,通过V查询u p,通过这个转换,我们可以把状态转换转换成使用Java集合的搜索。
诚然,在我们的敏感词汇中有几个敏感词:日语、日语、毛泽东语。那么我需要建造什么样的结构呢?
首先:查询日-{this}、查询书-{person,魔鬼}、查询人-{null}、查询鬼-{son}。形成以下结构:
让我们展开下图:
这样,我们将自己的敏感词库构建成一个个相似的树,在判断一个词是否敏感时,大大缩小了匹配范围。比如我们要判断日语,可以根据第一个单词确认需要搜索哪棵树,然后在这个树上搜索。
这个想法是为将来使用而保留的。我会先写一些过滤词汇的简单方法,不涉及算法
Java代码实现
基本思想:在HttpServletRequestWrapper中重写getParameter方法,让用户输入的单词通过这个过滤器,编写一个类来继承它,重写方法,编写一个过滤单词的字典来与输入进行比较
先写一个jsp页面。js是用Ajax刷新的。最近想试试。感觉很好。Ajax需要引入js文件
正文输入类型=' text ' name=' word ' on bulr=' filter(this . value);'id=' filter '/input type=' submit ' value='敏感词筛选'/script type=' text/JavaScript ' src=' http : js/jquery . js '/script script type=' text/JavaScript '函数筛选器(num) {$。Ajax ({type:' post ',//提交方法URL 3360' filterordservlet ',async3360 true,//是否异步请求dataType:'html ',//数据的返回类型为data:{'num':num},//数据的传递值为success3360function (data,text status){//成功执行后,回调此函数处理事务$('#filter ')。val(数据);},error:function(){//未能执行此函数并处理失败的事务警报(“错误”);} }) }/script/body继承了HttpServletRequestWrapper并重写了getParameter方法。
//主要思路是继承HttpServletRequestWrapper,去改写他的getParameter方法,让其有过滤的业务公共类文字过滤器扩展了HttpServletrequestwrapper { public WordFilter(HttpServletrequest)请求){ super(request)};//TODO自动生成的构造函数存根} @覆盖公共字符串getParameter(字符串名称){ //先得到父亲的方法,传入值,得到的值在跟过滤字典中的比较看是否含有,有则替换,没有放过返回String word=super.getParameter(名称);//调用字典中的文字列表字符串列表=单词。getlist();用于(字符串:列表){ //判断是否含有这样字典中的文字if (word.contains(string)) { //将字符串中含有的替换掉word=word.replace(字符串,' * * ');} }返回单词;} }再写一个Servlet,去获取用户输入的字,进行过滤操作
@ WebServlet('/FilterWordServlet ')公共类FilterWordServlet扩展了HttpServlet {私有静态最终长串行版本id=1L;受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)引发ServletException,IOException { //设置请求和编码格式请求。setcharacter encoding(' utf-8 ');回应。setcharacter encoding(' utf-8 ');//自己创建的请求方法,继承与原来的,改写了getParameter方法让其有过滤的业务WordFilter wFilter=新的文字过滤器(请求);字符串字符串=wffilter。getParameter(' num ');系统。出去。println('-');//输出的响应方法。输出在页面上,让创建交互式、快速动态网页应用的网页开发技术得到这个去处理一些业务PrintWriter out=响应。getwriter();out.println(字符串);}受保护的void doPost(httpersvletrequest请求,HttpServletResponse响应)引发ServletException,IOException { //TODO自动生成的方法存根doGet(请求,响应);}}我自己建了一个目录集合的过滤词汇,以后修改可以从这里开始词汇的搜索算法,先建一个词汇类
公共类单词{ //过滤词汇的词典静态列表字符串列表=新数组列表();静态{ list.add('你妹的');名单。加('某人');list.add('滚');} public static ListString GetList(){ return list;} public static void setList(list string list){ words。list=list} }这只是最基础的一种。高级的需要算法的实现,可以思考一下这个美术博士(美术博士的缩写)算法,我感觉很不错
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。