2011-06-19 41 views
2

私は PHPネストされた配列の検索

PHP

に新たなんだ、私は私が問題を抱えている。この

$suspiciousList = array(
array ("word" => "badword1", "score" => 400, "type" => 1), 
array ("word" => "badword2", "score" => 250, "type" => 1), 
array ("word" => "badword3", "score" => 400, "type" => 1), 
array ("word" => "badword4", "score" => 400, "type" => 1)); 

ような配列を持っているときのようなスペースで、ユーザーの入力ワード(badw ord1、Bのadword2、など) 、またはユーザーがlike(badword 1)を入力する可能性があります

配列(辞書)から組み合わせを検出または検索するにはどうすればよいですか?

私の考えは、すべての単語をスペースで区切られた配列にすることです。

$ this-> suspiciousPart [] = $ word;

私は

public function deepDetect2() { 
    for($i=0;$i<sizeof($this->suspiciousPart);$i++) { 
     $word = ""; 
     for($j=$i;$j<sizeof($this->suspiciousPart);$j++) { 
      $word .= $this->suspiciousPart[$j]; 
      //var_dump($word); 
      if(strpos(in_array($word, $this->suspiciousList), $word) !== false) { 
       if($this->detect($word) == true) { 
        $i++; 
       } else { 
        $j++; 
       } 
      } else { 
       $i++; 
      } 
     } 
    } 
} 

誰もがこれを行うにはどのように他のアイデアを持って書き込み、次の関数ですか?

おかげ

+2

を見つけるよ - キーワードを変更!これは子供のサイトでもあります(コーダーの場合)、この単語は使用できません。 – fingerman

+0

は配列の値が大好きです:D – MeLight

+0

は(最初のポスターに)合意しましたか、あなたは12か何かであり、これらの言葉が涼しいですか?それらを変更してください。 – PaulM

答えて

2

とにかく、あなたは空白文字を削除し、使用することができます(mb_substr_count()が、それは偽陽性を得ることにつながります。

2

Jirka Helmichは、空白(およびその他の特殊文字)を削除してから、文字列を検索して配列から単語を見つけることを提案しました。

public function searchForBadWords($strippedText) { 
    foreach($suspiciousList as $suspiciousPart) { 
      $count = substr_count($strippedText, $suspiciousPart['word']); 
      //you can use str_replace here or something, it depends what you want to achive 
    } 
} 

問題は、あなたがblablabad wordblablaのような言葉を持っていて、通常の言葉にスペースを削除した場合悪い言葉blablabadwordblablaになる可能性がある(私が何を意味するか知っている?):D

乾杯

編集:だからアフマド私は、あなたが始まり/終わり(ショートカットで)でそれらを認識する単語を ""得るのを見ます。たぶんあなたは両方のメソッドを実装しようとするべきでしょう。それはあなたがパフォーマンスを気にするかどうかにも依存します。たぶん、あなたはそれがどのように効果的な見るためにいくつかのreserchesまたはSTHを行う試してみてください:D

+0

私はそれを配列にするためにこれらのコードを使用しています。 \t \t $ words = mb_strtolower($ words、 'UTF-8'); \t \t $ words = $ this-> removeUniCharCategories($ words); \t \t $ words = explode( ""、$ words); \t \t //空の配列を削除してください! \t \t $ words = array_filter($ words); \t \t foreachの(値として&$ $ワード){ \t \t \t $ newWords [] = $値。 \t \t} \t \t $ words = $ newWords; しかし、私はまだ最高のsollutionを見つけています – Ahmad

2
  1. ストリップスペース
  2. このようなすべてのキーワードを含むONE正規表現で検索:(WORD1 | WORD2 |ワード3)
+0

広告2:それは確かにそれを行う方法ですが、禁止された単語の数が多い場合、Aho-Corasickアルゴリズムはタスクの方が良いです。 –

+0

ad Aho-Corasick:そうです、これはそのための最良のアルゴリズムです。しかし、1.デフォルトの正規のマッチングは、ほとんどのケースでうまくいくはずです。2.理論的には、正規表現のマッチャーはAho-Corasickを内部で使うことができます(しかし、デフォルトのものは私の知る限りではありませんが、例えば "fgrep"コカコーラ) –

2

この質問は良いスタートです:How do you implement a good profanity filter? - 私は結論に同意します。つまり、検出結果は常に悪い結果になります。

私は、これらのアプローチしようとするだろう:

1)は単にあなたの辞書によると下品された単語を検出します。

2)「1文字で構成された単語の連続シーケンス」(b a d w o r d)のようなヒューリスティックをいくつか考えて、それらを使用してユーザーの投稿を評価します。次に、予想外の下品な言葉の数を計算することができます。P_iはヒューリスティックiで見つかった単語が実際には下品な単語であり、N_iはヒューリスティックで見つかった単語の数ですiです。私は、確率論的なアプローチが、単に「この投稿は下品な言葉を含んでいるのではない」というよりも優れていると思います。

3)モデレータが投稿が実際に下品であるかどうかを判断させます。さもなければあなたの自動交換方法の不完全さは、おそらくあなたのユーザーを怒らせるでしょう。

4)英語やトルコ語の辞書で単語を検索して、実際に英語の単語でない単語を探すのは無駄だと思う。

1

@ f1ames:次のコードを使用して配列を作成しています。

$words = mb_strtolower($words, 'UTF-8'); 
    $words = $this->removeUniCharCategories($words); 
    $words = explode(" ",$words); 
    //Remove empty Array ! 
    $words = array_filter($words); 
    foreach ($words as &$value) { 
     $newWords[] = $value; 
    } 
    $words = $newWords; 

しかし、私はまだちょうどアイデア最高のsollution