1。序文
開発中、一部のユーザーのテキストの提出はしばしば処理されるため、敏感な単語をフィルタリングする機能が含まれます。参照材料におけるDFA有限状態マシンアルゴリズムの実装は、指示されたグラフを作成するために使用されます。繊細な単語と広告スローガンのフィルタリングが完了しており、効率は良好なので、共有してください。
特定の実装:
1。ケースフィルタリングを一致させます
2。全幅半幅フィルターを一致させます
3。フィルターの一時停止単語フィルタリングを一致させます。
4.敏感な単語については、単語フィルタリングを繰り返します。
例えば:
次のタイプフィルタリング検出をサポートします。
くそ
ファックケース
完全な幅の半幅をファック
f !!! u&c ### k停止単語
fuuuuccccckkkk繰り返し語
敏感な言葉をフィルタリングする方法はたくさんあります。私が今理解しているいくつかのタイプについて簡単に説明します:
[データベース内の敏感な単語をクエリし、各機密の単語をループしてから、入力テキストで最初から最後まで検索して、この機密の単語が存在するかどうかを確認します。
率直に言って、この方法は、他方に対処する一方を見つけることです。
利点:とても簡単です。基本的に、Javaコードで実装することは困難ではありません。
短所:この効率により、私は心の中で100,000匹以上の草の泥馬を走らせます、そして、マッチングは少し痛いですか?それが英語の場合、あなたは英語などの非常に言葉のないものを見つけるでしょう。
Aは敏感な言葉です。私が英語の文書である場合、敏感な単語を処理する必要があるのは何回必要ですか?誰かが私に言うことができますか?
hegend伝説的なDFAアルゴリズム(貧弱なオートマトン)は、まさに私があなたと共有したいものです。結局のところ、それはより一般的に感じます。誰もがアルゴリズムの原則を自分で確認できることを願っています。
ここでは情報を詳細に説明しません。
利点:少なくとも上記のSBよりも効率的です。
短所:アルゴリズムを学んだ人にとっては難しいことではありませんが、それらを使用することは難しくありません。理解するのは少し苦痛です。一致する効率は高くなく、記憶を消費します。
敏感な言葉が多いほど、より多くのメモリが消費されます。
3番目のタイプはここで特別に説明されています。つまり、自分でアルゴリズムを記述するか、既存のアルゴリズムに基づいて最適化する必要があります。これは、Xiao Alanが追求するものでもあります。
高い領域の1つは、った兄弟が彼自身のアイデアを持っている場合、Xiao Alanを忘れないでください。 Xiao AlanのQQ:810104041を追加して、Xiao Alanに2つのトリックを教えることができます。
2。コード実装
そのディレクトリ構造は次のとおりです。
リソースリソースディレクトリ:
stopwd.txt:単語を一時停止し、一致時間は直接フィルタリングされます。
wd.txt:敏感なシソーラス。
1。WordFilterに敏感な単語フィルタリングカテゴリ
パッケージorg.andy.sensitivewdfilter; 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をインポートします。 Import org.andy.sensitivewdfilter.util.bcconvert; /** *作成時間:2016年8月30日午後3時12分 * *アイデア:フィルターセットを作成します。0〜65535のすべてのcharが敏感な単語の先頭から始まるかどうかを列挙します * *敏感な単語で始まるかどうかを判断します| |ヘッドノードを取得しても大丈夫ですか?次の単語、次にステップごとにトラバース、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 <>(); //一時停止単語private static final char sign = '*'; // 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(){//敏感な単語を取得するaddsensitiveword(readwordfromfile( "wd.txt")); AddStopWord(readwordfromfile( "stopwd.txt")); } / ** *敏感な単語を追加 * @param path * @return * / private static list <string> readwordfromfile(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){throw new runtimeException(e); }最後に{try {if(br!= null)br.close(); } catch(ioexception e){}} return words; } / ** *一時停止ワード * * @param単語 * / private static void addStopword(final list <string> words){if(words!= null && words.size()> 0){char [] chs; for(string curr:words){chs = curr.tochararray(); for(char c:chs){stopwdset.add(charconvert(c)); }}}}}} / *** dfa node* @param words* / private static addSensitiveword(final list <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()){//単一ワードマッチング(day)comemark = true; marknum = 0; } //長期的な優先度と一致し続ける(日/日)// you-3 sister-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; marknum = k -i; // 3-2}} if(can mark){for(k = 0; k <= marknum; k ++){chs [k+i] = sign; } i = i + marknum; }} new String(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()){//単一ワードマッチング(day)comemark = 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(can mark){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.sensitivewdfilter; java.util.linkedListをインポートします。 java.util.listをインポートします。 / ** *作成:2016年8月30日3:07:45 pm * * @author andy * @version 2.2 */ public class wordnode {private int value; //ノード名プライベートリスト<WordNode>サブノード; //チャイルドノードプライベートブールイスラスト; //デフォルトの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);サブノードを返します。 } /***ある場合は、子ノードを直接返します。 noがある場合は、子ノードを作成して追加および返します * * @param値 * @return */ public wordnode addifnoexist(final int value、final boolean 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; } nullを返します。 } public boolean islast(){return islast; } public void setlast(boolean islast){this.islast = islast; } @override public int hashcode(){return値; }}3。テスト結果
このプロジェクトには、敏感なシソーラス、ソースコード、一時停止セソーラスなどが含まれています。MavenとJarパッケージを直接実行するだけです。
プロジェクトソースコード:sensitivewd-filter_jb51.rar
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。