1. Pendahuluan
Selama pengembangan, pengajuan teks beberapa pengguna sering diproses, sehingga melibatkan fungsi penyaringan kata -kata sensitif. Implementasi algoritma mesin status terbatas DFA dalam bahan referensi digunakan untuk membuat grafik terarah. Penyaringan kata -kata sensitif dan slogan iklan telah selesai, dan efisiensinya bagus, jadi bagikan.
Implementasi spesifik:
1. Pencocokan Penyaringan Casing
2. Cocokkan filter setengah lebar lebar penuh
3. Cocokkan filter pause penyaringan kata.
4. Ulangi penyaringan kata untuk kata -kata sensitif.
Misalnya:
Mendukung deteksi pemfilteran tipe berikut:
fuck
Kasing bercinta
Persetan dengan lebar lebar penuh
f !!! u & c ### k jeda kata
Kata pengulangan ffuuuucccccckkk
Ada banyak cara untuk memfilter kata -kata yang sensitif. Saya akan menjelaskan secara singkat beberapa jenis yang saya pahami sekarang:
① Permintaan kata -kata sensitif dalam database, lilitkan setiap kata sensitif, dan kemudian cari dari awal hingga berakhir dalam teks input untuk melihat apakah kata sensitif ini ada.
Terus terang, metode ini berarti menemukan satu untuk berurusan dengan yang lain.
Keuntungan: Sangat mudah. Pada dasarnya tidak ada kesulitan untuk mengimplementasikannya dengan kode Java.
Kerugian: Efisiensi ini membuat saya menjalankan lebih dari 100.000 kuda lumpur rumput di hati saya, dan pencocokannya agak menyakitkan? Jika ada dalam bahasa Inggris, Anda akan menemukan hal yang sangat terdiam, seperti bahasa Inggris.
A adalah kata yang sensitif. Jika saya adalah dokumen bahasa Inggris, berapa kali harus memproses kata -kata yang sensitif? Adakah yang bisa memberitahuku?
② Algoritma DFA legendaris (Automata Buruk) adalah persis apa yang ingin saya bagikan dengan Anda. Bagaimanapun, rasanya lebih umum. Saya berharap semua orang dapat memeriksa prinsip -prinsip algoritma sendiri.
Informasi tidak akan dijelaskan secara rinci di sini.
Keuntungan: Setidaknya lebih efisien daripada SB di atas.
Kerugian: Seharusnya tidak sulit bagi mereka yang telah belajar algoritma, tetapi tidak sulit untuk menggunakannya. Agak menyakitkan untuk dipahami, efisiensi yang cocok tidak tinggi, dan mengkonsumsi memori.
Kata -kata yang lebih sensitif, semakin banyak memori yang dikonsumsi.
③ Jenis ketiga secara khusus dijelaskan di sini, yaitu, Anda harus menulis sendiri algoritma, atau mengoptimalkannya berdasarkan algoritma yang ada. Ini juga yang dikejar Xiao Alan.
Salah satu alam tinggi, jika ada saudara lelaki yang cabul memiliki idenya sendiri, jangan lupa Xiao Alan. Anda dapat menambahkan QQ Xiao Alan: 810104041 untuk mengajar Xiao Alan dua trik untuk dimainkan.
2. Implementasi Kode
Struktur direktori adalah sebagai berikut:
Di Direktori Sumber Daya Sumber Daya:
stopwd.txt: jeda kata, waktu cocok disaring secara langsung.
WD.TXT: Thesaurus sensitif.
1. Kategori penyaringan kata sensitif wordfilter
paket org.andy.sensitiveWdfilter; impor java.io.bufferedReader; impor java.io.ioException; impor java.io.inputStreamReader; impor java.util.arraylist; impor java.util.hashmap; impor java.util.hashset; impor java.util.list; impor java.util.map; impor java.util.set; impor org.andy.sensitiveWdfilter.util.bcconvert; /** * Waktu Penciptaan: 30 Agustus 2016 jam 3:01:12 PM * * Ide: Buat filterset, sebutkan apakah semua karakter 0 ~ 65535 mulai dari awal kata sensitif * * Tentukan apakah mereka mulai dengan kata sensitif | | Apakah boleh mendapatkan simpul kepala-kata berikutnya dan kemudian melintasi langkah demi langkah, algoritma DFA * * @author Andy * @Version 2.2 */ Kelas publik WordFilter {private static final filterset set = new filterset (); // Simpan kata pertama kata private static peta <integer, wordnode> node = hashmap baru <integer, wordnode> (1024, 1); // simpul penyimpanan set akhir statis privat <integer> stopwdset = hashset baru <> (); // jeda kata private static final char tanda = '*'; // Penyaringan kata sensitif ganti statis {coba {long a = system.nanoTime (); init (); a = system.nanoTime () - a; System.out.println ("waktu pemuatan:" + a + "ns"); System.out.println ("waktu pemuatan:" + a / 1000000 + "ms"); } catch (Exception e) {lempar runtimeException baru ("Filter Inisialisasi Gagal"); }} private static void init () {// Dapatkan kata sensitif addSensitiveWord (readwordFromFile ("wd.txt")); addStopword (ReadwordFromFile ("stopwd.txt")); } / ** * Tambahkan kata sensitif * @param path * @return * / daftar statis privat <string> readwordFromFile (string path) {list <string> kata; BufferedReader BR = null; coba {br = new buferedReader (inputStreamReader baru (wordfilter.class.getClassLoader (). getResourceAsstream (path))); Words = New ArrayList <String> (1200); untuk (string buf = ""; (buf = br.readline ())! = null;) {if (buf == null || buf.trim (). Equals ("")) lanjutkan; words.add (buf); }} catch (Exception e) {lempar runtimeException baru (e); } akhirnya {coba {if (br! = null) br.close (); } catch (ioException e) {}} mengembalikan kata; } / ** * Tambahkan kata jeda * * @param Words * / private static void addStopWord (daftar akhir <string> kata) {if (words! = Null && words.size ()> 0) {char [] chs; untuk (string Curr: Words) {chs = Curr.tochararray (); untuk (char c: chs) {stopwdset.add (charconvert (c)); }}}}} / *** Tambahkan node dfa* @param Words* / private static void addSensitiveWord (daftar akhir <string> kata) {if (words! = Null && words.size ()> 0) {char [] chs; int fchar; int lastIndex; Wordnode fnode; // node huruf pertama untuk (string curr: words) {chs = curr.tochararray (); fchar = charconvert (CHS [0]); if (! set.contains (fchar)) {// tidak ada definisi awal set.add (fchar); // bendera pertama dapat diulangi tambahkan. Ngomong -ngomong, itu dinilai, jadi tidak akan diulangi fnode = wordnode baru (fchar, chs.length == 1); nodes.put (fchar, fnode); } else {fnode = node.get (fchar); if (! fnode.islast () && chs.length == 1) fnode.setLast (true); } lastIndex = chs.length - 1; untuk (int i = 1; i <chs.length; i ++) {fnode = fnode.addifnoexist (charconvert (chs [i]), i == lastIndex); }}}} / ** * Menyaring penilaian mengubah kata -kata sensitif menjadi kata -kata bertopeng * @param src * @return * / public static final string dofilter (string final src) {char [] chs = src.tochararray (); int panjang = chs.length; int Currc; int k; Node WordNode; untuk (int i = 0; i <panjang; i ++) {currc = charconvert (chs [i]); if (! set.contains (Currc)) {lanjutan; } node = node.get (Currc); // Hari 2 if (node == null) // Sebenarnya itu tidak akan terjadi, Anda terbiasa menulisnya pada kontinuitas; Boolean bisa tanda = false; int marknum = -1; if (node.islast ()) {// single word pencocokan (hari) canmark = true; Marknum = 0; } // Terus cocok (hari/hari) dengan prioritas jangka panjang // you-3 Sister-4 suami-5 k = i; untuk (; ++ k <panjang;) {int temp = charconvert (chs [k]); if (stopwdset.contains (temp))) lanjutkan; node = node.querysub (temp); if (node == null) // tidak ada istirahat; if (node.islast ()) {candmark = true; Marknum = k - i; // 3-2}} if (canmark) {for (k = 0; k <= marknum; k ++) {chs [k+i] = tanda; } i = i + marknum; }} mengembalikan string baru (CHS); } / ** * Apakah kata -kata sensitif berisi * @param src * @return * / public static final boolean isContains (string final src) {char [] chs = src.tochararray (); int panjang = chs.length; int Currc; int k; Node WordNode; untuk (int i = 0; i <panjang; i ++) {currc = charconvert (chs [i]); if (! set.contains (Currc)) {lanjutan; } node = nodes.get (Currc); // Hari 2 if (node == null) // Itu tidak terjadi, itu terbiasa ditulis pada melanjutkan; Boolean bisa tanda = false; if (node.islast ()) {// single word pencocokan (hari) canmark = true; } // Terus cocok (hari Anda/hari adik Anda), dengan prioritas umur panjang // Anda-3 saudara perempuan-4 suami-5 k = i; untuk (; ++ k <panjang;) {int temp = charconvert (chs [k]); if (stopwdset.contains (temp))) lanjutkan; node = node.querysub (temp); if (node == null) // tidak ada istirahat; if (node.islast ()) {candmark = true; }} if (can canmark) {return true; }} return false; } / ** * huruf besar ke konversi lebar penuh menjadi setengah lebar * * @param src * @return * / private static int charconvert (char src) {int r = bcconvert.qj2bj (src); return (r> = 'a' && r <= 'z')? r + 32: r; }} di dalam:
iscontains: apakah akan memasukkan kata -kata sensitif
Dofilter: Filter kata -kata sensitif
2. Node kata sensitif wordnode
paket org.andy.sensitiveWdfilter; impor java.util.linkedlist; impor java.util.list; / ** * Dibuat: 30 Agustus 2016 jam 3:07:45 PM * * @author Andy * @Version 2.2 */ kelas publik WordNode {nilai int private; // Node Nama Private List <WordNode> Subnodes; // node anak private boolean isLast; // default false public wordnode (value int) {this.value = value; } public wordnode (nilai int, boolean isLast) {this.value = value; this.islast = isLast; } / ** * * @param Subnode * @return adalah subnode yang masuk * / private wordnode addSubnode (subnode WordNode akhir) {if (subnodes == null) subnodes = LinkedList baru <WordNode> (); subnodes.add (subnode); mengembalikan subnode; } /*** Jika ada, kembalikan simpul anak secara langsung. Jika tidak ada, buat dan tambahkan dan kembalikan node anak * * @param nilai * @return */ public wordnode addifnoexist (nilai int akhir, final boolean isLast) {if (subnodes == null) {return addsubnode (wordnode baru (nilai, isLast)); } untuk (WordNode Subnode: Subnodes) {if (subnode.value == value) {if (! Subnode.islast && isLast) Subnode.isLast = true; mengembalikan subnode; }} return addSubNode (wordnode baru (value, isLast)); } public wordnode querysub (nilai int akhir) {if (subnodes == null) {return null; } untuk (WordNode Subnode: Subnodes) {if (subnode.Value == nilai) return Subnode; } return null; } public boolean isLast () {return isLast; } public void setLast (boolean isLast) {this.islast = isLast; } @Override public int hashCode () {nilai pengembalian; }}3. Hasil tes
Proyek ini mencakup tesaurus sensitif, kode sumber, jeda tesaurus, dll. Cukup jalankan paket Maven dan JAR untuk dijalankan secara langsung.
Kode Sumber Proyek: SensitiveWD-filter_JB51.rar
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.