예제 #1
0
        private LUISResponse composeFragmentedLUISResponses(List <LUISResponse> responseList)
        {
            LUISResponse result = new LUISResponse();

            result.query    = "";
            result.intents  = new List <Intents>().ToArray();
            result.entities = new List <Entities>().ToArray();

            foreach (LUISResponse response in responseList)
            {
                result.query   += response.query + " ";
                result.intents  = result.intents.ToList().Concat(response.intents.ToList()).ToArray();
                result.entities = result.entities.ToList().Concat(response.entities.ToList()).ToArray();
            }

            return(result);
        }
예제 #2
0
        /// <summary>
        /// Invoca a LUIS para obtener el JSON Resultante con los intents y entities de la consulta
        /// Si el parámetro text tiene más de 500 caracteres se encarga de hacer el fragmentado y componer los resultados
        /// </summary>
        /// <param name="text">Texto plano para enviarle a LUIS</param>
        /// <returns>Objeto con el datacontract del JSON resultante de la llamada de Luis, sin duplicados en intents ni entities</returns>
        public LUISResponse makeLUISCallFromText(string text)
        {
            try {
                List <LUISResponse> LUISResultObjectList = new List <LUISResponse>();

                //Comprobar si el texto tiene más de [Settings Numero Caracteres] caracteres, en ese caso fragmentarlo en los chunks correspondientes
                //Si el texto es menor, sólo hace falta una llamada a LUIS
                //TODO: Ojo que al hacer el EscapeDataString en getLUISResults se meten muchos caracteres nuevos por el escapado de acentos, etc...
                if (text.Length <= MaxCharacters)
                {
                    //getLUISResults(text);
                    LUISResultObjectList.Add(getLUISResultsAsObject(text));
                }
                else
                {
                    //Necesitamos fragmentar el texto y recomponer los resultados
                    int fragments = (int)Math.Ceiling((decimal)text.Length / MaxCharacters);
                    int startIndex, numChars;
                    for (int fragment = 0; fragment < fragments; fragment++)
                    {
                        startIndex = fragment * MaxCharacters;

                        //Corregimos el numero de caracteres por si en el ultimo fragmento nos pasamos de la longitud del texto
                        numChars = startIndex + MaxCharacters > text.Length ? text.Length - startIndex : MaxCharacters;

                        //getLUISResults(text.Substring(startIndex, numChars));
                        LUISResultObjectList.Add(getLUISResultsAsObject(text.Substring(startIndex, numChars)));
                    }
                }

                //Componer el resultado de varias llamadas a LUIS a una consolidada y eliminar duplicados en intents y entities
                LUISResponse response       = composeFragmentedLUISResponses(LUISResultObjectList);
                Intents[]    uniqueIntents  = removeDuplicateIntentsFromArray(response.intents);
                Entities[]   uniqueEntities = removeDuplicateEntitiesFromArray(response.entities);
                response.intents  = uniqueIntents;
                response.entities = uniqueEntities;

                return(response);
            } catch (Exception ex) { Trace.TraceError("[ERROR] makeLUISCallFromText exception: " + ex.Message); return(null); }
        }