java - 从大文件中查找词频

标签 java apache-spark java-8 lucene bigdata

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

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. 使用扫描仪读取输入文件
  2. 使用此代码查找每个单词的频率:

    长字数 = Files.lines(Paths.get(allWordsFile)) .filter(s->s.contains(word)).count();

即,对于每个单词,我循环整个文件内容。尽管我使用的是线程池执行器,但这种方法的性能确实很差。 有更好的方法吗? 有什么工具可以从文件中查找单词的频率吗?

最佳答案

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

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);
    }
} 

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

关于java - 从大文件中查找词频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58049523/

相关文章:

java - 加入具有不同最后定界符的字符串

java - Jackson 序列化 View : nested object

apache-spark - spark DAG 中的 shufflequerystage 是什么?

java - 调用 close 方法后打开 MongoDB 连接的问题

java - 在 apache Spark 中读取大量文件的最佳实践

java - 如果在 Apache Spark Java 中为空,则用另一个值替换一行的值

spring - 如何使用函数<? super 字符串,?扩展字符串>

java - 在 Java 8 中是否有一种简洁的方法来迭代带有索引的流?

java - 在unix中部署在tomcat上时如何获取应用服务器地址

java - jackson 解码 : store inner xml as string