Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从文件中提取单词,然后计算频率_Java_String_File_Count_Word - Fatal编程技术网

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

Java 从文件中提取单词,然后计算频率,java,string,file,count,word,Java,String,File,Count,Word,我目前正在处理20个txt文件,任务是计算每个单词的单词频率,然后将结果输出到单个txt文件中 例如:单词--“新闻”在20个文件中出现47次。 目前,我只设法将所有20个文件读入我的程序(我将所有文件数据存储在一个--(字符串docBus)中),但我需要从(字符串docBus)中提取单词(逐字)的帮助进入字符串数组…顺便说一句,文件包含标点符号,数字…等等…但我需要的是计算单词的频率…所以我需要避免在我的程序中使用这些标点符号,数字。。。 以下是我目前的代码: public class Cou

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

例如:单词--“新闻”在20个文件中出现47次。 目前,我只设法将所有20个文件读入我的程序(我将所有文件数据存储在一个--(字符串docBus)中),但我需要从(字符串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));
    }   
}
公共类计数扩展了javax.swing.JFrame{
ArrayList fileBusName=新的ArrayList();
字符串docBus=“”;
私有void returnBusFilenName(){
字符串str=“”;

对于(inti=1;i尝试使用
java.util.Scanner

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

我郑重地建议将文件作为流处理,并在处理过程中更新字数,而不是将所有文件读入内存,然后读取该字符串

可能最简单的方法是用一个地图来保存你找到的每一个单词。你的更新功能可以是:

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

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

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

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

关于这一点,我有几点建议:

  • 应全面使用
    StringBuilder
    而不是
    String
    。处理的文件越多,使用
    String
    得到的好处就越多
  • (字)标记化是一项非常重要的任务。有许多优秀的库可以帮助您获取单词集合。从这里,您可以将其设置为唯一集合或非唯一集合。由于您需要计数,每次出现都是唯一的。因此,对于标记器的推荐,我建议使用Penn Treebank标记器,例如