Esempio n. 1
0
        private ResponseBase getResponse(ParsedUtterance utterance)
        {
            var responses         = new List <ModifiableResponse>();
            var originalUtterance = utterance.OriginalSentence;

            _context.StartTurn(originalUtterance);
            var edgeInput = new EdgeInput(originalUtterance);

            do
            {
                _context.EdgeReset();

                var scores = edgeInput.GetScore(_currentState);

                Trigger trigger;
                if (scores.Any())
                {
                    var bestHypothesis     = scores.First();
                    var score              = bestHypothesis.Score;
                    var nonPatternQuestion = getBestNonPattern(scores);

                    if (score < 0.5)
                    {
                        trigger = _currentState.DefaultTrigger;
                    }
                    else if (nonPatternQuestion != null && nonPatternQuestion.Score < 0.9 && _currentState == QuestionRouting)
                    {
                        _context.SetValue(EquivalenceQuestion.QueriedQuestion, originalUtterance);
                        var substitution = substitute(nonPatternQuestion.ParsedSentence, utterance);
                        _context.SetValue(EquivalenceQuestion.PatternQuestion, substitution);
                        edgeInput = new EdgeInput(EquivalenceQuestion.EquivalenceEdge);
                        continue;
                    }
                    else if (score < 0.9)
                    {
                        trigger = _currentState.DefaultTrigger;
                    }
                    else
                    {
                        var substitution = bestHypothesis.Substitution;
                        trigger = bestHypothesis.Value;
                        _context.AddSubstitution(substitution);
                    }
                }
                else
                {
                    trigger = _currentState.DefaultTrigger;
                }

                if (trigger == null)
                {
                    throw new NullReferenceException("Cannot handle null trigger");
                }

                var response = fireTrigger(trigger);
                if (response != null)
                {
                    responses.Add(response);
                }

                edgeInput = _context.CurrentOutput;
            } while (edgeInput != null);

            var concatenation = from response in responses select response.CreateResponse().ToString();

            return(new SimpleResponse(string.Join(".", concatenation)));
        }