適切な冒fan的なフィルタをどのように実装しますか?
-
07-07-2019 - |
質問
私たちの多くは、ユーザー入力、検索クエリ、および入力テキストに冒とく的または望ましくない言語が含まれている可能性がある状況に対処する必要があります。多くの場合、これを除外する必要があります。
さまざまな言語や方言の宣誓単語の良いリストはどこにありますか?
適切なリストを含むソースで利用可能なAPIはありますか?または、単に「はい、これはクリーンです」と言うAPIです。または「これは汚れていません」いくつかのパラメータを使用しますか?
a $$、azz、a55など、システムをだまそうとする人々を捕まえるための良い方法は何ですか?
PHPのソリューションを提供する場合のボーナスポイント。 :)
編集:単にプログラムの問題を回避するという回答への応答:
たとえば、ユーザーがパブリックイメージ検索を使用して、デリケートなコミュニティプールに追加された写真を見つけることができる場合、この種類のフィルターの場所があると思います。彼らが「ペニス」を検索できるなら、彼らはおそらくそう多くの写真を得るでしょう。その写真が必要ない場合は、単語を検索用語として使用しないようにするのが適切な門番です。そもそも単語のリストを取得するのが本当の問題です。
だから、私は本当に単一のトークンが汚れているかどうかを把握し、それを単純に拒否する方法に言及しています。完全に陽気な「長い首のキリン」のような感情を妨げることはありません。参照。そこでできることは何もありません。 :)
解決
Obscenity Filters:Bad Idea、または信じられないほどの相互アイデアの悪いアイデア?
また、トゥーンタウンのSpeedChatの未定の歴史では、「セーフワードホワイトリスト」を使用してもその結果、14歳ですぐに回避されました。 "長い首のキリンをふわふわした白いウサギに突き刺したい。"
一番下の行:最終的に、実装するシステムには、人間によるレビューに代わるものはまったくありません(ピアかどうかに関係なく)。ドライブバイを取り除くための初歩的なツールを自由に実装できますが、断固としたトロールには、アルゴリズムに基づかないアプローチが絶対に必要です。
匿名性を取り除き、説明責任(Stack Overflowがうまくいくこと)を導入するシステムは、特にジョンガブリエルのギフト
冒pro的なリストを入手してどこから始めればよいかを尋ねました。チェックアウトすべきオープンソースプロジェクトの1つは、 Dansguardian -デフォルトの冒fanリストのソースコードをチェックしてください。追加のサードパーティフレーズリストもあります。プロキシ用にダウンロードすると、収集に役立ちます。あなたのためのポイント。
質問の編集に応じて編集します:しようとしていることを明確にしてくれてありがとう。その場合、単純な単語フィルターを実行しようとしているだけであれば、2つの方法があります。 1つは、検閲する禁止フレーズのすべてを含む単一の長い正規表現を作成し、単に正規表現を検索/置換することです。次のような正規表現:
$filterRegex = "(boogers|snot|poop|shucks|argh)"
そして preg_match()を使用して入力文字列で実行し、ヒットのテストをホールセールします
または preg_replace()で空白にします。
これらの関数は、単一の長い正規表現ではなく配列でロードすることもできます。長い単語リストの場合は、より管理しやすくなります。配列を柔軟に使用する方法の良い例については、 preg_replace()を参照してください。
追加のPHPプログラミングの例については、やや高度なジェネリッククラスについてこのページをご覧ください修正された単語の中心文字を除外する単語フィルタリング、およびこの前のスタックオーバーフローの質問また、PHPの例もあります(SQLベースのフィルター処理された単語アプローチの主な価値のある部分です。不要な場合は、リートスピークコンペンセーターを省くことができます)。
次も追加しました:" 最初に単語のリストを取得することが本当の質問です。" -以前のDansgaurdianリンクの一部に加えて、 thisを見つけることができます役立つ458単語の便利な.zip 。
他のヒント
この質問はかなり古いことは知っていますが、よくある質問です...
冒pro的なフィルターには理由と明確な必要性の両方があります( Wikipediaのエントリはこちらを参照)。非常に明確な理由で100%正確ではないコンテキストおよび精度。
達成しようとしていることに完全に依存します-最も基本的なのは、おそらく" 7つの汚い言葉"いくつかのビジネスでは、最も基本的な冒とく的な言葉をフィルタリングする必要があります:基本的な誓いの言葉、URL、さらには個人情報など、その他の企業は不正なアカウントの命名(Xbox liveが例です)などを防ぐ必要があります。 。
ユーザー生成コンテンツには、潜在的な悪意のある言葉が含まれているだけでなく、以下への不快な参照を含めることもできます。
- 性行為
- 性的指向
- 宗教
- 民族
- など...
そして潜在的に、複数の言語で。 Shutterstockは、基本的なダーティワードリストを10言語で開発しました。日付、しかしそれはまだ基本的であり、彼らの「タグ付け」ニーズに非常に向けられています。ウェブには他にも多くのリストがあります。
定義された科学ではなく、 as 言語は絶えず進化しているチャレンジであるという受け入れられた答えに同意しますが、90%のキャッチ率は0%よりも優れています。それは純粋にあなたの目標に依存します-あなたが達成しようとしているもの、あなたが持っているサポートのレベル、そして異なるタイプの冒proを取り除くことの重要性。
フィルターを作成する際には、次の要素とそれらがプロジェクトにどのように関係するかを考慮する必要があります。
- 単語/フレーズ
- 頭字語(FOAD / LMFAOなど)
- 偽陽性(単語、場所、「ミスした」、「スカンソープ」、「タイツワース」などの名前)
- URL(ポルノサイトは明らかなターゲットです)
- 個人情報(電子メール、住所、電話など-該当する場合)
- 言語の選択(通常はデフォルトで英語)
- モデレーション(もしあれば、ユーザーが生成したコンテンツとどのようにやり取りできるか)
冒%の90%以上を捕捉する冒proフィルターを簡単に作成できますが、100%に達することはありません。それは不可能です。 100%に近づけるほど難しくなります...過去に1日あたり50万件以上のリアルタイムメッセージを処理する複雑な冒とくエンジンを構築していたので、次のアドバイスを提供します。
基本的なフィルターには次のものが含まれます:
- 該当する冒fanのリストの作成
- 冒とくの派生物に対処する方法の開発
適度に複雑なファイラーには、(基本的なフィルターに加えて)以下が含まれます。
複雑なフィルターには、次のものが含まれます(中程度のフィルターに加えて):
- ホワイトリストおよびブラックリスト
- 単純ベイズ推論フレーズ/用語のフィルタリング
- Soundex 関数(単語が別の単語のように聞こえる場合)
- レーベンシュタイン距離
これに適したライブラリはありませんが、何をするにしても、必ず物事を通過させる方向に間違いを犯してください。 「mpassell」を使用できないシステムを扱ったことがあります。 「ass」が含まれているため、ユーザー名として部分文字列として。それはユーザーを疎外する素晴らしい方法です!
私の面接中、私に面接していた会社のCTOは、Javaで書いた単語/ウェブゲームを試しました。オックスフォード英語辞書全体の単語リストのうち、推測されるようになった最初の単語は何ですか?
もちろん、英語で最も汚い言葉。
どういうわけか、まだ求人はありますが、冒pro的な単語リスト(これとは異なり)、すべての悪い単語を使わずに(リストを見なくても)新しい辞書を生成する簡単なスクリプトを作成しました。
特定のケースでは、検索を実際の単語と比較することは、そのような単語リストを使用する方法のように思えます。別のスタイル/句読点にはもう少し作業が必要ですが、ユーザーが問題になるほど頻繁に使用することはないでしょう。
冒fan的なフィルタリングシステムは、プログラマーが無謀であり、すべてのヌード開発に遅れを取らない場合でも、完璧になることはありません
とはいえ、「いたずらな言葉」のリストは、他のリストと同様に機能する可能性が高い。なぜなら、根底にある問題は現在の技術ではほとんど手に負えない言語理解だからである
そのため、唯一の実用的な解決策は2つあります:
- 辞書を頻繁に更新する準備をします
- 誤検知(「クラシック」の代わりに「clbuttic」など)および誤検知(おっと!見逃しました!)
不快なユーザー入力を防ぐ唯一の方法は、すべてのユーザー入力を防ぐことです。
ユーザー入力を許可し、モデレートが必要な場合は、ヒューマンモデレーターを組み込みます。
「システムのトリック」についてサブクエスチョン、「悪い言葉」の両方を正規化することでそれを処理できます。検索を行う前にリストとユーザーが入力したテキスト。たとえば、一連の正規表現(またはPHPに tr )を使用して、 [z $ 5] を" s"、 [4 @] に変換しますstrong>と" a"などを比較し、正規化された" bad word"と比較します。正規化されたテキストに対するリスト。現時点では実際のケースを考えることはできませんが、正規化によって潜在的に追加の誤検知が発生する可能性があることに注意してください。
より大きな課題は、人々が「ペンは剣よりも強力です」という言葉を引用できるようにすることです。 「p e n i s」をブロックしながら。
ローカライズの問題に注意してください:ある言語での悪意のある言葉は、別の言語では完全に普通の言葉かもしれません。
これの現在の1つの例:ebayは辞書アプローチを使用して、「悪い単語」をフィルタリングします。フィードバックから。 「これは完璧な取引でした」のドイツ語の翻訳を入力しようとすると、 (「das war eine perfekte Transaktion」)、ebayは不適切な言葉のためフィードバックを拒否します。
なぜですか?ドイツ語で「だった」という言葉がは「戦争」であり、「戦争」は「悪い言葉」のebay辞書にあります。
ローカライズの問題に注意してください。
Digg / Stackoverflowのように、ユーザーがわいせつなコンテンツにダウン票/マークできるようなことができるなら...そうします。
その後、「いたずら」を確認するだけです。ユーザー、ルールに違反した場合はブロックします。
私はパーティーに少し遅れていますが、これを読んでいる人にはうまくいくかもしれない解決策があります。 phpではなくjavascriptで記述されていますが、正当な理由があります。
完全な開示、このプラグインを作成しました...
とにかく。
これまで行ってきたアプローチは、ユーザーが「オプトイン」できるようにすることです。冒pro的なフィルタリングに。基本的に冒とく的な表現はデフォルトで許可されますが、ユーザーが読みたくない場合は読む必要はありません。これは、「l33t sp3 @ k」にも役立ちます。問題。
コンセプトはシンプルな jquery プラグインです。クライアントのアカウントが冒fan的なフィルタリングを有効にしている場合、サーバーによって挿入されます。そこから、誓いを消し去るのはほんの数行の単純な行です。
デモページはこちら
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/
<div id="foo">
ass will fail but password will not
</div>
<script>
// code:
$('#foo').profanityFilter({
customSwears: ['ass']
});
</script>
結果
***は失敗しますが、パスワードは失敗しません
しないでください。それは単に問題につながります。冒とく的なフィルターに関する個人的な経験の1つは、「数時間ハンコックへの橋を渡る」と述べたためにIRCチャンネルからキック/禁止された時間です。またはその効果のための何か。
この議論の上位にあるHanClintoの投稿に同意します。私は通常、入力テキストを文字列に一致させるために正規表現を使用します。そして、これは無駄な努力です。最初に述べたように、ネット上で人気のあるすべてのトリック形式を「ブロック」で明示的に説明する必要があります。リスト。
補足として、他の人は検閲の倫理を議論していますが、ウェブ上で何らかのフォームが必要であることに同意する必要があります。一部の人々は、下品な投稿を単に楽しんでいるだけで、大勢の人々に不快感を与える可能性があり、著者側の考えをまったく必要としないため、単に下品な投稿を楽しんでいます。
アイデアをありがとう。
HanClintoルール!
フィルタリングしたい悪い単語の良いMYSQLテーブルができたら(このスレッドのリンクの1つから始めました)、次のようなことができます:
$errors = array(); //Initialize error array (I use this with all my PHP form validations)
$SCREENNAME = mysql_real_escape_string(フィルタリングしたい悪い単語の良いMYSQLテーブルができたら(このスレッドのリンクの1つから始めました)、次のようなことができます:
<*>
これらすべての置換を行うためのより効率的な方法があると確信していますが、私はそれを理解するのに十分賢くはありません(そして、これは非効率的ではありますが大丈夫に働くようです)。
ユーザーの登録を許可し、必要に応じて人を使って不適切な表現をフィルタリングし、不適切な表現を追加することを許可してください。それはすべて、偽陽性(悪いというフラグが付けられた単語)対偽陰性(悪い単語が通過する)のコストに依存しますが。最終的には、フィルタリング戦略におけるあなたの積極性や保守性を管理する必要があります。
また、ワイルドカードを使用したい場合は、意図よりも動作が不安定になることがあるため、非常に注意します。
POST['SCREENNAME']); //Escape the input data to prevent SQL injection when you query the profanity table.
$ProfanityCheckString = strtoupper($SCREENNAME); //Make the input string uppercase (so that 'BaDwOrD' is the same as 'BADWORD'). All your values in the profanity table will need to be UPPERCASE for this to work.
$ProfanityCheckString = preg_replace('/[_-]/','',$ProfanityCheckString); //I allow alphanumeric, underscores, and dashes...nothing else (I control this with PHP form validation). Pull out non-alphanumeric characters so 'B-A-D-W-O-R-D' shows up as 'BADWORD'.
$ProfanityCheckString = preg_replace('/1/','I',$ProfanityCheckString); //Replace common numeric representations of letters so '84DW0RD' shows up as 'BADWORD'.
$ProfanityCheckString = preg_replace('/3/','E',$ProfanityCheckString);
$ProfanityCheckString = preg_replace('/4/','A',$ProfanityCheckString);
$ProfanityCheckString = preg_replace('/5/','S',$ProfanityCheckString);
$ProfanityCheckString = preg_replace('/6/','G',$ProfanityCheckString);
$ProfanityCheckString = preg_replace('/7/','T',$ProfanityCheckString);
$ProfanityCheckString = preg_replace('/8/','B',$ProfanityCheckString);
$ProfanityCheckString = preg_replace('/0/','O',$ProfanityCheckString); //Replace ZERO's with O's (Capital letter o's).
$ProfanityCheckString = preg_replace('/Z/','S',$ProfanityCheckString); //Replace Z's with S's, another common substitution. Make sure you replace Z's with S's in your profanity database for this to work properly. Same with all the numbers too--having S3X7 in your database won't work, since this code would render that string as 'SEXY'. The profanity table should have the "rendered" version of the bad words.
$CheckProfanity = mysql_query("SELECT * FROM DATABASE.TABLE p WHERE p.WORD = '".$ProfanityCheckString."'");
if(mysql_num_rows($CheckProfanity) > 0) {$errors[] = 'Please select another Screen Name.';} //Check your profanity table for the scrubbed input. You could get real crazy using LIKE and wildcards, but I only want a simple profanity filter.
if (count($errors) > 0) {foreach($errors as $error) {$errorString .= "<span class='PHPError'>$error</span><br /><br />";} echo $errorString;} //Echo any PHP errors that come out of the validation, including any profanity flagging.
//You can also use these lines to troubleshoot.
//echo $ProfanityCheckString;
//echo "<br />";
//echo mysql_error();
//echo "<br />";
これらすべての置換を行うためのより効率的な方法があると確信していますが、私はそれを理解するのに十分賢くはありません(そして、これは非効率的ではありますが大丈夫に働くようです)。
ユーザーの登録を許可し、必要に応じて人を使って不適切な表現をフィルタリングし、不適切な表現を追加することを許可してください。それはすべて、偽陽性(悪いというフラグが付けられた単語)対偽陰性(悪い単語が通過する)のコストに依存しますが。最終的には、フィルタリング戦略におけるあなたの積極性や保守性を管理する必要があります。
また、ワイルドカードを使用したい場合は、意図よりも動作が不安定になることがあるため、非常に注意します。
12の言語で2200の悪い単語を収集しました:en、ar、cs、da、de、eo、es、fa、fi、fr、hi、hu、it、ja、ko、nl、no、pl、pt、 ru、sv、th、tlh、tr、zh。
MySQLダンプ、JSON、XMLまたはCSVオプションが利用可能です。
https://github.com/turalus/openDB
このSQLをDBで実行し、ユーザーが何かを入力するたびに確認することをお勧めします。
率直に言って、私は彼らに「システムのトリック」をさせました。代わりに言葉を出して禁止します。これは私だけです。しかし、プログラミングも簡単になります。
私がすることは、次のような正規表現フィルターを実装することです。 > / [\ s] doob(er | ed | est)[\ s] / 。これらは、完全に有効なassuagedのような単語のフィルタリングを防ぎますが、他のバリアントの知識を必要とし、新しいフィルタを学習する場合は実際のフィルタを更新する必要があります。明らかにこれらはすべて例ですが、自分でそれを行う方法を決定する必要があります。
実際にそれらを知りたくないときではなく、知っている単語をすべて入力するつもりはありません。
件名の無益さに同意しますが、フィルターが必要な場合は、Ningの Boxwoodをご覧ください:
Boxwoodは、テキスト内の複数の単語を高速で置換するためのPHP拡張です。大文字と小文字を区別するマッチングと大文字と小文字を区別しないマッチングをサポートしています。動作するテキストはUTF-8としてエンコードされる必要があります。
詳細については、このブログ投稿もご覧ください:
Boxwoodを使用すると、検索語のリストを好きなだけ長くすることができます。検索および置換アルゴリズムは、検索する単語のリストにさらに多くの単語が含まれていても遅くなりません。すべての検索用語のトライを作成し、対象テキストを1回だけスキャンし、トライの要素を歩いて、テキスト内の文字と比較することで機能します。 US-ASCIIとUTF-8、大文字と小文字を区別する、または区別しないマッチングをサポートし、いくつかの英語中心の単語境界チェックロジックを備えています。
結論として、適切な冒fan的なフィルタを作成するには、3つの主要なコンポーネントが必要です。少なくとも、これは私がやろうとしていることです。これらは次のとおりです。
- フィルター:ブラックリスト、辞書などに照らして検証するバックグラウンドサービス。
- 匿名アカウントを許可しない
- 不正行為の報告
ボーナスは、正確な虐待レポーターに貢献し、犯罪者を罰する人々に何らかの形で報いることです。アカウントを一時停止します。
ゲームの後半でも、いくつかの調査を行い、ここで偶然見つけました。他の人が言ったように、それが自動化された場合はほとんど不可能に近いですが、設計/要件が場合によっては(常にではないが)人間のやり取りが関係しているかどうかを確認することができる場合、MLを検討することができます。 https:// docs。 microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity は現在、複数の理由から私の選択です:
- 多くのローカライズをサポート
- データベースを更新し続けるので、最新のスラングや言語に追いつく必要はありません(メンテナンスの問題)
- 高い確率(つまり90%以上)がある場合は、実際に拒否することができます
- 冒fan的な場合もそうでない場合もあるフラグの原因となるカテゴリを観察し、誰かにレビューして、それが冒prof的であるかどうかを教えることができます。
私の必要性のために、それは他のユーザーがユーザー名を見ることができる/する公的な商用サービス(OK、ビデオゲーム)に基づいていました/しかし、デザインは不快なユーザー名を拒否するために冒fanフィルターを通過する必要があります。これに関する悲しい部分は、古典的な「clbuttic」です。ユーザー名は通常複数の単語が連結された単一の単語(最大N文字)であるため、問題が発生する可能性が高くなります...繰り返しますが、Microsoftの認知サービスは&quot; Assist&quot;にフラグを付けません。 Text.HasProfanity = trueとして。ただし、カテゴリ確率の1つが高いことを示す場合があります。
OPが&quot; a $$&quot;について尋ねると、フィルターを通過した結果がここにあります: 、ご覧のとおり、不敬ではありませんが、その可能性が高いため、レビューの推奨としてフラグを立てます(人間のやり取り)。
可能性が高い場合は、「申し訳ありませんが、その名前はすでに使用されています」というように戻ることができます。 (そうでない場合でも)反検閲の人や何かに不快感を与えないようにするために、人間のレビューを統合したくない場合、または&quot;あなたのユーザー名がライブ運用部門に通知されている場合、ユーザー名が確認および承認されるのを待つか、別のユーザー名を選択します」。または何でも...
ところで、このサービスのコスト/価格は私の目的では非常に低いです(ユーザー名はどのくらいの頻度で変更されますか?)が、再び、OPの場合、デザインはより集中的なクエリを要求し、支払うには理想的ではないMLサービスの/ subscribe、または人間によるレビュー/相互作用を行うことはできません。それはすべてデザインに依存します...しかし、デザインが法案に合っていれば、おそらくこれがOPのソリューションになります。
興味があれば、今後のコメントに短所をリストできます。
しないでください。
理由:
- Clbuttic
- 冒とくはOMG EVILではありません
- 冒とくを効果的に定義することはできません
- ほとんどの人は、おそらく「保護されている」ことに感謝していません。冒とくから
編集:「検閲が間違っている」と言ったコメント者には同意しますが、それはこの答えの性質ではありません。
冒fan的なフィルターは悪いアイデアです。理由は、すべての有名な単語をキャッチできないことです。試みると、偽陽性になります。
キャッチワード
F-Wordをキャッチしたいとしましょう。簡単ですね。よく見てみましょう。
文字列をループして&quot; fuck。&quot;を見つけることができます。残念ながら、最近では人々はフィルターをだます。冒とくフィルターは「fuk。」を拾いませんでした
単語の複数のスペルやバリエーションをチェックすることもできますが、コードのパフォーマンスが低下します。 F-Wordをキャッチするには、&quot; fuc&quot;、&quot; Fuc&quot;、&quot; fuk&quot;、&quot; Fuk&quot;、&quot; F ***&quot;などを探す必要があります。 。
イノセンスの回避
さて、大文字と小文字を区別せずにスペースを無視して、「F u C k」をキャッチしますか?それは良いアイデアのように聞こえるかもしれませんが、誰かが「F.U.C.K.」で冒fanフィルターをバイパスすることができます
句読点を無視します。
これは本当の問題です。「地獄 o、そこに!」のような文があるからです。 &quot; hell;&quot;および「Wh ass up?」 「ass。」としてピックアップします。
さらに、「Cons tit ution」など、フィルタから除外する必要がある単語がたくさんあります。 「tit」があるからですその中。
人々は、「Frack」などの代替単語を使用することもできます。あなたもそれをブロックしますか? 「ペンとは」について「ペニス」?あなたのプログラムには、文字列が良いか悪いかを知るための人工知能がありません。
冒fan的なフィルタを使用しないでください。開発が難しく、クロールと同じくらい遅いです。