private Integer getModuleNumber(String utterance) throws Exception{

		// Split the utterance by whitespaces create an Array List to store valid Modules that match Primary Key
		String [] UtteranceArray = utterance.split("\\s");
		ArrayList <Integer> ValidModules = new ArrayList<Integer>();

		// Check if any of the words in the utterance are valid keys. If so add the modules number to the ArrayList
		for (String word : UtteranceArray){
			if(PrimaryKeyMap.containsKey(word)){
				ValidModules.addAll(PrimaryKeyMap.get(word));
				System.out.println("Valid Primary Key = " + word);
			}
		}

		// Assume we have no valid module
		Integer ModuleNumber = -1;

		// Case 1: We found no valid primary keys. Results in returning negative one 
		if (ValidModules.size() == 0){
		}

		// Case 2: We found exactly 1 valid module, which we return
		else if (ValidModules.size() == 1) {
			ModuleNumber = ValidModules.get(0);
		}

		/* Case 3: We find more than 1 valid module
		 * We will use natural language parsing and regex matching ...
		 * 
		 * Tag the utterance for with Stanford Part of Speech Tagger
		 * For every valid module, we extract the valid RegEx
		 * For every RegEx we match it to the POS Tagged Utterance and if we find a match we return it
		 * 
		 */

		else {
			this.TaggerFuture.get();
			String taggedUtterance = Tagger.Tag(utterance);
			String longestRegEx="";
			for (Integer vm : ValidModules){
				for(String rgx : RegExKeyMap.get(vm)){
					if(taggedUtterance.matches(rgx)){
						System.out.println(taggedUtterance + " matches RE Key : " + rgx);
						if(rgx.length() > longestRegEx.length()){
							ModuleNumber = vm;	
						}
					}
				}
			}
		}

		return ModuleNumber;
	}