민감한 단어 및 텍스트 필터링은 웹 사이트의 필수 기능입니다. 훌륭하고 효율적인 필터링 알고리즘을 설계해야합니다. 얼마 전, 내 친구 (곧 졸업하고 프로그래밍에 참여한 지 얼마되지 않아)가 텍스트 필터링을 읽도록 도와달라고 요청했으며 검색 효율성은 매우 느 렸다고 말했습니다. 프로그램을 끝내고 전체 프로세스가 다음과 같습니다. 민감한 어휘를 읽으십시오. 해시 세트 컬렉션이라면 페이지를 가져와 텍스트를 업로드 한 다음 일치시킵니다. 방금이 과정이 매우 느려야한다고 생각했습니다. 그와 접촉하지 않은 사람에게는 이것 만 생각할 수 있으며보다 진보 된 점은 정규 표현입니다. 그러나 불행히도 어느 쪽도 실현 가능하지 않습니다. 물론, 의식에서 나는 알고리즘이 문제를 해결할 수 있다는 것을 몰랐지만 Google은 그것을 알고 있습니다!
DFA 소개
텍스트 필터링을 구현하는 알고리즘 중에서 DFA는 유일한 구현 알고리즘입니다. DFA는 결정 론적 유한 한 오토 마톤이며, 이는 유한 자동화를 결정하는 것을 의미합니다. 이벤트와 현재 상태, 즉 Event+State = Nextstate를 통해 다음 상태를 얻습니다. 다음 그림은 상태의 전환을 보여줍니다. 이 그림에서 대문자 (S, U, V, Q)는 모든 상태이며 소문자 A와 B는 행동입니다. 위 그림을 통해 다음 관계를 볼 수 있습니다.
씨줄
s ------> 미국 ------> vu ------> V.
민감한 워드 필터링을 구현하는 알고리즘에서는 작업을 줄여야하며 DFA는 DFA 알고리즘에 거의 계산이없고 상태 변환 만 사용하지 않아야합니다.
Java는 DFA 알고리즘을 구현하여 민감한 단어 필터링을 구현합니다
Java에서 민감한 워드 필터링을 구현하는 핵심은 DFA 알고리즘의 구현입니다. 먼저 위의 그림을 분석하겠습니다. 이 과정에서 우리는 다음 구조가 더 명확 할 것이라고 생각합니다.
동시에 여기에는 상태 전환이나 조치가 없으며 쿼리 (찾기) 만 있습니다. 우리는 s query u, v를 통해 u query v, p를 통해 v 쿼리를 통해 생각할 수 있습니다. 이러한 변형을 통해 우리는 Java 컬렉션을 사용하여 상태의 전환을 검색으로 전환 할 수 있습니다.
틀림없이, 우리의 민감한 시소러스에 일본인, 일본 악마, 마오 제 (Mao Ze)에 몇 가지 민감한 단어가 추가되었습니다. 동. 그렇다면 어떤 종류의 구조를 구축해야합니까?
첫 번째 : 쿼리 데이 ---> {book}, 쿼리 북 ---> {people, devil}, query person ---> {null}, query ghost ---> {child}. 모양은 다음과 같습니다.
아래 그림을 확장하겠습니다.
이런 식으로, 우리는 민감한 시소러스를 하나씩 비슷한 나무로 만들어서 단어가 민감한 단어인지 판단 할 때 검색 일치 범위를 크게 줄입니다. 예를 들어, 일본인을 판단하려면 첫 번째 단어를 기반으로 검색 해야하는 나무를 확인한 다음이 나무에서 검색 할 수 있습니다.
그러나 민감한 단어가 끝났다고 어떻게 판단합니까? 식별 비트를 사용하여 판단하십시오.
따라서 여기의 핵심은 그러한 민감한 단어 나무를 만드는 방법입니다. 아래는 Java의 Hashmap을 사용하여 DFA 알고리즘을 예로 들어 구현했습니다. 특정 프로세스는 다음과 같습니다.
일본인, 일본 악마
1. Hashmap에서 "Day"쿼리가 해시 맵에 존재하는지 확인하십시오. 그것이 존재하지 않는 경우, "day"로 시작하는 민감한 단어가 아직 존재하지 않음을 증명하고 우리는 그러한 나무를 직접 만들어냅니다. 3으로 점프하십시오.
2. 해시 맵에서 찾으면 "일"으로 시작하는 민감한 단어가 있음을 나타냅니다. hashmap = hashmap.get ( "day")를 설정하고 1으로 점프하고 "this"와 "person"을 차례로 일치시킵니다.
3. 단어가 단어의 마지막 단어인지 결정하십시오. 민감한 단어의 끝을 의미하는 경우 플래그 비트 isend = 1을 설정하고 그렇지 않으면 플래그 비트를 설정하십시오.
프로그램 구현은 다음과 같습니다.
/** * 민감한 어휘를 읽고, 민감한 단어를 해시 세트에 넣고, DFA 알고리즘 모델을 구축합니다. } *} *} * 5 = { * isend = 0 * star = { * isend = 0 * red = { * isend = 0 * flag = { * isend = 1 *} *} *} *} *} * @author chenming * @Date 2014 년 4 월 20 일 오후 20시 * @Param Keywordset ThesUrus * @versourus * @verionsion 0 */ Ssurus * "rawtypes", "unchecked"}) private void addsensitivewordtohashmap (set <string> keywordset) {insitivewordmap = new Hashmap (keywordsetsize ()); // 팽창 된 단어 컨테이너를 초기화하여 확장 작업을 줄입니다. string key = null; map nowmap = null; map <string, String> newwormap = null; // iteration keywordset iterator <string> iterator = keywordsetiterator (); while (iteratorhasnext ()) {key = iteratornext (); // 키워드 nowmap = insitiveWordMap; for (int i = 0; i <kyylength (); i ++) {char keychar = keycharat (i); // char-type 객체로 변환 wordmap = nowmapget (keychar); // get if (wordMap! = null) {//이 키가 존재하는 경우 직접 할당 nowmap = (map) WordMap; } else {// 존재하지 않으면 맵을 작성하고 마지막 newwormap <string, string> ()가 아니기 때문에 맵을 동시에 0으로 설정합니다. NewworMapput ( "isend", "0"); // 마지막 nowmapput (keychar, newwormap); nowmap = newwormap; } if (i == kylength () -1) {nowmapput ( "isend", "1"); //마지막} } } } }달리기에 의해 얻은 해시 맵 구조는 다음과 같습니다.
{5 = {star = {red = {isend = 0, flag = {isend = 1}}, isend = 0}, isend = 0}, isend = 0}, 중국 = {isend = 0, country = {isend = 0, people = {isend = 1}, male = {isend = 0, people =}}}
우리는 민감한 시소러스에 대한 간단한 방법을 구현 했으므로 검색을 구현하는 방법은 무엇입니까? 검색 프로세스는 해시 맵의 GET 구현에 지나지 않습니다. 당신이 그것을 발견하면, 그것은 단어가 민감한 단어임을 증명합니다. 그렇지 않으면 민감한 단어가 아닙니다. 이 과정은 다음과 같습니다. 우리가 "오랫동안 중국인들에게 살고있다"는 일치한다면.
1. 첫 번째 단어 "first"라는 단어는 해시 맵에서 찾을 수 있습니다. 새 맵 = hashmap.get ( "")를 가져옵니다.
2. map == null이라면 민감한 단어가 아닙니다. 그렇지 않으면 3으로 건너 뜁니다
3. get is and the map에서 단어가 1과 같은지 여부를 결정하십시오. isend == 1 인 경우 단어가 민감한 단어라는 것을 의미합니다. 그렇지 않으면 1로 건너 뜁니다.
이 단계를 통해 우리는 "중국인"이 민감한 단어라는 것을 판단 할 수 있지만, "중국 여성"을 입력하면 민감한 단어가 아닙니다.
/*** 텍스트에 민감한 문자가 포함되어 있는지 확인하십시오. 점검 규칙은 다음과 같습니다. <br> * @author chenming * @author chenming * @param txt * @param tegt * @param matchtype * @return, 존재하는 경우, 민감한 단어 캐릭터의 길이를 반환하고, 그것이 존재하지 않으면, 그것은 0 * @suppresswarnings (@suppresswarnings) (@suppress onings) (@suppress) public int checksensitiveword (String txt, int beginindex, int matchtype) {boolean flag = false; // 민감한 단어 끝 마크 비트 : 단 1 민감한 단어 int matchflag = 0의 경우 사용됩니다. // 일치하는 식별자의 수는 기본적으로 char word = 0입니다. map nowmap = insitivewordmap; for (int i = beginIndex; i <txtlength (); i ++) {word = txtcharat (i); nowmap = (map) nowmapget (Word); // 지정된 키를 가져옵니다 if (nowmap! = null) {// 존재, 마지막 matchflag ++인지 확인하십시오. // 해당 키, 일치하는 식별자 +1 if ( "1"equals (nowmapget ( "isend"))) {// 마지막 일치하는 규칙 인 경우 루프를 종료하고 일치하는 식별자 번호 깃발 = true; // 끝 플래그는 (intivewordfilterminMatchType == matchType) if true입니다. {// 최소 규칙이 직접 반환되고 최대 규칙은 계속 중단을 찾아야합니다. }}} else {// 존재하지 않으며 직접 끊어집니다. }}} if (matchflag <2 &&! flag) {matchflag = 0; } return matchflag; }기사의 끝에서 나는 Java를 사용하여 민감한 단어 필터링을 구현하기 위해 파일 다운로드를 제공합니다. 아래는이 알고리즘의 효율성과 신뢰성을 증명하는 테스트 클래스입니다.
public static void main (string [] args) {insitivewordfilter 필터 = new inritiveWordFilter (); SystemOutPrintln ( "민감한 단어 수 :" + FilterSensitiveWordMapsize ()); String String = "너무 많은 슬픈 감정은 수유 기본 화면의 음모로 제한 될 수 있습니다. 주인공은 자살 가이드를 점차적으로 풀어주고 자신의 경험의 슬픔에 관심을 갖는 방법을 사용하려고합니다." + "파룬 공의 역할은 주인공의 Xihongke Alliance의 분노와 슬픔과 슬픔을 따르고 그의 감정을 화면 음모에 너무 멀리 붙인 다음 움직이고 울고있는 것입니다." + "슬퍼한다면 누군가의 팔에 누워 마음이나 휴대 전화 카드 복사 장치를 설명합니다. 레드 와인 한 잔. 영화. 깊고 조용한 밤에는 전화를 닫고 조용히 응시합니다."; SystemMoutPrintln ( "감지 할 단어 수 :" + stringLength ()); long begintime = SystemCurrentTimeMillis (); set <string> set = filtergetSensitiveword (문자열, 1); Long Endtime = SystemCurrentTimeMillis (); SystemMoutPrintln ( "진술의 민감한 단어의 수는" + setsize () + ". 포함 :" + set); SystemOutPrintln ( "총 시간은" + (endtime -begintime)); } 실행 결과 :
위의 결과에서, 우리는 771 개의 민감한 어휘 데이터베이스가 있고, 탐지 문장의 길이는 184 자이며, 6 개의 민감한 단어가 발견됩니다. 총 1 밀리 초가 걸렸습니다. 가시 속도는 여전히 매우 상당합니다.
다음 두 문서 다운로드가 제공됩니다.
Desktop.rar (http://xiazai.vevb.com/201611/yuanma/desktop_jb51.rar)는 두 개의 Java 파일을 포함하고 있으며, 하나는 민감한 단어 데이터베이스 (민감한 단어)를 읽는 것입니다. (iscontaintsensitiveword (String txt, int matchtype)), 민감한 단어 (getSensitiveword (String Txt, int matchtype)) 및 민감한 단어 대체 (replacesEnsitiveWord (String txt, int matchType, String ReleceChar)).
민감한 시소러스 : 클릭하여 다운로드하십시오
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.