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); }
/// <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); } }