用于阻止非英语单词的任何Java函数?

时间:2014-01-28 08:30:24

标签: java algorithm text-mining java-api

请建议我使用

删除非英语单词和阻止错误单词的最佳Java API

我使用英文单词列表文件来解析给定的字符串。代码响应非常缓慢。 `

String englishword;
    while ((englishword = br.readLine()) != null) {
        //System.out.println("@"+englishword);
        for (String word : wordsArray) {
            //System.out.println("#"+word);
            if(englishword.trim().toUpperCase().equals(word.trim().toUpperCase()))
            {

                linetmp = linetmp.replaceAll(word, " ").trim();
                break;
            }
        }
        }
    if(linetmp!=null)
    for(String nonEnglish:linetmp.split("\\s+"))
    {
        line = line.replaceAll(nonEnglish, "");
    }
    line = line.replaceAll(" +", " ");
    return line;

如果有更快的方法,请建议我 注意:我正在使用Linux OS的字典listy

3 个答案:

答案 0 :(得分:0)

for (String word : wordsArray)周期之外,仅对选中字的trim()和touppercase()进行一次。

如果你在内循环中做过多的重操作,没有API会帮助你。

您可以使用Java API函数进行搜索

 import org.apache.commons.lang.ArrayUtils;
 ArrayUtils.indexOf(array, string);

答案 1 :(得分:0)

您可以通过将wordsArray更改为HashSet并使用contains(String)方法进行检查,使代码更快 1 。 (确保在构建集合时将单词转换为大写。)

但是,我会指出这种方法并不适合。列举所有可能的"非英语或不正确的"是不切实际的。话。你最好建立一个包含你准备接受的所有单词的集合,然后删除不在集合中的单词。


1 - 目前,您的内部循环需要的时间与N中的单词数量wordArray)成正比;即O(N)。如果您使用HashSet,则操作需要O(1)次;即大致恒定的时间。

答案 2 :(得分:0)

有一种更快的方式。

创建一个HashSet<String>,其中包含wordsArray中的所有元素(作为小写/大写)。

对于每个新词englishword,请检查set.contains(englishword.toLowerCase())

此解决方案在O(n|S|)预处理(创建HashSet)中运行,并且检查每个单词是O(|S|),其中|S|是字符串的长度,n是数组中的单词数,而你的解决方案基本上是每个单词O(n | S |)。

代码快照:

public static class EnglishChecker { 
        private final Set<String> set;
        public EnglishChecker(String[] englishWords) { 
            set = new HashSet<>();
            for (String s : englishWords) {
                set.add(s.toLowerCase());
            }
        }
        public boolean isWord(String s) { 
            return set.contains(s.toLowerCase());
        }
}
 public static void main(String[] args) {
        String[] words = { "Cat", "dog", "mousE" };
        EnglishChecker checker = new EnglishChecker(words);
        System.out.println(checker.isWord("cat"));
        System.out.println(checker.isWord("cccccccat"));
        System.out.println(checker.isWord("MOUSE"));

}