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

时间:2014-03-07 18:12:00

标签: java algorithm stop-words

我有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分钟。

有没有更好的手术?

2 个答案:

答案 0 :(得分:3)

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

将所有停用词读入HashSet<String>,然后只需检查set.contains(word)即可。这将大大提高您的表现。

答案 1 :(得分:0)

您应该考虑使用Apache Lucene API

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