从大文件中查找单词频率

时间:2019-09-22 13:06:51

标签: java apache-spark java-8 lucene bigdata

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

http://192.168.10.10/video.mp4

我也想获得每个单词的频率,包括部分匹配。也就是说,单词tom and jerry went to america and england 中存在单词to。因此,我期望的tom的字数是2。

to

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

  1. 使用 1 america 3 and 1 england 1 jerry 2 to 1 tom 1 went 读取输入文件
  2. 使用该代码查找频率的每个单词:

    scanner

即,对于每个单词,我循环播放整个文件内容。即使我使用的是Long wordsCount = Files.lines(Paths.get(allWordsFile)) .filter(s->s.contains(word)).count();,这种方法的性能也确实很差。 有更好的方法吗? 有什么工具可以从文件中查找单词的出现频率?

2 个答案:

答案 0 :(得分:1)

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

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

编辑:我没有注意到部分匹配项,但是您应该能够在阅读回车文件后在地图上循环浏览,这样,如果存在部分匹配项,则只需组合部分匹配项值即可匹配值

答案 1 :(得分:0)

最好的性能是使用BufferedReader从文件中读取各行,并将单词计数器存储在HashMap中。