-1

Good day!

I have created a code using Netbeans and it executes the processes just fine. Now, i want my input to given and output to be displayed through a user interface. I have then created a 2 Jframes, 1 to collect the user's input and the other to display the results after execution by the code.

But, i am unable to link the interface to the main class(called NgramBetaE) as i am not aware of how i can do so.

I highly welcome suggestions.

The main class in its entirety is;

package ngrambetae;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;


/**
 *
 * @author 201102144
 */
 public class NgramBetaE {



static LinkedList<String> allWords = new LinkedList<String>();
static LinkedList<String> distinctWords = new LinkedList<String>();
static String[] hashmapWord = null;
static int wordCount;
public static HashMap<String,HashMap<String, Integer>> hashmap = new HashMap<>();
public static HashMap<String,HashMap<String, Integer>> bigramMap = new HashMap<>();


/**
 * @param args the command line arguments
 */
public static void main(String[] args) {


    //prompt user input
    Scanner input = new Scanner(System.in);

    //read words from collected corpus; a number of .txt files
            File directory = new File("Corpus");
            File[] listOfFiles = directory.listFiles();//To read from all listed iles in the "directory"

            int lineNumber = 0;
            String line;
            String files;
            String delimiters = "[()?!:;,.\\s]+";

           //reading from a list of text files 
            for (File file : listOfFiles) {
                if (file.isFile()) {
                    files = file.getName();
                    try {
                        if (files.endsWith(".txt") || files.endsWith(".TXT")) {  //ensures a file being read is a text file 
                        BufferedReader br = new BufferedReader(new FileReader(file)); 


                        while ((line = br.readLine()) != null) {
                                line = line.toLowerCase();

                                hashmapWord = line.split(delimiters);


                                //CALCULATING UNIGRAMS                                
                                for(int s = 0; s < hashmapWord.length; s++){

                                    String read = hashmapWord[s];

                                    allWords.add(read);

                                    //count the total number of words in all the text files combined
                                    //TEST
                                    wordCount = 0;                                                                   
                                        for (int i = 0; i < allWords.size(); i++){
                                        wordCount ++;                                        
                                }   

                                }

                                //CALCULATING BIGRAM FREQUENCIES
                                for(int s = 0; s < hashmapWord.length -1; s++){

                                    String read = hashmapWord[s];
                                    final String read1 = hashmapWord[s + 1];

                                    HashMap<String, Integer> counter = bigramMap.get(read);
                                        if (null == counter) {
                                            counter = new HashMap<String, Integer>();
                                            bigramMap.put(read, counter);
                                        }
                                        Integer count = counter.get(read1);
                                        counter.put(read1, count == null ? 1 : count + 1);


                                }

                                //CALCULATING TRIGRAM FREQUENCIES
                                for(int s = 0; s < hashmapWord.length - 2; s++){

                                    String read = hashmapWord[s];
                                    String read1 = hashmapWord[s + 1];
                                    final String read2 = hashmapWord[s + 2];

                                    String readTrigrams = read + " " + read1;

                                    HashMap<String, Integer> counter = hashmap.get(readTrigrams);
                                        if (null == counter) {
                                            counter = new HashMap<String, Integer>();
                                            hashmap.put(readTrigrams, counter);
                                        }
                                        Integer count = counter.get(read2);
                                        counter.put(read2, count == null ? 1 : count + 1);

                                }

                        }
                            br.close();

                        }
                    } catch (NullPointerException | IOException e) {
                        e.printStackTrace();
                        System.out.println("Unable to read files: " + e);
                    }

            }
            }


            //COMPUTING THE TOTAL NUMBER OF WORDS FROM ALL THE TEXT FILES COMBINED
            System.out.println("THE TOTAL NUMBER OF WORDS IN COLLECTED CORPUS IS : \t" + wordCount + "\n"); 

                for(int i = 0, size = allWords.size(); i < size; i++){
                    String distinctWord = allWords.get(i);

                    //adding a word into the 'distinctWords' list if it doesn't already occur                
                    if(!distinctWords.contains(distinctWord)){
                        distinctWords.add(distinctWord);

                    }
                }                    


            //PRINTING THE DISTINCT WORDS
            System.out.println("THE DISTINCT WORDS IN TOTAL ARE :\t " + distinctWords.size() + "\n"); 


            System.out.println("PRINTING CONTENTS OF THE BIGRAMS HASHMAP... ");
            System.out.println(bigramMap);
            System.out.println("================================================================================================================================================================================================================================================================================================================\n");



            System.out.println("PRINTING CONTENTS OF THE TRIGRAMS HASHMAP... ");
            System.out.println(hashmap);
            System.out.println("================================================================================================================================================================================================================================================================================================================\n");


        //QUITTING APPLICATION

        String userInput = null;
        while(true) {

                System.out.println("\n**********************************************************************************************************************************************************************************************************************************");
                System.out.println("\n\n\t\tPLEASE ENTER A WORD OR PHRASE YOU WOULD LIKE A PREDICTION OF THE NEXT WORD FROM:");
                System.out.println("\t\t\t\t(OR TYPE IN  'Q' OR 'q' TO QUIT)");

                userInput = input.nextLine();                    
                    if (userInput.equalsIgnoreCase("Q")) break;

                    //FORMAT USER INPUT
                    String[] users = userInput.toLowerCase().split("[?!,.\\s]+");
                    if (users.length < 2) {
                        userInput = users[0];

                        //System.out.println("\nENTRY '" + userInput + "' IS TOO SHORT TO PREDICT NEXT WORD. PLEASE ENTER 2 OR MORE WORDS");

                        //CALCULATING BIGRAM PROBABILITY

                        int sum = 0;
                        try {
                            for(String s : bigramMap.get(userInput).keySet()) {
                                sum += bigramMap.get(userInput).get(s);
                            }


                            String stringHolder = null;
                            double numHolder = 0.0;
                            for(String s : bigramMap.get(userInput).keySet()) {
                                //System.out.println("TWO"); 
                                double x = Math.round(bigramMap.get(userInput).put(s, bigramMap.get(userInput).get(s))/ (double)sum *100 );

                                if(s != null){
                                    if(numHolder < x ){

                                        stringHolder = s;
                                        numHolder = x;

                                    } 

                                }

                            }
                            System.out.println("\nNEXT WORD PREDICTED IS '" + stringHolder + "'");
                            System.out.println("ITS PROBABILITY OF OCCURRENCE IS " + numHolder + "%"); 

                        } catch (Exception NullPointerException) {
                            System.out.println("\nSORRY. MATCH NOT FOUND.");
                        }

                    } else {
                        userInput = users[users.length - 2] + " " + users[users.length - 1];



//                        System.out.println("FROM USER WE GET....");
//                        System.out.println(bigrams.get(userInput).keySet());

                    /* CALCULATING TRIGRAM PROBABILITY*/
                        int sum = 0;
                        try {
                            for(String s : hashmap.get(userInput).keySet()) {
                                sum += hashmap.get(userInput).get(s);
                            }

                            String stringHolder = null;
                            double numHolder = 0.0;
                            for(String s : hashmap.get(userInput).keySet()) {
                                //System.out.println("TWO"); 
                                double x = Math.round(hashmap.get(userInput).put(s, hashmap.get(userInput).get(s))/ (double)sum *100 );

                                if(s != null){
                                    if(numHolder < x ){

                                        stringHolder = s;
                                        numHolder = x;

                                    } 

                                }

                            }
                            System.out.println("\nNEXT WORD PREDICTED IS '" + stringHolder + "'");
                            System.out.println("ITS PROBABILITY OF OCCURRENCE IS " + numHolder + "%"); 

                        } catch (Exception NullPointerException) {
                            System.out.println("\nSORRY. MATCH NOT FOUND.");
                        }
                    } 
            }

        input.close();
}

    }

My first Jframe which i would like to appear upon running the project has got a single textbox and a single button;

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String usersInput = jTextField1.getText(); 

    Interface1 s = new Interface1();
    s.setVisible(true);
    dispose();

}   

i would like for the user to enter data in the textbox and when they click on the button 'predict next word' then the output from the code execution is displayed on the second jframe which has got 3 labels and relative text areas.

NOTE; i couldn't paste the screenshots but if you run the NgramBetaE class you will get an idea of how the interfaces will be as i tried to explain them.

Thank you

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
eva_mo000
  • 13
  • 2

1 Answers1

2

Don't even try to link your GUI code to your NgramBetaE code as you've more work to do since the NgramBetaE is little more than one huge static main method that gets user input from the console with a Scanner and outputs to the console via printlns. Melding these two is like trying to put a square peg into a round hole.

Instead re-write the whole thing with an eye towards object-oriented coding, including creation of an OOP-compliant model class with instance fields and methods, and a single GUI that gets the input and displays it, that holds an instance of the model class and that calls instance methods on this instance.


Consider creating non-GUI classes and methods for --

  • Reading in data from your text files
  • Analyzing and hashing the data held in the text files including calculating word frequencies etc...
  • Returning needed data after analysis in whatever data form it may be needed.
  • A method for allowing input of a String/phrase for testing, with return its predicted probability

Then create GUI code for:

  • Getting selected text file from the user. A JFileChooser and supporting code works well here.
  • Button to start analysis
  • JTextField to allow entering of phrase
  • JTextArea or perhaps JTable to display results of analysis

Note that you should avoid having more than one JFrame in your GUI. For more on this, please have a look at The Use of Multiple JFrames, Good/Bad Practice?

Community
  • 1
  • 1
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373