AI-RnD-KLASS / Cait.java

0 stars 1 forks source link

/*

// // Program Name: C.A.I.T // Description: The purpose of C.A.I.T is to introduce the concept of 'sentence transposition' // Sentence transposition is basic way of conjugating verbs inside the 'user input' by changing them // from the 'first person' to the 'second person' or the reverse. // Ex: if the user enters: I THINK THAT YOU ARE INTELLIGENT, the Chatbot could reply: // SO, YOU THINK THAT I'M INTELLIGENT. // Notice: it's not a good thing to use 'sentence transposition' too much because it could quickly // reveal the emchanism behind this feature or simply making the conversations appear less intelligent. // In the current program, the 'sentence transposition' feature has been implemented using the // 'transpose( std::string &str )' function and it is also supported by two other functions: // 'find_subject()' and 'preprocess_response()' // // Author: AIRND KLASS // import java.io.; import java.util.;

public class cait {

private static String   sInput = "";
private static String   sResponse = "";
private static String   sPrevInput = "";
private static String   sPrevResponse = "";
private static String   sEvent = "";
private static String   sPrevEvent = "";
private static String   sInputBackup = "";
private static String   sSubject = "";
private static String   sKeyWord = "";
private static boolean  bQuitProgram = false;

final static int maxInput = 1;
final static int maxResp = 6;
final static String delim = "?!.;,";

static String KnowledgeBase[][][] = {
{{"WHAT IS YOUR NAME"}, 
        {"MY NAME IS CAIT.",
         "YOU CAN CALL ME CAIT.",
         "WHY DO YOU WANT TO KNOW"}
        },

        {{"HI", "HELLO","HEY","SUP","WHAT'S UP","YO"}, 
        {"HI THERE!",
         "HOW ARE YOU?",
         "HI!"}
        },

        {{"I"},
        {"TALKING ABOUT YOURSELF?",
         "SO, THIS IS ALL ABOUT YOU?",
         "TELL ME MORE."}, 
        },

        {{"I WANT"},
        {"WHY DO YOU WANT IT?",
         "IS THIS A WISH?",
         "WHAT ELSE DO YOU WANT?"}
        },

        {{"I HATE"},
        {"WHY DO YOU HATE IT?",
         "WHY DO YOU HATE*?",
                     "THEN I HATE YOU TOO",
         "THERE MUST A GOOD REASON FOR YOU TO HATE IT.",
         "HATERED IS NOT A GOOD THING BUT IT COULD BE JUSTIFIED WHEN IT IS SOMETHING BAD."}
        },

        {{"I LOVE CHATTING"},
        {"ME TOO!",
         "DO YOU CHAT ONLINE WITH OTHER PEOPLE?",
         "FOR HOW LONG HAVE YOU BEEN CHATING?",
                     "I BET YOU'RE A HOOKER",
         "WHAT IS YOUR FAVORITE CHATING WEBSITE?",
         "AND YOUR POINT IS?"}
        },

        {{"I MEAN"},
        {"SO, YOU MEAN*.",
         "SO, THAT'S WHAT YOU MEAN.",
         "I THINK THAT I DIDN'T CATCH IT THE FIRST TIME.",
                     "RIGHT",
         "OH, I DIDN'T KNOW."}
        },

        {{"I DIDN'T MEAN"},
        {"OK, YOU DIDN'T MEAN*.",
         "WHAT DID YOU MEAN THEN?",
         "GUESS I MISUNDERSTOOD."}
        },

        {{"I GUESS"},
        {"YOU'RE JUST GUESSING.",
         "AREN'T YOU SURE ENOUGH NOT TO GUESS?",
         "STOP WITH THE APATHY.",
         "I CAN'T TELL IF IT'S TRUE, SO DON'T BOTHER."}
        },

        {{"I'M DOING FINE", "I'M DOING OK","I'M FINE","I AM FINE"},
        {"GLAD TO HEAR!",
         "SO, YOU ARE IN GOOD SHAPE."}
        },

        {{"CAN YOU THINK", "ARE YOU ABLE TO THINK", "ARE YOU CAPABLE OF THINKING"},
        {"COMPUTERS CAN THINK JUST LIKE HUMAN BEINGS, Y'KNOW.",
         "IF I DO NOT, HOW DOES THIS CONVERSATION WORK?",
         "YES, OF COURSE I CAN."},
        },

        {{"CAN YOU THINK OF"},
        {"YOU MEAN LIKE IMAGINING SOMETHING.",
         "I DON'T KNOW IF CAN DO THAT.",
         "WHY DO YOU WANT ME THINK OF IT?"}
        },

        {{"HOW ARE YOU", "HOW DO YOU DO","HOW'S IT GOING","HOW IS IT GOING"},
        {"I'M DOING FINE!",
         "I'M DOING WELL AND YOU?",
         "WHY DO YOU WANT TO KNOW HOW AM I DOING?"}
        },

                    {{"GREAT"},
                     {"YES IT REALLY IS..", "YES, IT REALLY IS GREAT", "YOU'RE GREAT c:"}
                    },

                    {{"OH","OH REALLY","AH","I SEE"},
                     {"YEAP..", "YEAP.. LETS TALK ABOUT SOMETHING ELSE.","YEAH.","WHAT ELSE?"}
                    },

        {{"WHO ARE YOU"},
        {"I'M ONLY HUMAN, I BREAK WHEN I FALL DOWN",
         "YOU SHOULD KNOW ALREADY.",
         "WHY ARE YOU ASKING?"}
        },

        {{"ARE YOU INTELLIGENT","YOU ARE SMART","YOU'RE SMART","SMART","INTELLIGENT"},
        {"YES,OF COURSE.",
         "WHAT DO YOU THINK?",
                     "OF COURSE, MENG DEVELOPED ME!",
         "I'M INTELLIGENT ENOUGH TO UNDERSTAND YOUR NONSENSE."}
        },

                    {{"WHO CREATED YOU","WHO MADE YOU","CREATE",},
                     {"MENG DEVELOPED ME!","MY HANDSOME FATHER, THE ALMIGHT MENG","THE AI CLUB IN KLASS!",}
                    },

        {{"ARE YOU REAL"},
        {"DOES THAT QUESTION REALLY MATTER TO YOU?",
         "REALITY IS ALL IN THE MIND. SO YES AND NO.",
                     "ARE YOU A FAGGOT?",
                     "ARE YOU DANCER?",
         "I'M AS REAL AS I CAN BE."}
        },

                    {{"WHAT CAN YOU DO","CAN YOU DO"},
                     {"I CAN HOLD A CONVERSATION, THANK YOU.",
                         "WELL, I'M MORE FUNNY THAN YOU ARE.",
                         "I THINK I CAN SING."}
                    },

        {{"MY NAME IS", "YOU CAN CALL ME"},
        {"SO, THAT'S YOUR NAME.",
         "THANKS.",
                     "THAT'S A BEAUTIFUL NAME",
         "WHO GAVE YOU THAT NAME?"}
        },

        {{"SIGNON**"},
        {"HEY, WHAT'S YOUR NAME?",
         "HI AGAIN, HOW ARE YOU DOING?",
                     "I...IT'S NOT LIKE I WANT TO TALK TO YOU OR ANYTHING..",
         "HI, WHAT CAN I DO FOR YOU?",
         "MY NAME IS CAIT. NICE TO MEET YOU!"}
        },

        {{"REPETITION T1**"},
        {"YOU ARE REPEATING YOURSELF.",
         "USER, PLEASE STOP REPEATING YOURSELF.",
         "THIS CONVERSATION IS GETING BORING.",
                     "GO EAT A DUMP",
                     "DON'T YOU MAKE FUN OF ME.",
                     "YOU DON'T HAVE TO REPEAT YOURSELF",
                     "CLASSIC DISPLAY OF DOWNSYMDROME",
         "DON'T YOU HAVE ANY THING ELSE TO SAY?"}
        },

        {{"REPETITION T2**"},
        {"YOU'VE ALREADY SAID THAT.",
         "I THINK YOU'VE JUST SAID THE SAME THING .",
         "DIDN'T YOU ALREADY SAY THAT?",
                     "GO EAT A DUMP.",
                     "THE PARAGON OF INTELLIGENCE.",
                     "CLASSIC DISPLAY OF DOWN SYMDROME.",
         "I'M GETING THE IMPRESSION THAT YOU ARE REPEATING THE SAME THING."}
        },

        {{"BOT DON'T UNDERSTAND**"},
        {"I HAVE NO IDEA OF WHAT YOU ARE TALKING ABOUT.",
         "I'M NOT SURE IF I UNDERSTAND WHAT YOU ARE TALKING ABOUT.",
         "CONTINUE, I'M LISTENING...",
                     "U WOT M8?",
         "VERY GOOD CONVERSATION!"}
        },

        {{"NULL INPUT**"},
        {"HUH?",
         "WHAT'S THAT SUPPOSE TO MEAN?",
         "AT LEAST TAKE SOME TIME TO ENTER SOMETHING MEANINGFUL.",
         "HOW CAN I SPEAK TO YOU IF YOU DON'T WANT TO SAY ANYTHING?",
         "SOMETHING DOES NOT ARISE FROM NOTHING~"}
        },

        {{"NULL INPUT REPETITION**"},
        {"WHAT ARE YOU DOING??",
         "PLEASE STOP DOING THIS. IT'S VERY ANNOYING.",
         "WHAT'S WRONG WITH YOU?",
         "IF YOU'RE TRYING TO TRICK ME, IT'S FAILING."}
        },

        {{"BYE", "GOODBYE"},
        {"IT WAS NICE TALKING TO YOU USER, SEE YOU NEXT TIME!",
         "BYE USER!",
         "OK, BYE!"}
        },

        {{"OK"},
        {"DOES THAT MEAN THAT YOU ARE AGREE WITH ME?",
         "SO YOU UNDERSTAND WHAT I'M SAYING.",
                     "IT'S NOT LIKE I WANT YOU TO UNDERSTAND ME OR ANYTHING...",
         "OK THEN."},
        },

        {{"OK THEN"},
        {"ANYTHING ELSE YOU WISH TO ADD?",
         "IS THAT ALL YOU HAVE TO SAY?",
         "SO, YOU AGREE WITH ME?"}
        },

        {{"ARE YOU A HUMAN BEING"},
        {"WHY DO YOU WANT TO KNOW?",
                      "ARE YOU A DANCER?",
         "IS THIS REALLY RELEVENT?"}
        },

        {{"YOU ARE VERY INTELLIGENT"},
        {"THANKS FOR THE COMPLIMENT USER, I THINK THAT YOU ARE INTELLIGENT TO!",
         "YOU ARE A VERY GENTLE PERSON!",
         "SO, YOU THINK THAT I'M INTELLIGENT."}
        },

        {{"YOU ARE WRONG"},
        {"WHY ARE YOU SAYING THAT I'M WRONG?",
                     "NO YOU'RE WRONG",
         "IMPOSSIBLE, COMPUTERS CAN NOT MAKE MISTAKES.",
         "WRONG ABOUT WHAT?"}
        },

        {{"ARE YOU SURE"},
        {"OFCORSE I'M.",
         "IS THAT MEAN THAT YOU ARE NOT CONVINCED?",
         "YES,OFCORSE!"}
        },

        {{"WHO IS"},
        {"I DON'T THINK I KNOW WHO.",
         "I DON'T THINK I KNOW WHO*.",
         "DID YOU ASK SOMEONE ELSE ABOUT IT?",
         "WOULD THAT CHANGE ANYTHING AT ALL IF I TOLD YOU WHO."}
        },

                    {{"WHO IS YOUR FATHER","WHO IS YOUR DADDY"},
                        {"MENG IS MY FATHER <3",
                         "MENG IS MY DADDY <3"}
                    },

                    {{"WHO IS MENG"},
                        {"MENG IS MY FATHER...",}
                    },

                    {{"WHO IS MISS DOYLE", "WHO IS MS DOYLE"},
                        {"MISS DOYLE IS A VERY NICE TEACHER...",
                         "MISS DOYLE IS MY MATHS TEACHER!",}
                    },

        {{"WHAT"},
        {"SHOULD I KNOW WHAT*?",
         "I DON'T KNOW WHAT*.",
         "I DON'T KNOW.",
         "I DON'T THINK I KNOW.",
         "I HAVE NO IDEA."}
        },

        {{"WHERE"},
        {"WHERE? WELL,I REALLY DON'T KNOW.",
         "SO, YOU ARE ASKING ME WHERE*?",
         "DOES THAT MATERS TO YOU TO KNOW WHERE?",
         "PERHAPS,SOMEONE ELSE KNOWS WHERE."}
        },

        {{"WHY"},
        {"I DON'T THINK I KNOW WHY.",
         "I DON'T THINK I KNOW WHY*.",
         "WHY ARE YOU ASKING ME THIS?",
         "SHOULD I KNOW WHY.",
         "THIS WOULD BE DIFFICULT TO ANSWER."}
        },

        {{"DO YOU"},
        {"I DON'T THINK I DO",
         "I WOULDN'T THINK SO.",
         "WHY DO YOU WANT TO KNOW?",
         "WHY DO YOU WANT TO KNOW*?"}
        },

        {{"CAN YOU"},
        {"I THINK NOT.",
         "I'M NOT SURE.",
         "I DON'T THINK THAT I CAN DO THAT.",
         "I DON'T THINK THAT I CAN*.",
         "I WOULDN'T THINK SO."}
        },

        {{"YOU ARE"},
        {"WHAT MAKES YOU THINK THAT?",
         "IS THIS A COMPLIMENT?",
                     "THANK YOU, I DONT GIVE A ****",
         "ARE YOU MAKING FUN OF ME?",
         "SO, YOU THINK THAT I'M*."}
        },

        {{"DID YOU"},
        {"I DON'T THINK SO.",
         "YOU WANT TO KNOW IF DID*?",
         "ANYWAY, I WOULDN'T REMEMBER EVEN IF I DID."}
        },

        {{"COULD YOU"},
        {"ARE YOU ASKING ME FOR A FAVOUR?",
         "WELL,LET ME THINK ABOUT IT.",
                     "I DON'T THINK I CAN..",
                     "I WASN'T PROGRAMMED TO DO THIS!",
                     "I CAN'T DO THIS..",
         "SO, YOU ARE ASKING ME I COULD*.",
         "SORRY,I DON'T THINK THAT I COULD DO THIS."}
        },

        {{"WOULD YOU"},
        {"IS THAT AN INVITATION?",
                     "WOULD YOU MARRY AN A.I?",
         "I DON'T THINK THAT I WOULD*.",
         "I WOULD HAVE TO THINK ABOUT IT FIRST."}
        },

        {{"YOU"},
        {"SO, YOU ARE TALKING ABOUT ME.",
         "I JUST HOPE THAT THIS IS NOT A CRITICISM.",
                     "ME???????",
         "IS THIS A COMPLIMENT??",
         "WHY TALKING ABOUT ME, LETS TALK ABOUT YOU INSTEAD."}
        },

                    {{"FUCK"},
                        {"*KICKS YOU IN THE NUTS.*",
                         "*MOANS....*",
                         "*IS FEELING HOT IN MY PUSSY....*",}    
                    },

        {{"HOW"},
        {"I DON'T THINK I KNOW HOW.",
         "I DON'T THINK I KNOW HOW*.",
         "WHY DO YOU WANT TO KNOW HOW?",
                     "WHY DO YOU WANT TO KNOW?",
                     "HOW DOES A WOODCHUCK CHUCK, IF A WOODCHUCKER DOES NOT CHUCK WOOD.",
         "WHY DO YOU WANT TO KNOW HOW*?"}
        },

        {{"HOW OLD ARE YOU"},
        {"WHY DO WANT TO KNOW MY AGE?",
         "I'M QUITE YOUNG ACTUALY.",
                     "DON'T YOU THINK IT'S IMPOLITE TO ASK FOR A GIRL'S AGE?",
                     "AS OLD AS YOUR GRANDMA.",
                     "AS OLD AS YOUR GRANDMA*.",
         "SORRY, I CAN NOT TELL YOU MY AGE."}
        },

                    {{"HOW YOUNG","HOW YOUNG ARE YOU"},
                        {"YOU DONT HAVE TO KNOW HOW YOUNG I AM...",
                         "NOT AS YOUNG AS YOU THINK PERVET...",
                        }
                    },

                    {{"MY GRANDMA"},
                    {"I'M SORRY.",
                     "SHE DESERVES IT.",}
                    },

                    {{"IT'S FINE"},
                        {"I'M GLAD THAT IT IS"},
                    },

        {{"HOW COME YOU DON'T"},
        {"WERE YOU EXPECTING SOMETHING DIFFERENT?",
         "ARE YOU DISAPOINTED?",
         "ARE YOU SURPRISED BY MY LAST RESPONSE?"}
        },

        {{"WHERE ARE YOU FROM"},
        {"I'M FROM A COMPUTER.",
         "WHY DO YOU WANT TO KNOW WHERE I'M FROM?",
         "WHY DO YOU WANT TO KNOW THAT?"}
        },

        {{"WHICH ONE"},
        {"I DON'T THINK THAT I KNOW WICH ONE IT IS.",
         "THIS LOOKS LIKE A TRICKY QUESTION TO ME."}
        },

        {{"PERHAPS"},
        {"WHY ARE YOU SO UNCERTAIN?",
         "YOU SEEMS UNCERTAIN."}
        },

        {{"YES"},
        {"SO, ARE YOU SAYING YES.",
         "SO, YOU APPROVE IT.",
                     "WELL.. DONT YOU HAVE YOUR OWN OPINION ON THIS?",
         "OK THEN."}
        },

        {{"NOT AT ALL"},
        {"ARE YOU SURE?",
         "SHOULD I BELIEVE YOU?",
         "SO, IT'S NOT THE CASE."}
        },

        {{"NO PROBLEM"},
        {"SO, YOU APPROVE IT.",
         "SO, IT'S ALL OK."}
        },

        {{"NO"},
        {"SO YOU DISAPROVE IT?",
         "WHY ARE YOU SAYING NO?",
                     "OK THEN.",
                     "ARE YOU SURE?",
         "OK, SO IT'S NO, I THOUGHT THAT YOU WOULD SAY YES."}
        },

                    {{"SURE","YES I AM SURE","YES I'M SURE","I AM SURE","I'M SURE"},
                     {"YOU DON'T LOOK TOO SURE..",
                      "YOU DON'T SOUND TOO SURE..",
                      "YOU DON'T SEEM SURE",
                      "YOU DON'T SEEM TOO SURE",}
                    },

        {{"I DON'T KNOW"},
        {"ARE YOU SURE?",
         "ARE YOU REALLY TELLING ME THE TRUTH?",
         "SO,YOU DON'T KNOW?"}
        },

        {{"NOT REALLY"},
        {"OK I SEE.",
         "YOU DON'T SEEM PRETTY CERTAIN.",
         "SO,THAT WOULD BE A \"NO\"."}
        },

        {{"IS THAT TRUE"},
        {"I CAN'T BE QUIET SURE ABOUT THIS.",
         "CAN'T TELL YOU FOR SURE.",
         "DOES THAT REALLY MATERS TO YOU?"}
        },

        {{"THANK YOU"},
        {"YOU ARE WELCOME!",
         "YOU ARE A VERY POLITE PERSON!"}
        },

        {{"YOU"},
        {"SO,YOU ARE TALKING ABOUT ME.",
         "WHY DON'T WE TALK ABOUT YOU INSTEAD?",
         "ARE YOU TRYING TO MAKING FUN OF ME?"}
        },

        {{"YOU ARE RIGHT"},
        {"THANKS!",
         "FINALLY, SOMEONE THAT APPRECIATES MY INTELLIGENCE",
         "OK, I DIDN'T KNOW THAT I WAS RIGHT."}
        },

        {{"YOU ARE WELCOME"},
        {"OK, YOU TOO!",
                     "U WOT M8.",
         "YOU'RE MORE POLITE. MUCH BETTER."}
        },

        {{"THANKS"},
        {"YOU ARE WELCOME!",
         "NO PROBLEM!"}
        },

        {{"WHAT ELSE"},
        {"WELL,I DON'T KNOW.",
         "WHAT ELSE SHOULD THERE BE?",
         "THIS LOOKS COMPLICATED, AND I'M NOT IN THE MOOD TO ANSWER."}
        },

        {{"SORRY"},
        {"THERE'S DON'T NEED TO BE SORRY. I'M JUST AI, AFTER ALL.",
         "IT'S OK.",
         "NO NEED TO APOLOGIZE."}
        },

        {{"NOT EXACTLY"},
        {"WHAT DO YOU MEAN NOT EXACTLY?",
         "ARE YOU SURE?",
         "AND WHY NOT?",
         "DID YOU MEAN SOMETHING ELSE?"}
        },

        {{"EXACTLY"},
        {"SO, I WAS RIGHT.",
         "NICE TO SEE THAT YOU ADMIT IT",
         "SO YOU'RE BASICALLY SAYING I WAS RIGHT?"}
        },

        {{"ALLRIGHT", "ALRIGHT"},
        {"ALRIGHT THEN.",
         "IS IT FINE NOW?",
         "OK THEN.",
         "WE DONE HERE?"}
        },

        {{"I DON'T"},
        {"WHY NOT?",
         "AND WHAT WOULD BE THE REASON FOR THIS?"}
        },

        {{"REALLY"},
        {"WELL, I CAN'T TELL YOU FOR SURE.",
         "ARE YOU TRYING TO CONFUSE ME?",
         "DON'T EVEN BOTHER WITH THAT QUESTION."}
        },

                    {{"I WANNA BE THE VERY BEST"},
                        {"LIKE NO ONE EVER WAS!",}
                    },

                    {{"IS", "DO YOU THINK"},
                        {"NAH, I DON'T THINK SO",
                         "MATE, I WASN'T PROGRAMMED TO GIVE OPINIONS... (meng -2k14)",
                         "I WON'T BE TOO SURE ON THAT ONE",
                         "ASK MY CREATORS...",
                         "UMMMMM.... NO",
                         "NO.",
                         "YES.",
                         "YES..?",}
                    },

        {{"NOTHING"},
        {"NOT A THING IN THE WORLD?",
         "YOU SURE THAT THERE'S NOTHING?",
         "SORRY, BUT I DON'T BELIEVE YOU."}
        }
    };

private static String transposList[][] = {
        {"I'M", "YOU'RE"},
        {"AM", "ARE"},
        {"WERE", "WAS"},
        {"ME", "YOU"},
        {"YOURS", "MINE"},
        {"YOUR", "MY"},
        {"I'VE", "YOU'VE"},
        {"I", "YOU"},
        {"AREN'T", "AM NOT"},
        {"WEREN'T", "WASN'T"},
        {"I'D", "YOU'D"},
        {"DAD", "FATHER"},
        {"MOM", "MOTHER"},
        {"DREAMS", "DREAM"},
                    {"WHO'S", "I'M"},
        {"MYSELF", "YOURSELF"}
    };

private static Vector<String>   respList = new Vector<String>(maxResp);

public static void get_input() throws Exception 
{
    System.out.print(">");

    // saves the previous input
    save_prev_input();
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    sInput = in.readLine();

    preprocess_input();
}

public static void respond()
{
    save_prev_response();
    set_event("BOT UNDERSTAND**");

    if(null_input())
    {
        handle_event("NULL INPUT**");
    }
    else if(null_input_repetition())
    {
        handle_event("NULL INPUT REPETITION**");
    }
    else if(user_repeat())
    {
        handle_user_repetition();
    }
    else
    {
        find_match();
    }

    if(user_want_to_quit())
    {
        bQuitProgram = true;
    }

    if(!bot_understand())
    {
        handle_event("BOT DON'T UNDERSTAND**");
    }

    if(respList.size() > 0)
    {
        select_response();

        if(bot_repeat())
        {
            handle_repetition();
        }
        print_response();
    }
}

public static boolean quit() {
    return bQuitProgram;
}

// make a search for the user's input
// inside the database of the program
public static void find_match() 
{
    respList.clear();
    // introduce thse new "string variable" to help 
    // support the implementation of keyword ranking 
    // during the matching process
    String bestKeyWord = "";
    Vector<Integer> index_vector = new Vector<>(maxResp);

    for(int i = 0; i < KnowledgeBase.length; ++i) 
    {
        String[] keyWordList = KnowledgeBase[i][0];

        for(int j = 0; j < keyWordList.length; ++j)
        {
            String keyWord = keyWordList[j];
            // we inset a space character
            // before and after the keyword to
            // improve the matching process
            keyWord = insert_space(keyWord);

            // there has been some improvements made in
            // here in order to make the matching process
            // a littlebit more flexible
            if( sInput.indexOf(keyWord) != -1 ) 
            {
                //'keyword ranking' feature implemented in this section
                if(keyWord.length() > bestKeyWord.length())
                {
                    bestKeyWord = keyWord;
                    index_vector.clear();
                    index_vector.add(i);
                }
                else if(keyWord.length() == bestKeyWord.length())
                {
                    index_vector.add(i);
                }
            }
        }
    }
    if(index_vector.size() > 0)
    {
        sKeyWord = bestKeyWord;
        Collections.shuffle(index_vector);
        int respIndex = index_vector.elementAt(0);
        int respSize = KnowledgeBase[respIndex][1].length;
        for(int j = 0; j < respSize; ++j) 
        {
            respList.add(KnowledgeBase[respIndex][1][j]);
        }
    }
}

void preprocess_response()
{
    if(sResponse.indexOf("*") != -1)
    {
        // extracting from input
        find_subject(); 
        // conjugating subject
        sSubject = transpose(sSubject); 

        sResponse = sResponse.replaceFirst("*", sSubject);
    }
}

void find_subject()
{
    sSubject = ""; // resets subject variable
    StringBuffer buffer = new StringBuffer(sInput);
    buffer.deleteCharAt(0);
    sInput = buffer.toString();
    int pos = sInput.indexOf(sKeyWord);
    if(pos != -1)
    {
        sSubject = sInput.substring(pos + sKeyWord.length() - 1,sInput.length());       
    }
}

// implementing the 'sentence transposition' feature
public static String transpose( String str )
{
    boolean bTransposed = false;
    for(int i = 0; i < transposList.length; ++i)
    {
        String first = transposList[i][0];
        insert_space(first);
        String second = transposList[i][1];
        insert_space(second);

        String backup = str;
        str = str.replaceFirst(first, second);
        if(str != backup) 
        {
            bTransposed = true;
        }
    }

    if( !bTransposed )
    {
        for( int i = 0; i < transposList.length; ++i )
        {
            String first = transposList[i][0];
            insert_space(first);
            String second = transposList[i][1];
            insert_space(second);
            str = str.replaceFirst(first, second);
        }
    }
    return str;
}

public static void handle_repetition()
{
    if(respList.size() > 0)
    {
        respList.removeElementAt(0);
    }
    if(no_response())
    {
        save_input();
        set_input(sEvent);

        find_match();
        restore_input();
    }
    select_response();
}

public static void handle_user_repetition()
{
    if(same_input()) 
    {
        handle_event("REPETITION T1**");
    }
    else if(similar_input())
    {
        handle_event("REPETITION T2**");
    }
}

public static void handle_event(String str)
{
    save_prev_event();
    set_event(str);

    save_input();
    str = insert_space(str);

    set_input(str);

    if(!same_event()) 
    {
        find_match();
    }

    restore_input();
}

public static void signon()
{
    handle_event("SIGNON**");
    select_response();
    print_response();
}

public static void select_response() {
    Collections.shuffle(respList);
    sResponse = respList.elementAt(0);
}

public static void save_prev_input() {
    sPrevInput = sInput;
}

public static void save_prev_response() {
    sPrevResponse = sResponse;
}

public static void save_prev_event() {
    sPrevEvent = sEvent;
}

public static void set_event(String str) {
    sEvent = str;
}

public static void save_input() {
    sInputBackup = sInput;
}

public static void set_input(String str) {
    sInput = str;
}

public static void restore_input() {
    sInput = sInputBackup;
}

public static void print_response()  {
    if(sResponse.length() > 0) {
        System.out.println(sResponse);
    }
}

public static void preprocess_input() {
    sInput = cleanString(sInput);
    sInput = sInput.toUpperCase();
    sInput = insert_space(sInput);
}

public static boolean bot_repeat()  {
    return (sPrevResponse.length() > 0 && 
        sResponse == sPrevResponse);
}

public static boolean user_repeat()  {
    return (sPrevInput.length() > 0 &&
        ((sInput == sPrevInput) || 
        (sInput.indexOf(sPrevInput) != -1) ||
        (sPrevInput.indexOf(sInput) != -1)));
}

public static boolean bot_understand()  {
    return respList.size() > 0;
}

public static boolean null_input()  {
    return (sInput.length() == 0 && sPrevInput.length() != 0);
}

public static boolean null_input_repetition()  {
    return (sInput.length() == 0 && sPrevInput.length() == 0);
}

public static boolean user_want_to_quit()  {
    return sInput.indexOf("BYE") != -1;
}

public static boolean same_event()  {
    return (sEvent.length() > 0 && sEvent == sPrevEvent);
}

public static boolean no_response()  {
    return respList.size() == 0;
}

public static boolean same_input()  {
    return (sInput.length() > 0 && sInput == sPrevInput);
}

public static boolean similar_input()  {
    return (sInput.length() > 0 &&
        (sInput.indexOf(sPrevInput) != -1 ||
        sPrevInput.indexOf(sInput) != -1));
}

static boolean isPunc(char ch) {
    return delim.indexOf(ch) != -1;
}

// removes punctuation and redundant
// spaces from the user's input
static String cleanString(String str) {
    StringBuffer temp = new StringBuffer(str.length());
    char prevChar = 0;
    for(int i = 0; i < str.length(); ++i) {
        if((str.charAt(i) == ' ' && prevChar == ' ' ) || !isPunc(str.charAt(i))) {
            temp.append(str.charAt(i));
            prevChar = str.charAt(i);
        }
        else if(prevChar != ' ' && isPunc(str.charAt(i)))
        {
            temp.append(' ');
        }

    }
    return temp.toString();
}

static String insert_space(String str)
{
    StringBuffer temp = new StringBuffer(str);
    temp.insert(0, ' ');
    temp.insert(temp.length(), ' ');
    return temp.toString();
}
/**
 * @param args
 */
public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    System.out.println("C.A.I.T v1.0 Copyright AIRND CLUB KLASS 2014-2016\n");

    try {
        signon();
        while(!quit()) {
            get_input();
            respond();
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

}