-2

我有一个大文本文件(大小远高于 1G),我想使用 Java 来计算该文件中某个单词的出现次数。文件中的文本写在一行上,因此可能无法逐行检查。解决这个问题的最佳方法是什么?

4

4 回答 4

2

您想使用 Java 的Scanner类逐字使用该巨大文件。调用 useDelimiter(...) 方法一次来配置单词的拆分方式(可能只是一个空格字符),然后使用 hasNext() 和 getNext() 循环文件内容。

对于计数本身,您可以使用 HashMap 为简单起见。

于 2012-05-12T05:40:47.740 回答
1

您可以使用Trie数据结构的细微变化。此 DS 用于创建单词词典。例如你想搜索'Stack',你可以通过传递'Sta'来搜索trie,它会返回所有以'Sta'开头的单词。

现在在您的问题中,您可以逐字遍历文件并将其放入 trie 中。为每个单词添加额外的字段“计数”。现在,当您插入修改后的尝试时,您可以增加“计数”。现在你已经计算了 trie 中的所有单词。

我认为内存使用量不应过多,因为 1G 文件中的大多数单词都是重复的。您只需遍历文件一次。而且一旦你有了这个 trie,你就可以搜索多个单词而不会降低性能。

编辑:

如果您需要完全匹配,我必须同意@Bananeweizen HashMap 也是一个很好的解决方案。所以逐字阅读并放入HashMap。内存使用量应与 try 相同。

于 2012-05-12T05:46:35.230 回答
0

您首先需要对单词进行排序,以便它们按字母顺序排列。在读入数据并在空格上拆分单词后,您可以通过多种方式执行此操作。您还需要在排序之前删除特殊字符和标点符号。

排序后,您要定位的单词都会并排排列,这将使您的搜索成为 O(N) 问题。此时,您可以使用循环结构来遍历并比较每个单词,直到找到单词的第一个实例。在那一点上,你继续循环,计算每个单词,直到你到达下一个单词。

此时,您知道您的集合中没有该词的更多实例,您可以停止搜索。

这种特定的搜索算法是 O(N) 最坏的情况。如果您的单词是“apple”,那么搜索完成的速度可能比您的单词是“zebra”要快得多。

您可以选择其他算法,具体取决于您的具体需求。

根据您的问题,我假设这是一个编程练习,而不是实际的工作问题。如果是工作问题,那么这个问题已经被解决了无数次,并且有很多 Java 搜索库可以帮助您解决这个问题,包括 Java 标准库中的工具。

于 2012-05-12T05:39:41.210 回答
-2

您可以使用外部工具构建一些文本索引。之后,您将能够在此索引中快速找到计数不同的单词。例如,您可以获得 Lucene 来构建此类索引。然后简单地获取其中的术语频率。有类似的问题计算 lucene 索引中的词频以及文章和代码示例的链接。

于 2012-05-12T05:37:39.363 回答