敏感な単語とテキストフィルタリングは、ウェブサイトの不可欠な機能です。優れた効率的なフィルタリングアルゴリズムを設計することが非常に必要です。しばらく前に、私の友人(すぐに卒業し、プログラミングに参加して間もなく卒業しました)は、テキストフィルタリングのものを読むのを助けるように頼みました。私はプログラムを引き継いで、プロセス全体が次のとおりであることを確認しました:ハッシュセットコレクションの場合、敏感な語彙を読んで、ページを取得してテキストをアップロードしてから一致させます。このプロセスは非常に遅いものでなければならないと思いました。彼と接触していない人にとって、私はこれを考えることしかできず、より高度なポイントは定期的な表現です。しかし、残念ながら、どちらの方法も実行可能ではありません。もちろん、私の意識では、アルゴリズムが問題を解決できることに気づきませんでしたが、Googleはそれを知っています!
DFAの紹介
テキストフィルタリングを実装するアルゴリズムの中で、DFAは唯一のより優れた実装アルゴリズムです。 DFAは決定論的な有限オートマトンであり、これは有限オートマトンを決定することを意味します。イベントと現在の状態、つまりイベント+状態= nextStateを通じて次の状態を取得します。次の図は、その状態の移行を示しています。この図では、大文字(s、u、v、q)はすべて状態であり、小文字aとbはアクションです。上記の写真を通して、次の関係を見ることができます
abb
s ------> us ------> vu ------> v
敏感な単語フィルタリングを実装するアルゴリズムでは、操作を削減する必要がありますが、DFAにはDFAアルゴリズムの計算はほとんどなく、状態変換のみがあります。
JavaはDFAアルゴリズムを実装して、機密の単語フィルタリングを実装します
Javaで敏感な単語フィルタリングを実装する鍵は、DFAアルゴリズムの実装です。まず、上記の数値を分析しましょう。このプロセスでは、次の構造がより明確になると考えています。
同時に、ここには状態の移行やアクションはなく、クエリのみがあります(検索)。 s query u、v、speed u query v、p、bean vを介してV Query Upを介してと考えることができます。このような変換を通じて、私たちは、Javaコレクションを使用して、状態の移行を検索に変換することができます。
確かに、私たちの敏感なシソーラスには、日本、日本の悪魔、毛沢東など、いくつかの敏感な言葉が追加されています。ドン。では、どのような構造を構築する必要がありますか?
最初:クエリデイ---> {book}、query book ---> {people、devil}、query person - > {null}、query ghost ---> {child}。形状は次のとおりです。
この図を以下に拡張しましょう。
このようにして、敏感なシソーラスを1つずつ同様の木に組み込むため、単語が繊細な単語であるかどうかを判断すると、検索マッチングの範囲を大幅に減らします。たとえば、日本人を判断したい場合は、最初の単語に基づいて検索する必要があるツリーを確認し、このツリーで検索することができます。
しかし、敏感な言葉が終わったとどのように判断しますか?識別ビットを使用して判断します。
したがって、これの鍵は、そのような敏感な単語の木を構築する方法です。以下に、例としてJavaのHashMapを使用してDFAアルゴリズムを実装しました。特定のプロセスは次のとおりです。
例として日本の日本の悪魔
1。ハッシュマップで「日」をクエリして、ハッシュマップに存在するかどうかを確認します。それが存在しない場合、「日」から始まる敏感な単語がまだ存在していないことを証明し、そのような木を直接構築します。 3にジャンプします。
2。ハッシュマップで見つけた場合、「日」から始まる敏感な単語があることを示します。 hashmap = hashmap.get( "day")を設定し、1にジャンプし、「この」と「人」を順番に一致させます。
3.単語が単語の最後の単語であるかどうかを判断します。敏感な単語の終わりを意味する場合は、フラグビットISEND = 1を設定し、それ以外の場合はフラグビットISEND = 0を設定します。
プログラムの実装は次のとおりです。
/** *敏感なレキシコンを読み、敏感な単語をハッシュセットに入れ、DFAアルゴリズムモデルを作成します:<br> * middle = { * isend = 0 * country = {<br> * isend = 1 * people = {isend = 0 * people = {isend = 1} *} *男性} *} *} * 5 = { * isend = 0 * star = { * isend = 0 * red = { * isend = 0 * flag = { * isend = 1 *} *} *} *} *} * @author chenming * @date 2014年4月20日3:04:20 pm @suppresswarnings({"rawTypes"、 "unchecked"})private adsensitivewordtohashmap(set <string> keywordset){sensitivewordmap = 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 = sensitivewordmap; for(int i = 0; i <keylength(); i ++){char keychar = keyCharat(i); // char-typeオブジェクトに変換wordmap = nowmapget(keychar); // get if(wordmap!= null){//このキーが存在する場合は、nowmap =(map)wordmapを直接割り当てます。 } else {//存在しない場合は、マップを作成し、最後のnewwormap = new Hashmap <string、string>(); newwormapput( "isend"、 "0"); //最後のnowmapput(keychar、newwormap)ではありません。 nowmap = newwormap; } if(i == keylength() - 1){nowmapput( "isend"、 "1"); //最後} } } } }実行によって取得されたハッシュマップ構造は次のとおりです。
{5 = {star = {red = {isend = 0、flag = {isend = 1}}、isend = 0}、isend = 0}、insend = 0、country = 0、people = {isend = 1}、male = {isend = 0、people = 0、people = 0、people = 0、people = 0、people = 0、people =
敏感なシソーラスの簡単な方法を実装したので、検索を実装する方法は?検索プロセスは、Hashmapの取得実装にすぎません。あなたがそれを見つけた場合、それは単語が繊細な単語であることを証明します、そうでなければそれは敏感な言葉ではありません。プロセスは次のとおりです。「中国人の長生き」と一致する場合。
1。最初の単語「中」、ハッシュマップで見つけることができます。新しいmap = hashmap.get( "")を取得します。
2。map == nullの場合、それは敏感な単語ではありません。それ以外の場合は3にスキップします
3.マップでISENDを取得し、単語ISENDが1に等しいかどうかを判断します。ISEND== 1は、単語が敏感な単語であることを意味し、そうでなければ1にスキップします。
このステップを通じて、「中国人」は繊細な言葉であると判断できますが、「中国の女性」を入力すると、それは繊細な言葉ではありません。
/***テキストに敏感な文字が含まれているかどうかを確認します。チェックルールは次のとおりです。<br> * @author chenming * @date 2014年4月20日4:31:03 pm * @param txt * @param beginindex * @param mattytype * @return、存在する場合、敏感な単語文字の長さを返します。 "rawTypes"})public cecksensitiveword(string txt、int beginindex、int mattytype){boolean flag = false; //敏感なワードエンドマークビット:敏感な単語int matchflag = 0が1ビットしかない場合に使用されます。 //一致した識別子の数は0です。デフォルトではchar word = 0; map nowmap = sensitivewordmap; for(int i = vertingIndex; i <txtlength(); i ++){word = txtcharat(i); nowmap =(map)nowmapget(word); //指定されたキーを取得しますif(nowmap!= null){//存在し、それが最後のmatchflag ++であるかどうかを判断します。 //対応するキー、一致した識別子+1 if( "1" Equals(nowmapget( "isend"))){//最後の一致ルールの場合、ループを終了し、一致する識別子番号flag = trueを返します。 // endフラグは、(sensitivewordfilterminmatchtype == mattyType){//最小ルールが直接返され、最大ルールがブレークを探し続ける必要がある場合。 }}} else {//存在しない、直接壊すことを返します。 }}} if(matchflag <2 &&!flag){matchflag = 0; } matchflagを返します。 }記事の最後に、Javaを使用してファイルダウンロードを提供して、敏感な単語フィルタリングを実装します。以下は、このアルゴリズムの効率と信頼性を証明するテストクラスです。
public static void main(string [] args){sensitivewordfilter filter = new SensitiveWordFilter(); SystemOutPrintln( "敏感な単語の数:" + filtersensivewordmapsize()); string string = "悲しい感情が多すぎると、給餌ベース画面のプロットに限定される可能性があります。主人公は何らかの方法を使用して自殺ガイドを徐々にリリースし、自分の経験の悲しみを気にしようとします。」 +「それから、法輪功の役割は、主人公のXihongke Allianceの怒りと悲しみと悲しみを追いかけ、彼の感情をスクリーンプロットにあまりにも遠くに取り付けて、彼が動いて泣いていることです。」 +「あなたが悲しいなら、あなたは誰かの腕の中に横たわり、あなたの心またはあなたの携帯電話カードのコピーデバイスを説明します。赤ワインのグラス。映画。深く静かな夜、あなたは電話を閉じて静かに凝視します。」 SystemOutPrintln( "検出される単語の数:" + stringlength()); long begintime = systemcurrenttimemillis(); set <string> set = filtergetSensitiveWord(string、1); long endtime = systemcurrenttimemillis(); SystemOutPrintln( "ステートメントの敏感な単語の数は次のとおりです。" + setSize() + "。 SystemOutPrintln( "合計時間が消費されます:" +(endtime -begintime)); }実行結果:
上記の結果から、771の敏感な語彙データベースがあり、検出文の長さは184文字で、6つの敏感な単語が見つかっていることがわかります。合計で1ミリ秒かかりました。可視速度はまだ非常にかなりのものです。
次の2つのドキュメントのダウンロードが提供されています。
desktop.rar(http://xiazai.vevb.com/201611/yuanma/desktop_jb51.rar)には2つのJavaファイルが含まれています。 (isContaNTSENSITIVEWORD(String TXT、int matterType)、敏感な単語(getSensitiveword(string txt、int matterype))の取得、および敏感な単語の置き換え(置換(string txt、int mattytype、string factereChar))の置換。
敏感なシソーラス:クリックしてダウンロードします
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。