敏感語フィルタリング機能を簡単に実現

4466 ワード

現在ではほとんどのページに敏感語フィルタリング機能が存在しており、最近開発プロジェクトの際には、敏感語フィルタリング機能が必要となり、多くのブログを参考にして、独自の開発コードをまとめました.一、敏感辞書を構築ファイルデータを読み込み、HashMapに保存し、DFAモデル(辞書ツリー)を構築する
public class SensitiveWordInit {

    public static Map sensitiveWordMap = null;


    /**
     *   
     * @return
     * @throws Exception
     */
    public Set LoadSetitiveWord() throws Exception{
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        Set set = new HashSet();
        try{
            inputStream = getClass().getClassLoader().getResourceAsStream("CensorWords.txt");

            inputStreamReader = new InputStreamReader(inputStream,"UTF-8");

            bufferedReader = new BufferedReader(inputStreamReader);

            String str = null;
            while((str=bufferedReader.readLine())!=null){
                set.add(str);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(bufferedReader!=null){
                bufferedReader.close();
            }
            if(inputStreamReader!=null){
                inputStreamReader.close();
            }
            if(inputStream!=null){
                inputStream.close();
            }
        }
        return set;
    }

    /**
     *   HashMap
     * @param keyWordSet
     * @return
     */
    public Map addSensitiveWordToHashMap(Set keyWordSet){
        sensitiveWordMap  = new HashMap(keyWordSet.size());
        Map nowMap = null;
        Iterator iterator = keyWordSet.iterator();
        while(iterator.hasNext()){
            String str = (String) iterator.next();
            nowMap = sensitiveWordMap;
            for(int i = 0;i newMap = new HashMap();
                    newMap.put("isEnd","0");
                    nowMap.put(word,newMap);
                    nowMap = newMap;
                }
                if(i==str.length()-1){
                    nowMap.put("isEnd","1");
                }
            }
        }
        return sensitiveWordMap;
    }
}

二、敏感語のツール類敏感語ライブラリを構築し、javaが提供するreplaceAll方法を利用して敏感語の置換を実現する.テキスト内の機密語の集合を取得する方法は、次のとおりです.
public class SensitiveWordUtils {
    /**
     *  
     */
    public static Map sensitiveWordMap = null;

    /**
     *  
     */
    public static int minMatchType = 1;

    /**
     *  
     */
    public static int maxMatchType = 2;

    /**
     *   beginIndex 
     * @param txt
     * @param beginIndex
     * @param matchType
     * @return
     */
    public static int checkSensitiveWordSum(String txt, int beginIndex, int matchType) throws Exception{
        boolean flag = false;
        int sensitiveSum = 0;   // 
        sensitiveWordMap = SensitiveWordInit.sensitiveWordMap;
        for(int i = beginIndex;i getSensitiveWord(String txt,int matchType) throws  Exception{
        Set sensitiveWord = new HashSet();
        for (int i = 0; i < txt.length(); i++) {
            int sum = checkSensitiveWordSum(txt,i,matchType);
            if (sum > 0) {
                //  
                sensitiveWord.add(txt.substring(i, i + sum));
                i = i + sum - 1;   // i 
            }
        }
        return sensitiveWord;
    }

    /**
     *  
     *   , “***”
     * @param txt
     * @param matchType
     * @return
     */
    public static String replaceSensitiveWord(String txt, int matchType) throws Exception{
        String resultTxt = txt;
        Set set = getSensitiveWord(txt, matchType);
        Iterator iterator = set.iterator();
        String word = null;   // 
        String replaceTxt = "***";   //  , “***”
        while (iterator.hasNext()) {
            word = iterator.next();
            resultTxt = resultTxt.replaceAll(word,replaceTxt);
        }
        return resultTxt;
    }
}

注意:minMatchTypeとmaxMatchTypeの設定は、主に敏感語長が1つの場合は置き換えない