0

ファイルから大量の電子メール アドレスのリストがあります。約 100 万のメール ID があります。スパム、ジャンクなどの悪い言葉のリストがあります。20,000 以上の悪い言葉で構成されています。

メール ID を検証する必要があります。電子メール ID のどこかに不適切な言葉が含まれていると、無効としてマークされます。

例えば;

testspam@gmail.com - 無効

newuser@desspam.com - 無効

配列のループ処理に時間がかかるため、どちらが最速の比較方法になるか知りたいです。

私は次の方法を試しました

//$keyword_list- array of bad words;

//$check_key- the email id which need to validate

$arrays = array_chunk($keyword_list, 2000);
for($i=0;$i<count($arrays);$i++)
{
    if (preg_match('/'.implode('|', $arrays[$i]).'/', $check_key, $matches)){
        return 1;
    }

}

上記の方法は、100万個のデータを比較すると時間がかかります。

次に、次のコードで試しましたが、これも時間がかかります

//$contain  = bad words separated by '|' 
// $str - the email id which need to validate

if(stripos($contain,"|") !== false)
{
    $s = preg_split('/[|]+/i',$contain);
    $len = sizeof($s);
    for($i=0;$i < $len;$i++)
    {
        if(stripos($str,$s[$i]) !== false)
        {
            return(true);
        }
    }
}
if(stripos($str,$contain) !== false)
{
    return(true);
}

return(false);

最後に、Mongodb Text Search を試してみました。次の問題で高速に動作します

「地獄」が私の悪いリストの単語で、私の電子メール ID が head@e-hellinglysussex.sch.uk のようなものである場合、Mongodb テキスト検索はそれに一致しません。

これが私が使用したコードです。

$ret = $db->command( array("text" =>$section, "search" => $keyword_string,     "limit"=>$cnt_finalnonmatch));
where $section = Collection name, 
$keyword_string = Comparing keywords string separated by space, for eg "Hell Spam Junk" etc,
$cnt_finalnonmatch = total number of comparing email ids

この問題を解決するために私を助けてください。

4

2 に答える 2

0

この問題を解決するために、Mongodb の「like」を使用しました。

$keywords = $key['keyword']; // キーワードを比較する必要があります $regexObj = new MongoRegex("/".$keywords."/i"); // MongoRegex 関数宣言 $where = array($section => $regexObj); // $section はコレクション名 $resultset = $info->find($where);

于 2013-10-22T12:06:38.520 に答える
0

完全にはわかりませんが、mongodb では大文字と小文字が区別されるため、テキストを検索するときに「Hell」が「hell」と等しくないことが問題であると思われます。

解決策は、すべての文字列と単語を強制的に小文字 (または大文字) にすることです。

于 2013-10-17T15:41:52.483 に答える