Webサイトのキーワードのフィルタリング

4332 ワード

  • 前言
  • 先日、プロジェクトでユーザーの返信内容を敏感にフィルタリングする必要があったので、ソリューションを探して、ここに記録しました.
    ブログアドレス
  • ソリューションの選択についてこれを思いついたばかりで、まず思いついたのは敏感語を配列の中に入れて、繰り返して、テキストの中に存在するかどうかを判断して、存在するなら*号に置き換えます.しかし、この案は脳に入ると、転念の間にpassが落ち、多くのキーワードが全文マッチングをしなければならないので、効率が悪い.この考え方があるのは正規表現で、これは上の方法と似ていて、その効率も議論されているので、直接passを落とすことになります.私が当時考えていた比較的信頼できる案は、接頭辞ツリーで、すべての語を接頭辞ツリーの中に置いてマッチングすることで、接頭辞ツリーの特性を有効に利用してマッチングを行い、無駄な検索オーバーヘッドを回避し、接頭辞ツリーの同じノードを多重化することができます.
  • の最終的な解決策私は上記の3つの案の中で決定した後、またネット上で探して、大体すべてdfaアルゴリズムで書いた木の形の構造で、接頭辞の木とあまり等価ではありません.dfaアルゴリズムのリンクの大体の構造は以下の通りです(図は他の人が持ってきたもので、花を借りて仏を捧げます)
  • 各テールノードとその通過ノードは,完全なキーワードを構成する.フィールドを使用して、現在のノードが末尾ノードであるかどうかを指定します.
    {
    	" " : {
    		"isEnd" : 0,
    		" " : {
    			"isEnd" : 0,
    			" " : {
    				"isEnd" : 1
    				},
    			" "  : {
    				"isEnd" : 0,
    				" " : {
    					 "isEnd" : 1
    					}
    				},
    			" " 	: {
    				"isEnd" : 0,
    				" " : {
    					 "isEnd" : 1
    					}
    				}
    		   }
    	  },
    	" " : {
    		"isEnd" : 0,
    		" " : {
    			"isEnd" : 0,
    			" " : {
    				  "isEnd" : 1
    				}
    			}
    		}	  
    	}
    

    上図のキーワード格納構造はほぼ上記の通りである.
    ルールは、敏感語がmapに存在するかどうか、存在する場合はその敏感語のmapの下でマッチングを継続し、マッチングが一致しない場合はスキップし、マッチングが完了した後、isEndフィールドが1である場合、敏感語マッチングが成功したことを示す.
    コードアドレスの敏感な辞書は私は置かないで、自分で必要に応じて1つ探せばいいです.