2011-11-29 3 views
5

指定された文字列から不敬な単語を取り除く正しい方法は何ですか:
1)文字列の配列で探す単語のリストが100個あります。 2)部分的な単語を扱う正しい方法は何ですか?ほとんどの人はどのようにこれを処理しますか?たとえば、「質量」という単語です。時には部分的な言葉も悪いことがあります。私はfoobarとfoobar *と* foobarを禁止したいと思うかもしれない非常に俗語です。正規表現を使用した不敬感フィルタ

あなたはすべての単語をリストを通して1つの式またはループに入れますか?

これにはどのような方法で対処できますか?私はGroovy/Grailsを使用していますが、現代の言語の例を歓迎しています。

+2

このリンクをチェックしてください:http://stackoverflow.com/questions/273516/how-do-you-implement-a-good-profanity-filter –

+1

Scunthorpeの問題を見つけてください:http://en.wikipedia .org/wiki/Scunthorpe_problem – rossum

答えて

2
  1. 連結した単語のリストに各単語 - (foobar|foobaz|...)
  2. そして、また余分な文字

    [^[email protected]#$%^&*]*(foobar|foobaz|foofii)[^[email protected]#$%^&*]*

のためにグループ化のいずれかの側に警備員を配置し、あなたはおそらくよ大文字と小文字を区別しないフラグを使用して、FooBazやfOObaRなどの単語にも一致させたい

パフォーマンスが向上する限り、これを1つの大きな正規表現として連結するのはおそらく最も速いです(ただし、私は専門家ではありません)。正規表現アルゴリズムは、分岐条件を処理する&を検索するのにかなり効率的です。基本的に、それはO(mn)よりも優れている必要があります(m単語の数であるとnは、あなたが検索しているテキストのサイズである)

3

これは解決するために非常に困難な問題であり、あなたは正規表現がうまくいくかどうかを判断必要(実際のF単語を除いてfrackfaceのような冒涜に辞書の単語を追加すると)埋め込みをどのように処理するのかを示します。

通常、正規表現ではできる限度に制限があり、通常はすべての単語に対して1つの正規表現を使用できなくなります。文字列に対して複数の正規表現を実行するのは、あなたが必要とするパフォーマンスと、ブラックリストの入手可能性に応じて、実際には遅くなります。当初は正規表現システムとしてCleanSpeakを実装しましたが、それは拡張されず、別のメカニズムを使用して書き直しました。

また、フレーズ、句読点、スペース、リート・スピーチなどの言語も考慮する必要があります。これらのすべてが、正規表現を解決策としてあまり魅力的にしません。 | - | ello

  • h3llo
    • リスト項目
    • ハロー
    • ハロー
    • h_e_l_l_o
    • :こんにちは単語を使用して、いくつかの例がある(それがこの演習のための冒涜であると仮定)
    • 「こんにちは」(このフレーズには不公平な言葉が含まれていないかもしれませんが、それらは不公平です)

    また、2つ以上の辞書(ホワイトリスト)の単語が相互に隣り合ったときに冒涜を含む場合の境界ケースを処理する必要があります。S-単語を含むいくつかの例:

    • はbashのそれを
    • sshはそれが

    静かな時間だこれらは明らかに冒涜ではありませんが、ほとんど自家製、多くの商用ソリューションは、これらのケースで問題を抱えています。

    CleanSpeakで使用されているフィルタをこの3年間で完成させました。これらのすべてのケースを確実に処理するために、私たちはそれを調整して改善し続けています。パフォーマンスのためにシステムを完成させるのに8ヶ月を費やし、毎秒約5,000件のメッセージを処理できます。使えるものを作ることはできませんが、出てくるかもしれない多くの問題に対処し、正規表現を使用しないシステムを作成する準備は整っていません。

    関連する問題