从文件中提取单词,然后计算频率

时间:2011-11-27 01:38:16

标签: java string file count word

我目前正处理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));
    }   
}

4 个答案:

答案 0 :(得分:1)

尝试使用java.util.Scanner

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我对此有几点建议:

    应该全面使用
  1. StringBuilder而不是String。您处理的文件越多,使用String就越多
  2. (Word)标记化是一项非常重要的任务。有很多优秀的图书馆可以帮助您获得一系列文字。从这里,您可以将此作为一个独特的集合或不是唯一的集合。由于您需要计数,因此每次出现都是唯一的。那么对于一个标记化器的建议,我建议使用Penn Treebank Tokenizer,例如here at CMU