【问题标题】:How to remove stop words from a large collection files with more efficient way?如何以更有效的方式从大型集合文件中删除停用词?
【发布时间】:2017-01-22 16:14:36
【问题描述】:

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

有没有更好的方法?

【问题讨论】:

  • 将停用词放在HashSet<String> 中,并使用set.contains(word) 来确定某个词是否为停用词。这应该是有效的。
  • 你使用多线程吗?如果你不这样做,它会有很大帮助。
  • 是的..我正在使用 6 个线程..
  • 6 个线程?你让这变得复杂了。你是cpu绑定和磁盘。线程对你帮助不大。
  • 是的..我想弄清楚..我的电脑配置很好..

标签: java algorithm stop-words


【解决方案1】:

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

将所有停用词读入HashSet<String>,然后检查set.contains(word)。这将显着提高你的表现。

【讨论】:

  • 不是从扫描仪读取和比较,而是从扫描仪读取并放入集合使用。 set.add(word).
  • 出于好奇,这是在集合/列表中阅读内容与使用扫描仪阅读之间的区别吗?扫描仪很慢?
  • 是的,有很大的不同。这个问题的答案太大了。但是您正在打磁盘与内存。还设置为 O(1) 查找时间与列表为 O(n)。所以有很多不同。
【解决方案2】:

您应该考虑使用Apache Lucene API

它提供了索引文件和删除停用词、词干提取、搜索和基于 LSA 的文档相似性的功能

【讨论】:

  • 可以提供更具体的链接吗?
猜你喜欢
  • 2011-05-03
  • 2021-03-21
  • 2020-02-24
  • 2018-05-26
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
相关资源
最近更新 更多