如何以更有效的方式从大型集合文件中删除停用词?

我有200,000个文件,我将为每个文件处理和提取令牌。 所有文件的大小为1.5GB。 当我编写用于从每个文件中提取标记的代码时,它运行良好。 在所有执行时间是10分钟。

在那之后,我试图删除stopwords性能严重下降。 这需要25到30分钟。

我正在使用网站上的停用词这里有大约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分钟。

有没有更好的手术?

当然这很糟糕。 你正在进行O(n^2)比较。 对于你要与另一个词进行比较的每个单词。 您需要重新考虑您的算法。

读取HashSet所有停用词,然后检查set.contains(word) 。 这将大大提高您的表现。

您应该考虑使用Apache Lucene API

它提供了基于LSA索引文件和删除停用词,源代码,搜索和文档相似性的function