Webプロジェクトにおける敏感語のフィルタリング機能
今日のプロジェクトで出会った機能の一つは、ユーザーが発表した内容を敏感にフィルタリングすることです.不法な言論を却下したのだ.彼に発表させない.そして同僚が書いたフィルタリング方法を見ました.私は勝手に文字列、爆弾、銃を作って、それからテストしました.そのまま通過しました.そして彼の敏感な辞書には銃を持っている4つの大きな字がある.私は彼が書いたコードを見た.コアロジックは1行しかありません:お客様が入力したtext.contains(彼の敏感な辞書の敏感な語)、集合反復.1つ1つの領域が一致します.そして私はほほほとしました.能率は言わない.どうせ機能が実現しないに違いない.そして自分でネットで調べてみました.牛の実現を見つけて、みんなに分かち合いました.プロジェクトで使用されている場合.containsにいないでください.人に見せて、本当に冗談を言います.コードは以下の通りです.親測が通る.
次は敏感語フィルタです
次は敏感語カウンタです
テスト:
不正な辞書を自分で定義します:SensitiveWord.txt.フォルダの下に勝手に置く.コードの中にはメモリにロードされたスタンバイが読み込まれます
結果:結果は貼れません.不正な内容が含まれているので貼り付けます.直接csdnにカニにあげられました.パブリッシュできません.図の意味を貼る
ダブルクリック666.牛が追い詰める人は牛が追い詰める
次は敏感語フィルタです
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.牛が追い詰める人は牛が追い詰める