我正在使用地图缩减工作处理推文。我想做的其中一件事就是审查滥用的词语。当我在本地测试我的代码时,它可以按需运行。但是,当我在一些文本的整个数据集上运行它时,它会审查滥用的单词,但会错过一些。现在,由于数据总大小为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文件输入相同的文本时,我得到了预期的结果。可能是什么问题?
答案 0 :(得分:0)
除了lookahed / lookbehind之外,您不使用任何正则表达式功能。在Java regexp搜索中没有优化Lookahead和lookbehind。您也可以搜索字符串,然后验证前/后字符是否正常。
这样可以节省很多性能:
因此,如果您想解决问题:使用字符串搜索算法(如boyer-moore-horspool)。
如果你使用多字符串搜索算法,它会变得更有效率,比如set-horspool或wu-manber。这样的算法将提供所有单词的所有索引,其性能几乎为O(n)(n是文本的长度)。