大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > Java实现敏感词过滤

Java实现敏感词过滤(1)

关键词:过滤敏感词Java  阅读(4182) 赞(16)

[摘要]本文是对Java实现敏感词过滤的讲解,对学习Java编程技术有所帮助,与大家分享。

敏感词、文字过滤是一个网站必不可少的功用,如何设计一个好的、高效的过滤算法是十分有必要的。前段工夫我一个冤家(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率十分慢。我把它顺序拿过去一看,整个进程如下:读取敏感词库、假定HashSet集合中,获取页面上传文字,然后中止婚配。我就想这个进程一定是十分慢的。关于他这个没有接触的人来说我想也只能想到这个,更初级点就是正则表达式。但是十分遗憾,这两种办法都是不可行的。当然,在我看法里没有我也没有认知到那个算法可以处置效果,但是Google晓得!

DFA简介

在完成文字过滤的算法中,DFA是独一比拟好的完成算法。DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是经过event和以后的state失掉下一个state,即event+state=nextstate。下图展现了其外形的转换

2014052300001

在这幅图中大写字母(S、U、V、Q)都是外形,小写字母a、b为举措。经过上图我们可以看到如下关系

    a              b                 b
S -----> U     S -----> V       U -----> V

在完成敏感词过滤的算法中,我们必需求添加运算,而DFA在DFA算法中简直没有什么计算,有的只是外形的转换。

参考文献:http://www.iteye.com/topic/336577

Java完成DFA算法完成敏感词过滤

在Java中完成敏感词过滤的关键就是DFA算法的完成。首先我们对上图中止分析。在这进程中我们以为上面这种构造会愈加明晰明了。

2014052300002

同时这里没有形态转换,没有举措,有的只是Query(查找)。我们可以以为,经过S query U、V,经过U query V、P,经过V query U P。经过这样的转变我们可以将外形的转换转变为运用Java集合的查找。

固然,参与在我们的敏感词库中存在如下几个敏感词:日自己、日本鬼子、毛.泽.东。那么我需求构建成一个什么样的构造呢?

首先:query 日 ---> {本}、query 本 --->{人、鬼子}、query 人 --->{null}、query 鬼 ---> {子}。形如下构造:

2014052300003

上面我们在对这图中止扩展:

2014052300004

这样我们就将我们的敏感词库构建成了一个相似与一颗一颗的树,这样我们判别一个词能否为敏感词时就大大添加了检索的婚配范围。比方我们要判别日自己,依据第一个字我们就可以确认需求检索的是那棵树,然后再在这棵树中中止检索。

但是如何来判别一个敏感词曾经终了了呢?运用标识位来判别。

所以关于这个关键是如何来构建一棵棵这样的敏感词树。上面我已Java中的HashMap为例来完成DFA算法。详细进程如下:

日自己,日本鬼子为例

1、在hashMap中查询“日”看其能否在hashMap中存在,假定不存在,则证明已“日”扫尾的敏感词还不存在,则我们直接构建这样的一棵树。

跳至3。

2、假定在hashMap中查找到了,标明存在以“日”扫尾的敏感词,设置hashMap = hashMap.get("日"),跳至1,顺次婚配“本”、“人”。

3、判别该字能否为该词中的最初一个字。若是表示敏感词终了,设置标志位isEnd = 1,否则设置标志位isEnd = 0;

2014052300005

 

顺序完成如下:

/*
     * 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型:<br>
     * 中 = {
     *      isEnd = 0
     *      国 = {<br>
     *           isEnd = 1
     *           人 = {isEnd = 0
     *                民 = {isEnd = 1}
     *                }
     *           男  = {
     *                  isEnd = 0
     *                   人 = {
     *                        isEnd = 1
     *                       }
     *               }
     *           }
     *      }
     *  五 = {
     *      isEnd = 0
     *      星 = {
     *          isEnd = 0
     *          红 = {
     *              isEnd = 0
     *              旗 = {
     *                   isEnd = 1
     *                  }
     *              }
     *          }
     *      }
     * @author chenming 
     * @date 2014年4月20日 下午3:04:20
     * @param keyWordSet  敏感词库
     * @version 1.0
     /
    @SuppressWarnings({ "rawtypes", "unchecked" })
    private void addSensitiveWordToHashMap(Set<String> keyWordSet) {
        sensitiveWordMap = new HashMap(keyWordSet.size());     //初始化敏感词容器,添加扩容操作
        String key = null;
Map nowMap = null; Map<String, String> newWorMap = null; //迭代keyWordSet Iterator<String> iterator = keyWordSet.iterator(); while(iterator.hasNext()){ key = iterator.next(); //关键字 nowMap = sensitiveWordMap; for(int i = 0 ; i < key.length() ; i++){ char keyChar = key.charAt(i); //转换成char型 Object wordMap = nowMap.get(keyChar); //获取

            <span style="color: rgb(0,0,255)">if</span>(wordMap != <span style="color: rgb(0,0,255)">null</span>){        <span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">假定存在该key,直接赋值</span>
                nowMap =<span style="color: rgb(0,0,0)"> (Map) wordMap;
            }
            </span><span style="color: rgb(0,0,255)">else</span>{     <span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">不存在则,则构建一个map,同时将isEnd设置为0,由于他不是最初一个</span>
                newWorMap = <span style="color: rgb(0,0,255)">new</span> HashMap&lt;String,String&gt;<span style="color: rgb(0,0,0)">();
                newWorMap.put(</span>&quot;isEnd&quot;, &quot;0&quot;);     <span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">不是最初一个</span>

nowMap.put(keyChar, newWorMap); nowMap = newWorMap; }

            </span><span style="color: rgb(0,0,255)">if</span>(i == key.length() - 1<span style="color: rgb(0,0,0)">){
                nowMap.put(</span>&quot;isEnd&quot;, &quot;1&quot;);    <span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">最初一个</span>

} } } }

«上一页12下一页»

相关Java技巧推荐

    暂时没有相关推荐



    相关评论