如何在我的代码中找到缺失的边缘情况

时间:2015-03-28 06:09:03

标签: java regex mapreduce pattern-matching

我正在使用地图缩减工作处理推文。我想做的其中一件事就是审查滥用的词语。当我在本地测试我的代码时,它可以按需运行。但是,当我在一些文本的整个数据集上运行它时,它会审查滥用的单词,但会错过一些。现在,由于数据总大小为1TB(800个文件),我无法以原始格式(JSON)找到特定的推文数据,因此我可以在本地测试它以找到问题。但是我有推文文本(不是整个json)从我的地图缩减程序中未经审查。为了测试我尝试将该文本放在其他一些推文json的推文文本字段中,并且程序正确地审查了滥用的单词。你能提出任何可以找到错误的策略。或者,如果您在我的代码中发现了一个错误,只需查看它就会很棒 循环所有推文单词的功能(由非字母数字字符分割的推文)

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

    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;
}

我要审查的示例文字:     “text”:“Gracias a todos los seguidores de cuantoporno y http://t.co/,#sex #sexo #porn #porno #pussy #xxx;” 只有当这个词被特殊字符或空格包围时才会审查它     “text”:“Gracias a todos los seguidores de cuantoporno y http://t.co/,#s * x #sexo #porn #porno #p *** y #xxx;”

第一个文本是我的地图缩小的输出,但预期的输出是第二个文本。当我在本地机器上为同一个java文件输入相同的文本时,我得到了预期的结果。可能是什么问题?

1 个答案:

答案 0 :(得分:0)

除了lookahed / lookbehind之外,您不使用任何正则表达式功能。在Java regexp搜索中没有优化Lookahead和lookbehind。您也可以搜索字符串,然后验证前/后字符是否正常。

这样可以节省很多性能:

  • 正则表达式的编译很昂贵(与字符串搜索编译相比)
  • 使用正则表达式搜索甚至更昂贵(与字符串搜索相比)

因此,如果您想解决问题:使用字符串搜索算法(如boyer-moore-horspool)。

如果你使用多字符串搜索算法,它会变得更有效率,比如set-horspool或wu-manber。这样的算法将提供所有单词的所有索引,其性能几乎为O(n)(n是文本的长度)。