public static DialogExecutionResult ExecuteUserInputNode(Dialog dialog, DialogNode dialogNode, string userInputText, DialogExecutionResult result) { IEnumerable <EntityMatch> entityMatches = null; if (dialogNode is MatchIntentAndEntities) { var intent = (MatchIntentAndEntities)dialogNode; entityMatches = intent.EntityMatches; } else if (dialogNode is DisambiguationQuestion) { var question = (DisambiguationQuestion)dialogNode; if (question.EntityMatch != null) { entityMatches = new EntityMatch[] { question.EntityMatch }; } result.AddUserInput(userInputText); } else { throw new ArgumentException("Dialog node must be of type MatchIntentAndEntities or DisambiguationQuestion"); } EntityValuesMatchResult matchResult = null; if (entityMatches != null) { // Try to match entity values in the questions var entities = entityMatches.Select(entityMatch => entityMatch.Entity); matchResult = EntityValuesMatcher.MatchEntityValues(entities, userInputText, dialog.ConceptsSynonyms, dialog.ConceptsRegex); // Store the matched entity values in their assigned variables foreach (var entityValuesGroup in matchResult.EntityValues.GroupBy(ev => ev.Entity)) { var entityMatch = entityMatches.Where(em => em.Entity == entityValuesGroup.Key).First(); int matchIndex = 0; foreach (var entityValue in entityValuesGroup) { if (matchIndex == 0 && entityMatch.EntityVariableName1 != null) { result.VariablesValues[entityMatch.EntityVariableName1] = entityValue.Name; } else if (matchIndex == 1 && entityMatch.EntityVariableName2 != null) { result.VariablesValues[entityMatch.EntityVariableName2] = entityValue.Name; } matchIndex++; } } ExecuteVariableAssignments(dialogNode, result.VariablesValues); } // Store the result of this execution var nodeExecution = new MatchEntitiesNodeExecution(dialogNode, matchResult); if (result.ExecutionResult != null && result.ExecutionResult.DialogNode == dialogNode) { result.DialogNodesExecutionPath.Remove(result.ExecutionResult); } result.AddDialogNodeExecution(nodeExecution); // Traverse the children nodes SelectChildNode(dialog, result.VariablesValues, dialogNode, null, result); return(result); }
internal EntityValuesMatchResult MatchEntityValueInOptionText(DialogNode dialogNode, Entity entity, string optionText) { return(EntityValuesMatcher.MatchEntityValues(new Entity[] { entity }, optionText, ConceptsSynonyms, ConceptsRegex)); }