public DialogActBase GetBestDialogAct(ParsedUtterance utterance) { if (HasImplicitDontKnow(utterance)) { return(new DontKnowAct()); } if (HasImplicitNegation(utterance)) { return(new NegateAct()); } var currentStateLayer = new List <PatternState>(); foreach (var pattern in _patterns.Keys) { var state = pattern.InitialState(0); currentStateLayer.Add(state); } var nextStateLayer = new List <PatternState>(); var wordIndex = 0; foreach (var word in utterance.Words) { foreach (var state in currentStateLayer) { var nextStates = state.GetNextStates(word, wordIndex); nextStateLayer.AddRange(nextStates); } wordIndex += 1; //swap current with next state layer var swapLayer = currentStateLayer; currentStateLayer = nextStateLayer; nextStateLayer = swapLayer; nextStateLayer.Clear(); if (currentStateLayer.Count == 0) { //we dont have any matching pattern break; } } currentStateLayer.RemoveAll((p) => !p.IsFinished); if (currentStateLayer.Count < 1) { return(new UnrecognizedAct(utterance)); } var bestState = currentStateLayer[0]; var actFactory = _patterns[bestState.OriginalPattern]; var handler = new PatternHandler(utterance, bestState); return(actFactory(handler)); }
internal PatternHandler(ParsedUtterance utterance, PatternState state) { var substitutions = state.Substitutions.ToArray(); var originalPattern = state.OriginalPattern; for (var i = 0; i < originalPattern.Length; ++i) { var sentenceKey = originalPattern.GetSentenceKey(i); if (sentenceKey != null) { var sentence = ParsedUtterance.From(substitutions[i]); _sentences[int.Parse(sentenceKey)] = sentence; } } _sentences[0] = utterance; }
public IEnumerable <DialogActBase> GetDialogActs(ParsedUtterance utterance) { var currentStateLayer = new List <PatternState>(); var finishedStates = new List <PatternState>(); var currentWordIndex = 0; foreach (var word in utterance.Words) { //we allow pattern begin at every word foreach (var pattern in _patterns.Keys) { var state = pattern.InitialState(currentWordIndex); currentStateLayer.Add(state); } var nextStateLayer = new List <PatternState>(); foreach (var state in currentStateLayer) { var nextStates = state.GetNextStates(word, currentWordIndex); foreach (var nextState in nextStates) { if (nextState.IsFinished) { //state has been finished - don't continue expanding from it finishedStates.Add(nextState); } else { //state still needs continuation nextStateLayer.Add(nextState); } } } currentStateLayer = nextStateLayer; currentWordIndex += 1; } var stateCovers = findStateCovers(currentWordIndex - 1, finishedStates).ToArray(); throw new NotImplementedException(); }
public static bool HasImplicitDontKnow(ParsedUtterance utterance) { return(HasImplicitDontKnow(utterance.OriginalSentence)); }
public static bool HasImplicitNegation(ParsedUtterance utterance) { return(HasImplicitNegation(utterance.OriginalSentence)); }