1. 서문
개발 중에 일부 사용자의 텍스트 제출이 종종 처리되므로 민감한 단어를 필터링하는 기능이 포함됩니다. 참조 자료에서 DFA 유한 상태 머신 알고리즘의 구현은 지시 된 그래프를 만드는 데 사용됩니다. 민감한 단어와 광고 슬로건의 필터링이 완료되었으며 효율성이 우수하므로 공유하십시오.
특정 구현 :
1. 케이스 필터링을 일치시킵니다
2. 전체 폭 반 넓은 필터를 일치시킵니다
3. 일치 필터 일시 정지 단어 필터링.
4. 민감한 단어에 대해 단어 필터링을 반복하십시오.
예를 들어:
다음 유형의 필터링 감지를 지원합니다.
못쓰게 만들다
젠장 케이스
전체 폭 반 폭
F !!! u & c ### k 일시 정지 단어
ffuuuccccckkk 반복 단어
민감한 단어를 필터링하는 방법에는 여러 가지가 있습니다. 지금 이해하는 몇 가지 유형을 간략하게 설명하겠습니다.
① 데이터베이스에서 민감한 단어를 쿼리하고 각 민감한 단어를 루프 한 다음 입력 텍스트에서 처음부터 끝까지 검색 하여이 민감한 단어가 있는지 확인하십시오.
무뚝뚝하게 말하면,이 방법은 하나를 찾는 것입니다.
장점 : 너무 쉽습니다. 기본적으로 Java 코드로 구현하는 것은 어려운 일이 아닙니다.
단점 :이 효율성은 내 마음에 10 만 개가 넘는 잔디 진흙 말을 달리고 일치하는 것이 약간 고통 스럽습니까? 영어로된다면 영어와 같은 말이없는 것을 찾을 수 있습니다.
A는 민감한 단어입니다. 내가 영어 문서 인 경우 민감한 단어를 몇 번이나 처리해야합니까? 누구든지 말해 줄 수 있습니까?
전설적인 DFA 알고리즘 (가난한 오토마 타)은 내가 당신과 공유하고 싶은 것입니다. 결국, 그것은 더 일반적인 느낌입니다. 모든 사람이 알고리즘의 원칙을 스스로 확인할 수 있기를 바랍니다.
정보는 여기에 자세히 설명되지 않습니다.
장점 : 적어도 위의 SB보다 더 효율적입니다.
단점 : 알고리즘을 배운 사람들에게는 어렵지 않아야하지만 사용하기는 어렵지 않습니다. 이해하기가 약간 고통스럽고 일치하는 효율성이 높지 않으며 메모리를 소비합니다.
더 민감한 단어가 많을수록 메모리가 더 많이 소비됩니다.
세 번째 유형은 여기에 구체적으로 설명되어 있습니다. 즉, 알고리즘을 직접 작성하거나 기존 알고리즘을 기반으로 최적화해야합니다. 이것은 또한 Xiao Alan이 추구하는 것입니다.
높은 영역 중 하나 인 음란 한 형제가 자신의 아이디어를 가지고 있다면 Xiao Alan을 잊지 마십시오. Xiao Alan의 QQ : 810104041을 추가하여 Xiao Alan에게 두 가지 트릭을 가르 칠 수 있습니다.
2. 코드 구현
디렉토리 구조는 다음과 같습니다.
리소스 리소스 디렉토리에서 :
stopwd.txt : 일시 정지 단어, 일치 시간은 직접 필터링됩니다.
wd.txt : 민감한 시소러스.
1. WordFilter 민감한 단어 필터링 범주
패키지 org.andy.sensitivewdfilter; import java.io.bufferedReader; import java.io.ioexception; import java.io.inputStreamReader; java.util.arraylist 가져 오기; java.util.hashmap import; java.util.hashset 가져 오기; Java.util.list 가져 오기; java.util.map import; java.util.set import; import org.andy.sensitivewdfilter.util.bcconvert; /** * 생성 시간 : 2016 년 8 월 30 일 오후 3시 12 분 오후 9시 * * 아이디어 : 필터 세트를 만들어 0 ~ 65535의 모든 숯이 민감한 단어의 시작 부분에서 시작하는지 여부를 열거합니다 * * 민감한 단어에서 시작하는지 여부를 결정하십시오 | | 헤드 노드를 가져 오는 것도 다음 단어를 얻은 다음 단계별로 DFA 알고리즘 * * @author Andy * @version 2.2 */ public class wordfilter {private static final filterset set = new FilterSet (); // 첫 번째 단어 개인 정적 최종 맵 <integer, wordNode> 노드 = New Hashmap <integer, wordNode> (1024, 1); // 스토리지 노드 개인 정적 최종 세트 <integer> stopwdset = new Hashset <> (); // 일시 중지 단어 개인 정적 최종 문자 표시 = '*'; // 민감한 워드 필터링 교체 static {try {long a = system.nanoTime (); init (); a = system.nanoTime () -a; System.out.println ( "로딩 시간 :" + a + "ns"); System.out.println ( "로딩 시간 :" + A / 10000000 + "MS"); } catch (예외 e) {새로운 runtimeexception 던지기 ( "초기화 필터 실패"); }} private static void init () {// 민감한 단어 addsensitiveword를 가져옵니다 (readwordfromfile ( "wd.txt")); addStopword (readwordfromfile ( "stopwd.txt")); } / ** * 민감한 단어 추가 * @param path * @return * / private static list <string> readwordfromfile (문자열 path) {list <string> 단어; BufferedReader br = null; {br = new bufferedReader (new inputStreamReader (WordFilter.class.getClassLoader (). getResourCeasStream (Path))); Words = new ArrayList <string> (1200); for (string buf = ""; (buf = br.readline ())! = null;) {if (buf == null || buf.trim (). equals ( "")) 계속; Words.add (buf); }} catch (예외 e) {throw new runtimeexception (e); } 마침내 {try {if (br! = null) br.close (); } catch (ioException e) {}} return Word; } / ** * 잠시 일시 중지 단어 추가 * * @param 단어 * / 개인 정적 void addStopword (최종 목록 <string> words) {if (단어! = null && words.size ()> 0) {char [] chs; for (string curr : words) {chs = curr.tochararray (); for (char c : chs) {stopwdset.add (charconvert (c)); }}}}} / *** DFA 노드 추가* @param words* / private static void addsenitiveword (최종 목록 <string> words) {if (words! = null && words.size ()> 0) {char [] chs; INT FCHA; int lastindex; Wordnode fnode; // (String Curr : Words) {chs = curr.tochararray ()에 대한 첫 번째 문자 노드; FCHAR = CharConvert (CHS [0]); if (! set.contains (fchar)) {// 초기 정의 set.add (fchar); // 첫 번째 플래그를 추가 할 수 있습니다. 어쨌든, 그것은 판단되므로 반복되지 않으므로 fnode = new WordNode (fchar, chs.length == 1); Nodes.put (fchar, fnode); } else {fnode = nodes.get (fchar); if (! fnode.islast () && chs.length == 1) fnode.setlast (true); } lastIndex = chs.length -1; for (int i = 1; i <chs.length; i ++) {fnode = fnode.addifnoexist (charConvert (chs [i]), i == lastIndex); }}}}} / ** * 필터링 판결은 민감한 단어를 가면을 쓴 단어로 변환 * @param src * @return * / public static final String dofilter (final string src) {char [] chs = src.tochararray (); int 길이 = chs.length; int currc; int k; 워드 노드 노드; for (int i = 0; i <길이; i ++) {currc = charConvert (chs [i]); if (! set.contains (curc)) {계속; } node = nodes.get (curc); // 2 일 if (node == null) // 실제로는 발생하지 않으면 연속성에 쓰는 데 사용됩니다. 부울 canmark = 거짓; int Marknum = -1; if (node.islast ()) {// 단일 워드 일치 (day) cangark = true; Marknum = 0; } // 계속 (주간/일) 장기 우선 순위와 일치합니다. // you-3 자매 -4 남편 -5 k = i; for (; ++ k <length;) {int temp = charConvert (chs [k]); if (stopwdset.contains (temp))) 계속; node = node.querysub (temp); if (node == null) // 휴식 없음; if (node.islast ()) {cancemark = true; marknum = k -i; // 3-2}} if (cancemark) {for (k = 0; k <= marknum; k ++) {chs [k+i] = 부호; } i = i + Marknum; }} 새 문자열 (chs)을 반환합니다. } / ** * 민감한 단어가 * @param src * @return * / public static final boolean iscontains (Final String Src) {char [] chs = src.tochararray (); int 길이 = chs.length; int currc; int k; 워드 노드 노드; for (int i = 0; i <길이; i ++) {currc = charConvert (chs [i]); if (! set.contains (curc)) {계속; } node = nodes.get (curc); // 2 일 if (node == null) // 발생하지 않으면 습관적으로 계속 작성됩니다. 부울 canmark = 거짓; if (node.islast ()) {// 단일 워드 일치 (day) cangark = true; } // 장수의 우선 순위와 함께 계속 일치합니다 (여동생) // you-3 자매 -4 남편 -5 k = i; for (; ++ k <length;) {int temp = charConvert (chs [k]); if (stopwdset.contains (temp))) 계속; node = node.querysub (temp); if (node == null) // 휴식 없음; if (node.islast ()) {cancemark = true; }} if (cancemark) {return true; }} 거짓을 반환합니다. } / ** * 대문자 전체 폭 전체 전형 전폭 전폭으로 전폭 전환 * * @param src * @return * / private static int charconvert (char src) {int r = bcconvert.qj2bj (src); return (r> = 'a'&& r <= 'z')? R + 32 : R; }} 안에:
ISCONTAINS : 민감한 단어를 포함할지 여부
도필터 : 필터 민감한 단어
2. WordNode 민감한 단어 노드
패키지 org.andy.sensitivewdfilter; java.util.linkedList 가져 오기; Java.util.list 가져 오기; / ** * 생성 : 2016 년 8 월 30 일 오후 3시 45 분 * * @Author Andy * @version 2.2 */ public class WordNode {private int value; // 노드 이름 개인 목록 <WordNode> 서브 노드; // 자식 노드 개인 부울 islast; // 기본적으로 False Public WordNode (int value) {this.value = value; } public WordNode (int value, boolean Islast) {this.value = value; this.islast = Islast; } / ** * * @param subnode * @return은 들어오는 서브 노드 * / private WordNode addSubnode (Final WordNode 서브 노드) {if (subnodes == null) 서브 노드 = 새 LinkedList <WordNode> (); subnodes.add (서브 노드); 반환 서브 노드; } /*** 있으면 자식 노드를 직접 반환하십시오. 없으면 자식 노드를 생성하고 추가하고 반환하고 반환하고 반환합니다. * @param value * @return */ public wordnode addifnoexist (최종 int 값, 최종 부울 섬) {if (subnodes == null) {return addSubnode (value, islast)); } for (WordNode 서브 노드 : 서브 노드) {if (subnode.value == value) {if (! subnode.islast && islast) subnode.islast = true; 반환 서브 노드; }} return addSubnode (새 WordNode (value, islast)); } public WordNode QuerySub (최종 int 값) {if (subnodes == null) {return null; } for (WordNode 서브 노드 : 서브 노드) {if (subnode.value == value) return subnode; } return null; } public boolean islast () {return Islast; } public void setlast (부울 섬) {this.islast = Islast; } @override public int ashcode () {return value; }}3. 테스트 결과
이 프로젝트에는 민감한 시소러스, 소스 코드, 일시 정지 시소러스 등이 포함됩니다.
프로젝트 소스 코드 : CensitiveWd-filter_jb51.rar
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.