2016-11-19 7 views
-3

Мне нужна помощь с этим кодом. Я хочу, чтобы моя программа вычисляла частоту каждого слова, сопоставленного с описанным шаблоном.Как рассчитать частоту слова из txt-файла - Java

public class Project { 
    public static void main(String[] args) throws FileNotFoundException{ 
    Scanner INPUT_TEXT = new Scanner(new File("moviereview.txt")).useDelimiter(" "); 

    String pattern = "[a-zA-Z'-]+"; 
    Pattern r = Pattern.compile(pattern); 

    int occurences=0; 

    while(INPUT_TEXT.hasNext()){ 
     //read next word 
     String Stringcandidate=INPUT_TEXT.next(); 

     //see if pattern matches (boolean find) 
     if(r.matcher(Stringcandidate).find()) { 
      occurences++; //increment occurences if pattern is found 
      String moviereview = m.group(0); //retrieve found string 
      String moviereview2 = moviereview.toLowerCase(); // ??? 

      System.out.println(moviereview2 + " appears " + occurences); 
      if(occurences>1){ 
       System.out.println(" times\n"); 
      } 
      else{ 
       System.out.println(" time\n"); 
      } 
     } 
     INPUT_TEXT.close();//Close your Scanner.  
    } 

} 
+2

Вы можете быть более конкретным? Что происходит прямо сейчас? Мы здесь не для того, чтобы запускать ваш код для вас. Более того, у нас нет вашего текстового файла –

+1

Я не могу вам помочь. Я отказываюсь смотреть на код, когда вы даже не можете правильно отформатировать (отступать) код, чтобы показать структуру кода. – Andreas

+0

Добро пожаловать в StackOverflow. У вас есть лучшие шансы на полезные ответы, если вы будете следовать рекомендациям из справочного центра. Например, например: «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны для других читателей ». –

ответ

1

Как описано в моем комментарии выше, можно использовать карты (HashMap) для хранения совпавших слов и их появления/fréquence.

Я рекомендую инкапсулировать функциональность программы на более мелкие методы/классы, чтобы каждый метод/класс выполнял только небольшую задачу. Таким образом, код можно читать лучше.

Я предположил, файл содержал строку «авто куст переиграла ее помидоры в петунии авто»

Вот код:

package how_to_calculate_the_frequency; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.HashMap; 
import java.util.Scanner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Project { 

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

    public static void main(String[] args){ 

     Project project = new Project(); 

     Scanner INPUT_TEXT = project.readFile(); 

     project.analyse(INPUT_TEXT); 

     project.showResults(); 

    } 

    /** 
    * logic to count the occurences of words matched by REGEX in a scanner that 
    * loaded some text 
    * 
    * @param scanner 
    *   the scanner holding the text 
    */ 
    public void analyse(Scanner scanner) { 

     String pattern = "[a-zA-Z'-]+"; 
     Pattern r = Pattern.compile(pattern); 

     while (scanner.hasNext()) { 
      // read next word 
      String Stringcandidate = scanner.next(); 

      // see if pattern matches (boolean find) 
      Matcher matcher = r.matcher(Stringcandidate); 
      if (matcher.find()) { 
       String matchedWord = matcher.group(); 
       //System.out.println(matchedWord); //check what is matched 
       this.addWord(matchedWord); 

      } 

     } 
     scanner.close();// Close your Scanner. 
    } 

    /** 
    * adds a word to the <word,count> Map if the word is new, a new entry is 
    * created, otherwise the count of this word is incremented 
    */ 
    public void addWord(String matchedWord) { 

     if (map.containsKey(matchedWord)) { 
      // increment occurrence 
      int occurrence = map.get(matchedWord); 
      occurrence++; 
      map.put(matchedWord, occurrence); 
     } else { 
      // add word and set occurrence to 1 
      map.put(matchedWord, 1); 
     } 

    } 

    /** 
    * reads a file from disk and returns a scanner to analyse it 
    * 
    * @return the file from disk as scanner 
    */ 
    public Scanner readFile() { 

     Scanner scanner = null; 

     /* use that for reading a file from disk 
     * try { scanner = new Scanner(new 
     * File("moviereview.txt")).useDelimiter(" "); } catch (Exception e) { 
     * e.printStackTrace(); } 
     */ 

     scanner = new Scanner("auto bush trumped her tomato in the petunia auto"); 

     return scanner; 
    } 

    /** 
    * prints the matched words and their occurrences 
    * in a readable way 
    */ 
    public void showResults() { 

     for (HashMap.Entry<String, Integer> matchedWord : map.entrySet()) { 
      int occurrence = matchedWord.getValue(); 
      System.out.print("\"" + matchedWord.getKey() + "\" appears " + occurrence); 
      if (occurrence > 1) { 
       System.out.print(" times\n"); 
      } else { 
       System.out.print(" time\n"); 
      } 
     } 

     // or as the new Java 8 lambda expression 
     // map.forEach((word,occurrence)->System.out.println("\"" + word + "\" 
     // appears " + occurrence + " times")); 
    } 
} 

// DONE seperate reading a file, analysing the file and 
// word-frequency-counting-logic in different 
// methods 
// Done implement <word,count> Map and logic to add new and known(to the map) 
// words 

Это дает:

«» появляется 1 время

"авто" появляется в 2 раза

"ее" ар груши 1 раз

"в" появляется 1 раз

появляется

"куст" 1 раз

"аннулируют" появляется 1 раз

появляется

"помидор" 1 раз

"Petunia" появляется 1 раз

Отношения

Смежные вопросы