【问题标题】:extract words from file, then count frequency从文件中提取单词,然后计算频率
【发布时间】:2011-11-27 01:38:15
【问题描述】:

我目前正在处理20个txt文件,任务是统计每个单词的词频,然后将结果输出到单个txt文件中...

例如:word --"news" 在 20 个文件中出现 47 次。 目前,我只设法将所有 20 个文件读入我的程序(我将所有文件数据存储到一个文件中——(String docBus),但我需要帮助从(String docBus)中提取单词(逐字)到一个字符串数组...顺便说一句,文件包含标点符号、数字...等...但我需要的只是计算单词频率...所以我需要避免在我的程序中使用那些标点符号、数字... 到目前为止,这是我的代码:

public class Count extends javax.swing.JFrame {

ArrayList<String> fileBusName = new ArrayList<String>();
String docBus = "";

private void returnBusFilenName(){
    String str = "";
    for(int i = 1; i <= 20; i++){
        str = "nlg/bus" + i + ".txt";
        fileBusName.add(str);
    }
}

private String getFile(String file){
    String strLine = "", str = "";
    try{

        BufferedReader in = new BufferedReader(new FileReader(file));
        while((strLine = in.readLine()) != null){
            str += strLine + "\n ";
        }
        in.close();

    }catch(Exception e){

    }
    return str;
}

private void getDocBus(){
    returnBusFilenName();
    for(int i=0; i<=19; i++){
        docBus = docBus + getFile(fileBusName.get(i));
    }   
}

【问题讨论】:

    标签: java string file count word


    【解决方案1】:

    尝试使用java.util.Scanner

    Scanner scanner = new Scanner(inputFile);
    scanner.useDelimiter("[^a-zA-Z]"); // non alphabets act as delimeters
    String word = scanner.next();
    

    【讨论】:

      【解决方案2】:

      我强烈建议将文件作为流处理并随时更新字数,而不是将所有文件读入内存然后再读取该字符串。

      要做到这一点,最简单的方法可能是拥有一个地图,其中包含您找到并找到的每个单词。您的更新功能可能类似于:

      String s = //method that scans until a delimiter is found
      if (map.get(s)) == null) {
         map.put(s, 1);
      } else {
         map.put(s, map.get(s) + 1);
      }
      

      当然,这样做是在滥用自动装箱,但编写起来很容易,并且可以在以后优化性能。

      【讨论】:

        【解决方案3】:

        首先,如果您的输入文件很大,例如以 GB、TB 或更多为单位,您可能有兴趣使用 Hadoop 和 MapReduce 进程完成相同的工作。然而,对于较少的数据输入,它们将不适合。但是,在这两种情况下,您都可以使用 Apache Lucene 来分析和标记您的输入文本。 Lucene 基本上用于索引和搜索非常大的数据,但是您仍然可以使用它来解决您的问题,因为它的 Analyzer 和 Tokenizer 框架非常适合您的情况。

        如果您不想执行上述任何操作,则只需将所有标点符号和数字替换为不会干扰下一个过程的其他字符,例如空间 ' '。您可以使用正则表达式来实现这一点。接下来,如果您关心一些预定义的单词,您可以再次使用正则表达式找到单词的频率。如果您需要计算输入中出现的所有单词的频率,您仍然可以使用正则表达式来完成它。首先使用 RegEx next 为您可以迭代的每个匹配的单词匹配一个单词模式,只需维护一个以每个单词作为键的哈希映射,并根据键递增哈希映射的值。此方法还具有高级过滤选项,例如不计算长度小于 2 或类似单词的频率。在写这个答案时,我得到了一个很好的example 做同样的事情。 :) 希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          我对此有几个建议:

          1. 应该使用StringBuilder 而不是String 全面使用。您处理的文件越多,使用String 的次数就越多
          2. (Word) 标记化是一项不平凡的任务。有许多优秀的图书馆可以帮助您收集单词。从这里,您可以将其设为独特的收藏或非独特的收藏。由于您需要计数,因此每次出现都是唯一的。因此,对于分词器的推荐,我建议使用 Penn Treebank 分词器,例如 here at CMU

          【讨论】:

            猜你喜欢
            • 2017-04-03
            • 1970-01-01
            • 2015-06-14
            • 2011-05-30
            • 1970-01-01
            • 2015-01-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多