如何以更有效的方式从大型集合文件中删除停用词?
我有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