首页 > 解决方案 > 从大文件中查找单词频率

问题描述

我有一个这样的文本文件:

tom
and
jerry
went
to
america
and
england

我也想获得每个单词的频率,包括部分匹配。即,单词to中出现的单词tom。所以我的预期字数to是2。

   1 america
   3 and
   1 england
   1 jerry
   2 to
   1 tom
   1 went

我拥有的文本文件约为30gb,因此无法将所有内容加载到内存中。所以我现在正在做的是:

  1. 使用读取输入文件scanner
  2. 对于使用此代码查找频率的每个单词:

    Long wordsCount = Files.lines(Paths.get(allWordsFile)) .filter(s->s.contains(word)).count();

即,对于每个单词,我都在循环整个文件内容。即使我正在使用threadpool executor,这种方法的性能也很差。有没有更好的方法来做到这一点?有什么工具可以从文件中找到单词的频率吗?

标签: javaapache-sparkjava-8lucenebigdata

解决方案


假设有很多重复,您可以尝试这样的事情(从头开始编写可能无法完美编译)

File file = 
  new File("fileLoc"); 
BufferedReader br = new BufferedReader(new FileReader(file)); 

Map <String, Integer> hm = new HashMap<>();
String name;
while ((name = br.readLine()) != null) 
    if(hm.containsKey(name){
        hm.replace(name,hm.get(name) + 1);
    }
    else{
        hm.put(name,1);
    }
} 

编辑:我没有注意到部分匹配部分,但您应该能够在读取输入文件后循环回地图,这样如果存在部分匹配,只需将部分匹配值与匹配值结合起来


推荐阅读