1. Предисловие
Во время разработки часто обрабатываются представления некоторых пользовательских текстов, поэтому они включают функцию фильтрации конфиденциальных слов. Реализация алгоритма машин конечного состояния DFA в эталонных материалах используется для создания направленных графиков. Фильтрация конфиденциальных слов и рекламных лозунгов была завершена, и эффективность хороша, поэтому поделитесь им.
Конкретная реализация:
1. Матч -фильтрация корпуса
2. Сопоставьте ползуговую полгинскую ширину
3. Совместите фильтр паузы фильтрации.
4. Повторите фильтрацию слов для конфиденциальных слов.
Например:
Поддерживает следующее обнаружение фильтрации типа:
ебать
Чувство
Черт возьми полную полоту
f !!! U & C ### K Pause Word
ffuuuuccccckkkk
Есть много способов фильтрации чувствительных слов. Я кратко опишу несколько типов, которые сейчас понимаю:
① Запросите конфиденциальные слова в базе данных, зацикливайте каждое конфиденциальное слово, а затем поищите от начала до конца в входном тексте, чтобы увидеть, существует ли это конфиденциальное слово.
Если это прямо, этот метод состоит в том, чтобы найти один, чтобы иметь дело с другим.
Преимущества: так просто. В основном нет труда внедрить его с помощью кода Java.
Недостатки: эта эффективность заставляет меня бегать в сердце более 100 000 лошадей с травяной грязью, а совпадение немного болезненно? Если это на английском языке, вы найдете очень безмолвную вещь, такую как английский.
A - чувствительное слово. Если я являюсь английским документом, сколько раз он должен обрабатывать конфиденциальные слова? Кто -нибудь может мне сказать?
② Легендарный алгоритм DFA (плохие автоматы) - это именно то, чем я хочу поделиться с вами. В конце концов, это кажется более общим. Я надеюсь, что каждый сможет сами проверить принципы алгоритма.
Информация не будет объяснена подробно здесь.
Преимущества: по крайней мере, это более эффективно, чем вышеуказанный SB.
Недостатки: это не должно быть сложно для тех, кто выучил алгоритмы, но их не сложно использовать. Это немного больно понять, эффективность сопоставления не высока, и она потребляет память.
Чем более чувствительные слова, тем больше памяти он потребляет.
③ Третий тип конкретно объясняется здесь, то есть вы должны написать алгоритм самостоятельно или оптимизировать его на основе существующих алгоритмов. Это также то, что преследует Сяо Алан.
В одном из высоких сфер, если у любого непристойного брата есть свои идеи, не забывайте Сяо Алана. Вы можете добавить QQ Xio Alan's QQ: 810104041, чтобы научить Сяо Алана двум трюкам.
2. Реализация кода
Его структура каталогов следующая:
В каталоге ресурсов ресурсов:
SPENWD.TXT: PAUSE WORD, время соответствия отфильтровано напрямую.
Wd.txt: чувствительный тезаурус.
1. Категория чувствительной к фильтрации слов WordFilter
пакет org.andy.sensitywdfilter; Импорт java.io.bufferedReader; импортировать java.io.ioexception; Импорт java.io.inputStreamReader; импортировать java.util.arraylist; импортировать java.util.hashmap; импортировать java.util.hashset; импортировать java.util.list; импортировать java.util.map; импортировать java.util.set; Импорт org.andy.sensitywdfilter.util.bcconvert; /** * Время создания: 30 августа 2016 года в 15:01:12 * * Идея: создать фильтру, перечисляя, начинаются ли все чары в 0 ~ 65535 в начале конфиденциального слова * * определить, начинаются ли они с чувствительного слова | | Можно ли получить узел головного узла-следующее слово, а затем шаг за шагом перемещать, алгоритм dfa * * @author andy * @version 2.2 */ public class wordfilter {private Static final Filterset set = new FilterSet (); // Хранить первое слово частная статическая конечная карта <integer, wordnode> nodes = new Hashmap <Integer, WordNode> (1024, 1); // Узел хранения частного статического окончательного набора <Integer> stopwdset = new Hashset <> (); // пауза частный статический окончательный знак char = '*'; // Чувствительная фильтрация слов заменить static {try {long a = system.nanotime (); init (); a = System.nanotime () - a; System.out.println («Время загрузки:» + a + "ns"); System.out.println («Время загрузки:» + A / 1000000 + «MS»); } catch (Exception e) {бросить новое runtimeexception ("Фильтр инициализации не удастся"); }} private static void init () {// Получить чувствительное слово AddEensitiveword (heardFromFile ("wd.txt")); AddStopword (redchwordFromFile ("stopwd.txt")); } / ** * Добавить конфиденциальное слово * @param path * @return * / private static list <string> hadwordfromfile (string path) {list <string> words; BufferedReader Br = null; try {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 (Exception e) {бросить новое runtimeexception (e); } наконец {try {if (br! = null) br.close (); } catch (ioException e) {}} возвращает слова; } / ** * Добавить паузу Word * * @param words * / private static void AddStopword (окончательный список <string> words) {if (words! = Null && words.size ()> 0) {char [] chs; for (String curr: words) {chs = curr.tochararray (); для (char c: chs) {stopwdset.add (charconvert (c)); }}}}} / *** Добавить узел dfa* @param vors* / private static void AddSensitiveword (окончательный список <string> words) {if (words! = Null && words.size ()> 0) {char [] chs; int fchar; 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 length = chs.length; int currc; int k; Узел WordNode; for (int i = 0; i <length; i ++) {currc = charconvert (chs [i]); if (! set.contains (currc)) {продолжить; } node = nodes.get (currc); // день 2 if (node == null) // На самом деле это не произойдет, вы привыкли писать его на непрерывности; Boolean Canmark = false; int marknum = -1; if (node.islast ()) {// Одиночное сопоставление слов (день) может mAnmark = true; marknum = 0; } // Продолжение совпадать (день/день) с долгосрочным приоритетом // you-3 Sister-4 Mhuste-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 ()) {canmark = true; marknum = k - i; // 3-2}} if (может (может) {for (k = 0; k <= marknum; k ++) {chs [k+i] = sign; } i = i + marknum; }} вернуть новую строку (chs); } / ** * Содержит ли чувствительные слова * @param src * @return * / public static final boolean iscontains (final String src) {char [] chs = src.tochararray (); int length = chs.length; int currc; int k; Узел WordNode; for (int i = 0; i <length; i ++) {currc = charconvert (chs [i]); if (! set.contains (currc)) {продолжить; } node = nodes.get (currc); // день 2 if (node == null) // Это не происходит, он обычно пишет, продолжите; Boolean Canmark = false; if (node.islast ()) {// Одиночное сопоставление слов (день) может mAnmark = 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 ()) {canmark = true; }} if (может (может) {return true; }} вернуть false; } / ** * Верхишер в нижнюю строчную преобразование полной шириной в полу-ширину * * @param src * @return * / private static int charconvert (char src) {int r = bcconvert.qj2bj (src); return (r> = 'a' && r <= 'z')? r + 32: r; }} в:
Iscontains: включать чувствительные слова
Dofilter: чувствительные к фильтру слова
2. WordNode чувствительные узлы слов
пакет org.andy.sensitywdfilter; импортировать java.util.linkedlist; импортировать java.util.list; / ** * Создано: 30 августа 2016 года в 15:07:45 * * @author andy * @version 2.2 */ public class wordnode {private int value; // имя узла частное список <WordNode> subnodes; // детский узел Private Boolean 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 subnode) {if (subnodes == null) subnodes = new LinkedList <WordNode> (); subnodes.add (subnode); вернуть субнод; } /*** Если есть, верните детский узел напрямую. Если нет, создать и добавить и вернуть дочерний узел * * @param value * @return */ public wordnode AddifnoExist (окончательное значение int, окончательный логический Islast) {if (subnodes == null) {return addsubnode (new wordnode (value, iSlast)); } for (WordNode subnode: subnodes) {if (subnode.value == value) {if (! subnode.islast && iSlast) subnode.islast = true; вернуть субнод; }} return addSubnode (new wordnode (value, islast)); } public wordNode QuerySub (final int value) {if (subnodes == null) {return null; } for (wordnode subnode: subnodes) {if (subnode.value == value) return subnode; } return null; } public Boolean Islast () {return Islast; } public void setlast (Boolean Islast) {this.islast = islast; } @Override public int hashcode () {return value; }}3. Результаты теста
Проект включает в себя чувствительный тезаурус, исходный код, паузу тезауруса и т. Д. Просто запустите пакет Maven и Jar, чтобы работать напрямую.
Исходный код проекта: SensitiveWD-filter_jb51.rar
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.