我有200,000个文件,我将为每个文件处理和提取令牌。所有文件的大小为1.5GB。当我编写用于从每个文件中提取标记的代码时,它运行良好。所有执行时间都是10分钟。
之后,我尝试删除stopwords
性能严重下降。这需要25到30分钟。
我正在使用网站上的停用词here大约有571个停用词。一般程序是一次从文本文件中提取每个停用词,并与文件中的每个标记进行比较。
这是代码存根
StringBuilder sb = new StringBuilder();
for(String s : tokens)
Scanner sc=new Scanner(new File("stopwords.txt"));
while(sc.hasNext())
{
if(sc.next().equals(s)){
flag = true;
break;
}
}
if(flag)
sb.append(s + "\n" );
flag = false;
}
String str = sb.toString()
**忽略错误。
上述代码的性能至少比代码低10倍。执行需要50到60分钟。
StringBuilder sb = new StringBuilder();
String s = tokens.toString();
String str = s.replaceAll("StopWord1|Stopword2|Stopword3|........|LastStopWord"," ");
表现非常好。这需要20至25分钟。
有没有更好的手术?
答案 0 :(得分:3)
当然这很糟糕。您正在进行O(n^2)
比较。对于每个单词,您要与另一个单词进行比较。您需要重新考虑您的算法。
将所有停用词读入HashSet<String>
,然后只需检查set.contains(word)
即可。这将大大提高您的表现。
答案 1 :(得分:0)
您应该考虑使用Apache Lucene API
它提供了基于LSA索引文件和删除停用词,源代码,搜索和文档相似性的功能