敏感語フィルタリング機能を簡単に実現
4466 ワード
現在ではほとんどのページに敏感語フィルタリング機能が存在しており、最近開発プロジェクトの際には、敏感語フィルタリング機能が必要となり、多くのブログを参考にして、独自の開発コードをまとめました.一、敏感辞書を構築ファイルデータを読み込み、HashMapに保存し、DFAモデル(辞書ツリー)を構築する
二、敏感語のツール類敏感語ライブラリを構築し、javaが提供するreplaceAll方法を利用して敏感語の置換を実現する.テキスト内の機密語の集合を取得する方法は、次のとおりです.
注意:minMatchTypeとmaxMatchTypeの設定は、主に敏感語長が1つの場合は置き換えない
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つの場合は置き換えない