Webプロジェクトにおける敏感語のフィルタリング機能

9845 ワード

今日のプロジェクトで出会った機能の一つは、ユーザーが発表した内容を敏感にフィルタリングすることです.不法な言論を却下したのだ.彼に発表させない.そして同僚が書いたフィルタリング方法を見ました.私は勝手に文字列、爆弾、銃を作って、それからテストしました.そのまま通過しました.そして彼の敏感な辞書には銃を持っている4つの大きな字がある.私は彼が書いたコードを見た.コアロジックは1行しかありません:お客様が入力したtext.contains(彼の敏感な辞書の敏感な語)、集合反復.1つ1つの領域が一致します.そして私はほほほとしました.能率は言わない.どうせ機能が実現しないに違いない.そして自分でネットで調べてみました.牛の実現を見つけて、みんなに分かち合いました.プロジェクトで使用されている場合.containsにいないでください.人に見せて、本当に冗談を言います.コードは以下の通りです.親測が通る.
次は敏感語フィルタです
 
package ideal4j.imp;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @Description:      
 * @Project:test
 * @Author : chenming
 * @Date : 2014 4 20    4:17:15
 * @version 1.0
 */
public class SensitivewordFilter {
	@SuppressWarnings("rawtypes")
	private Map sensitiveWordMap = null;
	public static int minMatchTYpe = 1;      //      
	public static int maxMatchType = 2;      //      

	/**
	 *     ,       
	 */
	public SensitivewordFilter(){
		sensitiveWordMap = new SensitiveWordInit().initKeyWord();
	}

	/**
	 *             
	 * @author chenming
	 * @date 2014 4 20    4:28:30
	 * @param txt    
	 * @param matchType       1:      ,2:      
	 * @return      true,    false
	 * @version 1.0
	 */
	public boolean isContaintSensitiveWord(String txt,int matchType){
		boolean flag = false;
		for(int i = 0 ; i < txt.length() ; i++){
			int matchFlag = this.CheckSensitiveWord(txt, i, matchType); //          
			if(matchFlag > 0){    //  0  ,  true
				flag = true;
			}
		}
		return flag;
	}

	/**
	 *          
	 * @author chenming
	 * @date 2014 4 20    5:10:52
	 * @param txt   
	 * @param matchType      1:      ,2:      
	 * @return
	 * @version 1.0
	 */
	public Set getSensitiveWord(String txt , int matchType){
		Set sensitiveWordList = new HashSet();

		for(int i = 0 ; i < txt.length() ; i++){
			int length = CheckSensitiveWord(txt, i, matchType);    //          
			if(length > 0){    //  ,  list 
				sensitiveWordList.add(txt.substring(i, i+length));
				i = i + length - 1;    // 1   ,   for   
			}
		}

		return sensitiveWordList;
	}

	/**
	 *        
	 * @author chenming
	 * @date 2014 4 20    5:12:07
	 * @param txt
	 * @param matchType
	 * @param replaceChar     ,  *
	 * @version 1.0
	 */
	public String replaceSensitiveWord(String txt,int matchType,String replaceChar){
		String resultTxt = txt;
		Set set = getSensitiveWord(txt, matchType);     //        
		Iterator iterator = set.iterator();
		String word = null;
		String replaceString = null;
		while (iterator.hasNext()) {
			word = iterator.next();
			replaceString = getReplaceChars(replaceChar, word.length());
			resultTxt = resultTxt.replaceAll(word, replaceString);
		}

		return resultTxt;
	}

	/**
	 *        
	 * @author chenming
	 * @date 2014 4 20    5:21:19
	 * @param replaceChar
	 * @param length
	 * @return
	 * @version 1.0
	 */
	private String getReplaceChars(String replaceChar,int length){
		String resultReplace = replaceChar;
		for(int i = 1 ; i < length ; i++){
			resultReplace += replaceChar;
		}

		return resultReplace;
	}

	/**
	 *              ,      :
* @author chenming * @date 2014 4 20 4:31:03 * @param txt * @param beginIndex * @param matchType * @return, , , 0 * @version 1.0 */ @SuppressWarnings({ "rawtypes"}) public int CheckSensitiveWord(String txt,int beginIndex,int matchType){ boolean flag = false; // : 1 int matchFlag = 0; // 0 char word = 0; Map nowMap = sensitiveWordMap; for(int i = beginIndex; i < txt.length() ; i++){ word = txt.charAt(i); nowMap = (Map) nowMap.get(word); // key if(nowMap != null){ // , matchFlag++; // key, +1 if("1".equals(nowMap.get("isEnd"))){ // , , flag = true; // true if(SensitivewordFilter.minMatchTYpe == matchType){ // , , break; } } } else{ // , break; } } if(matchFlag < 2 || !flag){ // 1, matchFlag = 0; } return matchFlag; } public static void main(String[] args) { SensitivewordFilter filter = new SensitivewordFilter(); System.out.println(" :" + filter.sensitiveWordMap.size()); String string = " , 。" + " , ," + " , , , 。"; System.out.println(" :" + string.length()); long beginTime = System.currentTimeMillis(); Set set = filter.getSensitiveWord(string, 1); long endTime = System.currentTimeMillis(); System.out.println(" :" + set.size() + "。 :" + set); System.out.println(" :" + (endTime - beginTime)); } }

次は敏感語カウンタです
package ideal4j.imp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @Description:        ,       HashMap ,  DFA    
 * @Project:test
 * @Author : chenming
 * @Date : 2014 4 20    2:27:06
 * @version 1.0
 */
public class SensitiveWordInit {
	private String ENCODING = "UTF-8";    //    
	@SuppressWarnings("rawtypes")
	public HashMap sensitiveWordMap;

	public SensitiveWordInit(){
		super();
	}

	/**
	 * @author chenming
	 * @date 2014 4 20    2:28:32
	 * @version 1.0
	 */
	@SuppressWarnings("rawtypes")
	public Map initKeyWord(){
		try {
			//      
			Set keyWordSet = readSensitiveWordFile();
			//        HashMap 
			addSensitiveWordToHashMap(keyWordSet);
			//spring  application,  application.setAttribute("sensitiveWordMap",sensitiveWordMap);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sensitiveWordMap;
	}

	/**
	 *       ,      HashSet ,    DFA    :
* = { * isEnd = 0 * = {
* 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 keyWordSet) { sensitiveWordMap = new HashMap(keyWordSet.size()); // , String key = null; Map nowMap = null; Map newWorMap = null; // keyWordSet Iterator 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); // if(wordMap != null){ // key, nowMap = (Map) wordMap; } else{ // , map, isEnd 0, newWorMap = new HashMap(); newWorMap.put("isEnd", "0"); // nowMap.put(keyChar, newWorMap); nowMap = newWorMap; } if(i == key.length() - 1){ nowMap.put("isEnd", "1"); // } } } } /** * , set * @author chenming * @date 2014 4 20 2:31:18 * @return * @version 1.0 * @throws Exception */ @SuppressWarnings("resource") private Set readSensitiveWordFile() throws Exception{ Set set = null; File file = new File("D:\\SensitiveWord.txt"); // InputStreamReader read = new InputStreamReader(new FileInputStream(file),ENCODING); try { if(file.isFile() && file.exists()){ // set = new HashSet(); BufferedReader bufferedReader = new BufferedReader(read); String txt = null; while((txt = bufferedReader.readLine()) != null){ // , set set.add(txt); } } else{ // throw new Exception(" "); } } catch (Exception e) { throw e; }finally{ read.close(); // } return set; } }

テスト:
public static void main(String[] args) {
		SensitivewordFilter filter = new SensitivewordFilter();
		System.out.println("      :" + filter.sensitiveWordMap.size());
		String string = "                        ,                                  。"
				+ "                                                     ,       ,"
				+ "                                  ,     ,                ,          。";
		System.out.println("       :" + string.length());
		long beginTime = System.currentTimeMillis();
		Set set = filter.getSensitiveWord(string, 1);
		long endTime = System.currentTimeMillis();
		System.out.println("            :" + set.size() + "。  :" + set);
		System.out.println("       :" + (endTime - beginTime));
	}

不正な辞書を自分で定義します:SensitiveWord.txt.フォルダの下に勝手に置く.コードの中にはメモリにロードされたスタンバイが読み込まれます
結果:結果は貼れません.不正な内容が含まれているので貼り付けます.直接csdnにカニにあげられました.パブリッシュできません.図の意味を貼る
 
 
ダブルクリック666.牛が追い詰める人は牛が追い詰める