214

私たちの多くは、ユーザー入力、検索クエリ、および入力テキストに不適切な言葉や望ましくない言葉が含まれている可能性がある状況に対処する必要があります。多くの場合、これを除外する必要があります。

さまざまな言語や方言の悪口の良いリストはどこにありますか?

適切なリストを含むソースで使用できる API はありますか? それとも、いくつかのパラメーターを使用して、「はい、これはクリーンです」または「いいえ、これはダーティです」と単純に言う API でしょうか?

a$$、azz、a55 など、システムをだまそうとしている人々を捕まえる良い方法は何ですか?

PHP のソリューションを提供する場合のボーナス ポイント。:)

編集:単にプログラムの問題を回避すると言う回答への応答:

たとえば、ユーザーが公共の画像検索を使用して、機密性の高いコミュニティ プールに追加された写真を見つけることができる場合、この種のフィルターの場所があると思います。彼らが「ペニス」を検索できれば、そうです、彼らはおそらく多くの写真を手に入れるでしょう. そのような写真が必要ない場合は、その単語を検索語として使用しないようにするのが良いゲートキーパーですが、確実な方法ではないことは確かです。そもそも単語のリストを取得することが本当の問題です。

したがって、私は実際には、単一のトークンがダーティかどうかを判断し、単純にそれを拒否する方法について言及しています。「首の長いキリン」という完全に滑稽な言及のような感情をあえて阻止するつもりはありません。そこでできることは何もありません。:)

4

20 に答える 20

181

わいせつフィルター: 悪い考えか、信じられないほど性交する悪い考えか?

また、トゥーンタウンのスピード チャットの語られざる歴史を忘れることはできません。「セーフ ワード ホワイトリスト」を使用しても、14 歳の子供がすぐにそれを回避しまし た。白うさぎ。」

結論: 最終的に、実装するシステムについては、人間によるレビュー (ピアであろうとなかろうと) に代わるものはまったくありません。ドライブバイを取り除くための初歩的なツールを自由に実装できますが、断固たる荒らしのためには、絶対に非アルゴリズムベースのアプローチが必要です。

匿名性を取り除き、説明責任を導入するシステム (Stack Overflow がうまく行っていること) も役立ちます。特に、John Gabriel の GIFTと戦うために役立ちます。

あなたはまた、冒とく的なリストをどこで入手できるかを尋ねました.Dansguardianをチェックアウトするオープンソースプロジェクトの1つです.デフォルトの冒とく的なリストのソースコードをチェックしてください. プロキシ用にダウンロードできる追加のサード パーティのフレーズ リストもあり、収集ポイントとして役立ちます。

質問の編集に応じて編集:あなたがしようとしていることを明確にしていただきありがとうございます。その場合、単純な単語フィルターを実行しようとしているだけであれば、2 つの方法があります。1 つは、検閲したいすべての禁止フレーズを含む単一の長い正規表現を作成し、正規表現の検索/置換を行うだけです。次のような正規表現:

$filterRegex = "(boogers|snot|poop|shucks|argh)"

preg_match()を使用して入力文字列に対して実行し、ヒットの卸売テストを行います。

またはpreg_replace()を使用してそれらを空白にします。

これらの関数は、単一の長い正規表現ではなく配列でロードすることもできます。長い単語リストの場合は、より扱いやすい場合があります。配列を柔軟に使用する方法の良い例については、 preg_replace()を参照してください。

追加の PHP プログラミングの例については、検閲された単語から中央の文字を除外する単語フィルタリングのやや高度なジェネリック クラスのこのページと、PHP の例もあるこの以前のスタック オーバーフローの質問を参照してください (重要な部分はSQL ベースのフィルター処理された単語のアプローチ -- リートスピーク コンペンセーターが不要であると判断した場合は省略できます)。

また、「最初に単語のリストを取得することが本当の問題です。」 -- 以前の Dansgaurdian リンクのいくつかに加えて、この便利な458 単語の.zipが役に立つことがわかるかもしれません。

于 2008-11-07T20:21:12.833 に答える
48

この質問はかなり古いことは知っていますが、よくある質問です...

冒涜フィルターには理由と明確な必要性の両方があります (ウィキペディアのエントリを参照してください)。文脈正確さ

それは(完全に)あなたが達成しようとしていることに依存します - それは最も基本的なもので、おそらく「7つの汚い言葉」をカバーしようとしているでしょう。悪口、URL、さらには個人情報なども含まれますが、不正なアカウントの名前付け (Xbox live がその例です) を防ぐ必要がある人や、それ以上のもの...

ユーザーが作成したコンテンツには、悪意のある言葉が含まれている可能性があるだけでなく、次のような攻撃的な参照が含まれている場合もあります。

  • 性行為
  • 性的指向
  • 宗教
  • 民族性
  • 等...

そして潜在的に、複数の言語で。Shutterstock はこれまでに 10 の言語で基本的な汚い言葉のリストを開発しましたが、それでも基本的なものであり、「タグ付け」のニーズに非常に重点を置いています。Web 上には他にも多数のリストがあります。

それは定義された科学ではなく、言語は絶えず進化する課題ですが、キャッチ率 90% は 0% よりも優れているという受け入れられた回答に同意します。それは純粋にあなたの目標に依存します - あなたが達成しようとしていること、あなたが持っているサポートのレベル、そしてさまざまなタイプの冒涜を取り除くことがどれほど重要か.

フィルターを作成する際には、次の要素と、それらがプロジェクトにどのように関連しているかを考慮する必要があります。

  • 単語/フレーズ
  • 頭字語 (FOAD/LMFAO など)
  • 検知 (「ミシット」、「スカンソープ」、「ティッツワース」などの単語、場所、名前)
  • URL (ポルノ サイトは明らかなターゲットです)
  • 個人情報 (メールアドレス、住所、電話番号など - 該当する場合)
  • 言語の選択 (通常はデフォルトで英語)
  • モデレーション (もしあったとしても、ユーザーが生成したコンテンツをどのように操作できるか、およびそれに対して何ができるか)

冒とく的な表現の 90% 以上をキャプチャする冒とく的な表現フィルターを簡単に作成できますが、100% に到達することはありません。それは不可能です。100% に近づこうとすればするほど、それは難しくなります... 過去に 1 日あたり 50 万件以上のリアルタイム メッセージを処理する複雑な冒涜エンジンを構築した経験から、私は次のアドバイスを提供します。

基本的なフィルターには次のものが含まれます。

  • 該当する冒涜のリストを作成する
  • 冒とく的な表現の派生に対処する方法の開発

適度に複雑なファイラーには、(基本的なフィルターに加えて) 以下が含まれます。

  • 複雑なパターン マッチングを使用して拡張派生を処理する (高度な正規表現を使用)
  • リーツピークへの対応(l33t)
  • 検知への対処

複雑なフィルターには、(中程度のフィルターに加えて) 次のものが多数含まれます。

于 2012-11-19T04:27:21.010 に答える
29

これに適したライブラリは知りませんが、何をするにしても、物を通す方向に間違えないようにしてください。部分文字列として「ass」が含まれているため、「mpassell」をユーザー名として使用できないシステムを扱ってきました。これは、ユーザーを遠ざけるための優れた方法です。

于 2008-11-07T20:26:00.903 に答える
24

私の面接で、私を面接していた会社の CTO が、私が Java で書いた単語/Web ゲームを試してみました。オックスフォード英語辞書全体の単語リストから、最初に推測された単語は何ですか?

もちろん、英語で最も汚い言葉です。

どういうわけか、私はまだ仕事のオファーを受け取りましたが、その後、冒とく的な単語のリストを追跡し (これとは異なります)、すべての悪い単語のない新しい辞書を生成するための簡単なスクリプトを作成しました (リストを見る必要さえありません)。 .

あなたの特定のケースでは、検索を実際の単語と比較することは、そのような単語リストを使用する方法のように聞こえると思います. 別のスタイル/句読点にはもう少し作業が必要ですが、ユーザーがそれを頻繁に使用して問題になるとは思えません。

于 2008-11-07T22:36:23.653 に答える
24

たとえプログラマーが生意気で、すべての裸の開発に遅れないようにしていても、冒とく的なフィルタリングシステムは決して完璧ではありません.

とは言うものの、根本的な問題は現在の技術ではほとんど手に負えない言語理解であるため、「いたずらな言葉」のリストは他のリストと同様に機能する可能性があります。

したがって、唯一の実用的な解決策は次の 2 つです。

  1. 辞書を頻繁に更新する準備をする
  2. 人間の編集者を雇って、誤検知 (例: "classic" ではなく "clbuttic") と誤検知 (おっと! 見逃した!) を修正します。
于 2008-11-07T22:27:08.943 に答える
14

攻撃的なユーザー入力を防止する唯一の方法は、すべてのユーザー入力を防止することです。

ユーザー入力を許可し、モデレーションが必要な場合は、人間のモデレーターを組み込みます。

于 2008-11-07T20:42:39.200 に答える
13

CDYNE の Profanity Filter Web Serviceをご覧ください。

URL のテスト

于 2008-11-07T20:27:24.317 に答える
8

ローカリゼーションの問題に注意してください。ある言語での罵り言葉は、別の言語ではまったく普通の言葉である可能性があります。

これの現在の例: eBay はフィードバックから「悪い言葉」を除外するために辞書アプローチを使用しています。「これは完璧な取引でした」(「das war eine perfekte Transaktion」) のドイツ語訳を入力しようとすると、eBay は悪い言葉を理由にフィードバックを拒否します。

なんで?「だった」のドイツ語は「戦争」であり、「戦争」はebayの「悪い言葉」の辞書に載っているからです。

そのため、ローカリゼーションの問題に注意してください。

于 2010-04-27T12:55:55.407 に答える
7

「システムをだます」サブ質問に関しては、検索を行う前に「悪い言葉」リストとユーザーが入力したテキストの両方を正規化することで処理できます。たとえば、一連の正規表現 ( PHP がある場合はtr ) を使用して[z$5]を "s" に、[4@]を "a" などに変換し、正規化された "悪い単語" リストを正規化されたリストと比較します。文章。現時点では実際のケースは考えられませんが、正規化により誤検出が増える可能性があることに注意してください。

より大きな課題は、人々が「ペンは剣よりも強し」と引用できるようにする一方で、「ペニス」をブロックする何かを考え出すことです。

于 2008-11-08T01:35:13.167 に答える
6

ユーザーがわいせつなコンテンツに反対票を投じたりマークしたりできるDigg / Stackoverflowのようなことができるなら...そうしてください。

あとは、「いたずらな」ユーザーを確認し、ルールに違反しているユーザーをブロックするだけです。

于 2008-11-07T20:46:59.007 に答える
4

私はパーティーに少し遅れていますが、これを読んでいる人にとってはうまくいくかもしれない解決策があります. php ではなく javascript ですが、それには正当な理由があります。

完全な開示、私はこのプラグインを書きました...

いずれかの方法。

私が行ったアプローチは、ユーザーが冒涜的なフィルタリングに「オプトイン」できるようにすることです。基本的に冒とく的な表現はデフォルトで許可されますが、ユーザーが読みたくない場合は読む必要はありません。これは、「l33t sp3@k」の問題にも役立ちます。

概念は、クライアントのアカウントが冒涜フィルタリングを有効にしている場合にサーバーによって挿入される単純なそこから、誓いを消し去るのはほんの数行です。

デモページはこちら
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>

結果

*** は失敗しますが、パスワードは失敗しません

于 2012-10-29T03:22:52.477 に答える
2

フィルタリングしたいいくつかの悪い単語の良いMYSQLテーブルができたら(このスレッドのリンクの1つから始めました)、次のようなことができます:

$errors = array();  //Initialize error array (I use this with all my PHP form validations)

$SCREENNAME = mysql_real_escape_string($_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 />";

これらすべての置換を行うためのより効率的な方法があると確信していますが、私はそれを理解するほど頭がよくありません (これは非効率的ではありますが、問題なく動作するようです)。

ユーザーの登録を許可する側で誤りを犯し、必要に応じて人間を使用してフィルタリングし、冒とく的な表現のテーブルに追加する必要があると思います。ただし、それはすべて、偽陽性 (悪い単語としてフラグが付けられた大丈夫な単語) と偽陰性 (悪い単語が通過する) のコストに依存します。最終的には、フィルタリング戦略でどれだけ積極的か保守的かを決定する必要があります。

また、ワイルドカードを使用する場合は、意図したよりも厄介な動作をする場合があるため、非常に注意してください。

于 2011-08-16T02:33:47.447 に答える
2

この議論の上位にある HanClinto の投稿に同意します。通常、正規表現を使用して入力テキストの文字列を照合します。そして、これは無駄な努力です。あなたが最初に述べたように、「ブロックされた」リストでネット上で人気のあるすべてのトリック形式を明示的に説明する必要があるからです。

余談ですが、検閲の倫理について議論している人もいますが、ウェブには何らかの形式が必要であることに同意しなければなりません。一部の人々は、下品な内容を投稿することを単純に楽しんでいます。それは、多数の人々にとって即座に不快感を与える可能性があり、作成者側でまったく考える必要がないからです。

アイデアをありがとう。

ハンクリントが支配する!

于 2009-02-24T20:30:20.737 に答える
1

私は、適切な冒涜フィルターを作成するには、3 つの主要コンポーネントが必要であると結論付けました。これらは次のとおりです。

  1. フィルター: ブラックリスト、辞書などと照合するバックグラウンド サービス。
  2. 匿名アカウントを許可しない
  3. 不正行為を報告

おまけに、正確な虐待の報告者に貢献した人に何らかの形で報酬を与え、違反者を罰する(アカウントを一時停止するなど)ことになります。

于 2012-10-12T02:51:31.847 に答える
1

率直に言って、私は彼らに「システムをだます」という言葉を出させて、代わりにそれらを禁止したいと思います。しかし、それはまたプログラミングをより簡単にします。

私がしたいことは、正規表現フィルターを次のように実装することです:/[\s]dooby (doo?)[\s]/iまたは、単語が他の人の前に付けられます/[\s]doob(er|ed|est)[\s]/。これらは完全に有効な assuaged のような単語のフィルタリングを防ぎますが、他のバリアントの知識が必要であり、新しいものを学習した場合は実際のフィルターを更新する必要があります。明らかに、これらはすべて例ですが、自分で行う方法を決定する必要があります。

私が知っているすべての単語を入力しようとしているわけではありません。実際にそれらを知りたくない場合でもありません。

于 2008-11-07T20:25:28.860 に答える
1

しないでください。問題を引き起こすだけです。冒涜フィルターに関して私が持っている 1 つの巧妙な個人的な経験は、私が「数時間ハンコックへの橋を渡っていた」またはその趣旨の何かに言及したために、IRC チャネルからキック/禁止されたときです。

于 2008-11-07T20:37:46.777 に答える
-8

しないでください。

なぜなら:

  • クラブティック
  • 冒涜はOMG EVILではありません
  • 冒涜を効果的に定義することはできません
  • ほとんどの人は、冒とく的な言葉から「守られている」ことに感謝していないでしょう。

編集:「検閲は間違っている」と言ったコメンターには同意しますが、それはこの回答の性質ではありません。

于 2008-11-07T20:22:31.567 に答える