1

Java Regexを使用して禁止された単語に一致させるにはどうすればよいですか。たとえば、stackoverflowという単語を禁止したい場合は、stackoverflow、stackoverflow、stackoverflowに一致します。

これの目的は、人々がチャットで禁止された言葉を言うのを防ぐことです。正規表現は、どちらの側でも何でもできるように機能する必要があります。たとえば、「Stackoverflowに移動、その優れたWebサイト」はstackoverflowを検出します。

4

2 に答える 2

1

あなたができることは、英数字以外のすべての文字をここから取り除いてから、禁止された単語に一致させることです. しかし、これはあなたの聴衆に汚い言葉を伝える可能性を完全に排除するものではありません. たとえば、人間の認知システムがとにかく理解できるリートを使用することができます。たとえば、「Long」という単語は「| 0ng」と書くことができます。たとえば、「アレクサンダー」は「/\ | 3 >< /\ |\| c| 3 r」のようになります。

于 2013-01-21T19:06:13.383 に答える
0

特に正規表現ベースの回答を求めていましたが、特に不規則な人間の入力を処理する場合、正規表現は常に必要なものにスケールアップするとは限りません。

いくつかの文字列類似アルゴリズムがあり、Fairmutex の回答のような単純な予備フェーズと組み合わせると、より包括的な禁止フィルターを提供できます。

使用される一般的なアルゴリズムの 1 つは、レーベンシュタイン距離です。高速ですが、単語の順序に大きく基づいているため、「Overflow Stack」の入力で「Stack Overflow」を検索すると、否定的な結果が得られます。

私の以前のプロジェクトでは、後者の苦境を考慮に入れたこの巧妙なアルゴリズムを使用しました。少し重いですが、正規表現やレーベンシュタイン距離よりもうまく機能します。

もう 1 つのアイデアは、前にリンクした Strike-a-Match アルゴリズムを通じて入力を実行し、入力が類似度の特定のしきい値 (たとえば、50% 以上の一致) を超えた場合、特定の一般リート フィルターを実行することです。これは、一般的に使用されているリートスピークを置き換えることに基づいて機能します。たとえば、「|\|」間隔に関係なく、「n」に置き換えられます。

于 2013-02-21T01:09:27.537 に答える