Каков наилучший способ разобрать строку для «плохих» слов в C #? - PullRequest
7 голосов
/ 09 июля 2010

Я думаю о чем-то вроде:

foreach (var word in paragraph.split(' ')) {
  if (badWordArray.Contains(word) {
    // do something about it
  }
}

но я уверен, что есть лучший способ.

Заранее спасибо!

UPDATE Я не собираюсь удалять матом автоматически ... для моего веб-приложения я хочу получать уведомления, если используется слово, которое я считаю "плохим". Тогда я сам проверю, чтобы убедиться, что это законно. Система автоматической маркировки.

Ответы [ 3 ]

16 голосов
/ 09 июля 2010

Пока ваш путь работает, это может занять немного времени. Здесь замечательный ответ на предыдущий вопрос SO. Хотя вопрос говорит о PHP вместо C #, я думаю, что его легко перенести.

Изменить, чтобы добавить пример кода:

public string FilterWords(string inputWords) {
    Regex wordFilter = new Regex("(puppies|kittens|dolphins|crabs)");
    return wordFilter.Replace(inputWords, "<3");
}

Это должно работать для вас, более или менее.

Изменить, чтобы ответить на уточнение OP:

Я не собираюсь автоматически удалять нецензурные выражения ... для моего веб-приложения я хочу получать уведомления, если используется слово, которое я считаю "плохим".

Как и в приведенной выше части для замены, вы можете увидеть, соответствует ли что-то вроде этого:

public bool HasBadWords(string inputWords) {
    Regex wordFilter = new Regex("(puppies|kittens|dolphins|crabs)");
    return wordFilter.IsMatch(inputWords);
}

Он вернет true, если переданная ему строка содержит какие-либо слова в списке.

4 голосов
/ 09 июля 2010

На моей работе мы внедрили некоторую автоматическую фильтрацию плохих слов в наше программное обеспечение (отчасти шокирует просмотр исходного кода и внезапная работа с массивом, содержащим несколько страниц непристойности).

Один совет - предварительно обработать пользовательский ввод перед проверкой вашего списка, в этом случае кто-то пытается что-то украсть у вас. Таким образом, с помощью предварительной обработки мы

  • заглавные буквы на входе
  • удалить большинство не алфавитно-цифровых символов (то есть просто слить все пробелы или знаки препинания и т. Д.)
  • и затем, предположив, что кто-то пытается выдать цифры за буквы, сделайте что-то вроде этого: замените ноль на O, 9 на G, 5 на S и т. Д. (Проявите изобретательность)

А потом найдите друзей, чтобы попытаться сломать это. Это весело.

1 голос
/ 09 июля 2010

Можно рассмотреть возможность использования объектов HashKey или Dictionary<T1, T2> вместо массива, так как использование словаря, например, может сделать код более эффективным, поскольку метод .Contains () становится .Keys.Contains (), более эффективным. Это особенно верно, если у вас есть большой список ненормативной лексики (не уверен, сколько их! :)

...