Как найти пропущенный случай в моем коде

1

Я обрабатываю твиты, используя работу по сокращению карты. Одна из вещей, которую я хочу сделать, - это цензура злоупотребляющих слов. Когда я тестирую свой код локально, он работает по своему желанию. Но когда я запускаю его на весь набор данных для некоторого текста, он подвергает цензуре злоупотребляющие слова, но пропускает некоторые. Теперь, когда данные составляют 1 ТБ в общем размере (800 файлов), я не могу найти эти данные твитов в исходной форме (JSON), чтобы я мог проверить его локально, чтобы найти проблему. Однако у меня есть текст твита (не весь json), который получил цензуру из моей программы сокращения карты. Чтобы проверить, я попытался поместить этот текст в текстовое поле твита какого-либо другого твита json, и программа правильно подвергла цензуре злоупотребляющее слово. Можете ли вы, ребята, предложить любую стратегию, с помощью которой я могу найти ошибку. Или если вы обнаружите ошибку в моем коде, просто взглянув на нее, это будет отличная функция, которая прокручивает все слова твита (твит, разделенный не буквенно-цифровым символом)

public static String censorText (String text, String textWords [], Set banned) {StringBuilder builder = new StringBuilder (текст);

    textWords = getTextArray(text);

    for (int i = 0; i < textWords.length; i++) {

        if (banned.contains(textWords[i].toLowerCase())) {

            String cleanedWord = cencor(textWords[i]);
            // compile a pattern with banned word
            List<Integer> indexList = getIndexes(builder, textWords[i]);
            replaceWithCleanWord(builder, indexList, cleanedWord);
        }
    }

    return builder.toString();
}
//function to find the position of abuse word in the tweet text so     that //can be replaced by censored word
private static List<Integer> getIndexes(StringBuilder builder, String string) {

    List<Integer> indexes = new ArrayList<Integer>();
    String word = "(" + string.charAt(0) + ")" + string.substring(1);
    System.out.println("word to match" +word);
    Pattern p = Pattern.compile("(?<=^|[^a-zA-Z\\d])" + word + "(?=$|[^a-zA-Z\\d])");
    Matcher m = p.matcher(builder.toString());
    while (m.find()) {
        indexes.add(m.start());
    }
    return indexes;
}

Пример текста Я хочу подвергнуть цензуре: "текст": "Gracias a todos los seguidores de cuantoporno y http://t.co/, #sex #sexo #porn #porno #pussy #xxx;" только если слово окружено специальными символами или пробелом, то цензура "текст": "Gracias a todos los seguidores de cuantoporno y http://t.co/, # s * x #sexo #porn #porno # p ** * y #xxx; "

Первый текст - это вывод моей карты, но ожидаемый результат - второй текст. Когда я ввожу тот же текст на свой локальный компьютер для одного и того же java файла, я получаю ожидаемый результат. В чем может быть проблема?

  • 0
    Чтобы сделать его более читабельным, вы можете заменить [^ a-zA-Z \\ d] на \ W (без буквенно-цифровых символов), верно? Почему первый символ в скобках?
Теги:
pattern-matching
mapreduce

1 ответ

0

Вы не используете функцию регулярного выражения, отличную от lookahed/lookbehind. Lookahead и lookbehind не оптимизированы в поиске Java regexp. Вы могли бы также искать строку, а затем проверить, хорошо ли символ до/позади.

Это сэкономит много времени:

  • компиляция регулярных выражений является дорогостоящей (по сравнению с компиляцией строкового поиска)
  • поиск с регулярными выражениями еще дороже (по сравнению со строковым поиском)

Поэтому, если вы хотите решить проблему: используйте строковый алгоритм поиска (как boyer-moore-horspool).

И он становится еще более эффективным, если вы используете алгоритм многостраничного поиска, например set-horspool или wu-manber. Такой алгоритм будет доставлять все индексы всех слов с производительностью почти O (n) (n - длина текста).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню