读取.txt文件并在文件中返回其频率列表

时间:2014-12-05 21:34:48

标签: java filereader

到目前为止我有这个,但它只将.txt文件打印到屏幕上:

import java.io.*;

public class ReadFile {
    public static void main(String[] args) throws IOException {
        String Wordlist;
        int Frequency;

        File file = new File("file1.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        String line = null;

        while( (line = br.readLine()) != null) {
            String [] tokens = line.split("\\s+");
            System.out.println(line);
        }
    }
}

任何人都可以帮助我这样打印一个单词列表和单词频率吗?

3 个答案:

答案 0 :(得分:2)

是否必须使用Java?这样做了:

sed 's/[^A-Za-z]/\n/g' filename.txt | sort | uniq -c

基本上,将任何非字母字符转换为换行符,对项目列表进行排序,然后让uniq计算出现次数。只需丢弃第一行输出,即空行数。这可以快速运行,甚至可以更快地进行编码。

您可以调整正则表达式,例如包括数字[A-Za-z0-9]或外语的重音字符[A-Za-zàèìòù]。

答案 1 :(得分:1)

做这样的事情。我假设文件中只能出现逗号或句号。否则,您还必须删除其他标点字符。我正在使用TreeMap,因此地图中的单词将以其自然字母顺序存储

  public static TreeMap<String, Integer> generateFrequencyList()
    throws IOException {
    TreeMap<String, Integer> wordsFrequencyMap = new TreeMap<String, Integer>();
    String file = "/tmp/lorem.txt";
    BufferedReader br = new BufferedReader(new FileReader(file));
    String line;
    while( (line = br.readLine()) != null){
         String [] tokens = line.split("\\s+");
      for (String token : tokens) {
        token = removePunctuation(token);
        if (!wordsFrequencyMap.containsKey(token.toLowerCase())) {
          wordsFrequencyMap.put(token.toLowerCase(), 1);
        } else {
          int count = wordsFrequencyMap.get(token.toLowerCase());
          wordsFrequencyMap.put(token.toLowerCase(), count + 1);
        }
      }
    }
    return wordsFrequencyMap;
  }

  private static String removePunctuation(String token) {
    token = token.replaceAll("[^a-zA-Z]", "");
    return token;
  }

测试的主要方法如下所示。为了获得百分比,您可以通过迭代地图并添加所有值来计算所有单词,然后再进行第二次获取百分比。顺便说一句,如果这是一个更大的工作的一部分,你还可以看看apache commons数学库来计算Frequency distributions。如果您使用他们的Frequency课程,您可以继续添加所有单词,然后在最后获得描述性统计数据。

  public static void main(String[] args) {
    try {
      int totalWords = 0;   
      TreeMap<String, Integer> freqMap = generateFrequencyList();
      for (String key : freqMap.keySet()) {
        totalWords += freqMap.get(key);
      }

      System.out.println("Word\tCount\tPercentage");
      for (String key : freqMap.keySet()) {
         System.out.println(key+"\t"+freqMap.get(key)+"\t"+((double)freqMap.get(key)*100.0/(double)totalWords));    
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

答案 2 :(得分:0)

创建HashMap

HashMap<String, Integer> occurrences = new HashMap<String, Integer>();

遍历每一行的数组

for(String word: tokens) {
  // Do stuff
}

然后检查每个单词之前是否已经读过该单词

if(occurrences.containsKey(word))
    occurrences.put(word, occurrences.get(word)+1);
else
    occurrences.put(word, 1);

完整版:

String Wordlist;
int Frequency;

File file = new File("file1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

HashMap<String, int> occurrences = new HashMap<String, int>();

String line = null;

while( (line = br.readLine()) != null){
    String [] tokens = line.split("\\s+");

    for(String word: tokens) {
        if(occurences.contains(word))
            occurences.put(word, occurences.get(word)+1);
        else
            occurences.put(word, 1);
    } 
}

可能是一个错字,没有经过测试,但这应该可以胜任。