/// <summary> /// 1. Hay que llamarle con el texto que se quiere analizar, y un filename que identifique de dónde viene el texto /// 2. Hace la llamada a LUIS para obtener sus intents y entities /// 3. Obtiene el sentimiento del texto indexado /// 4. Limpia el texto indexado de palabras inutiles /// 5. Busca los términos financieros en el texto indexado /// 6. Crea los objetos específicos para la representacion de Intents y Entities en PowerBI /// 7. Envia todos los mensajes a los event hubs (respuesta tal cual de LUIS, objeto Intents para PowerBI y Objeto Entities para PowerBI) /// </summary> /// <param name="textoBlob"></param> /// <param name="filename"></param> private void processTextAndSendResultsToServiceBus(string textoBlob, string filename) { LUISResponse luisResponse; luisResponse = makeLUISCallFromText(textoBlob); if (luisResponse != null) { luisResponse.query = textoBlob; //Volvemos a poner el texto original para evitar el escaping que devuelve LUIS del formato unicode. //Obtener el sentimiento de la consulta enviada a LUIS string sentimentQuery = luisResponse.query.Length > Properties.Settings.Default.sentimentAnalysisAPIMaxQuerySize ? luisResponse.query.Substring(0, Properties.Settings.Default.sentimentAnalysisAPIMaxQuerySize) : luisResponse.query; double sentiment = getQuerySentiment(sentimentQuery); //Limpiar la query de palabras Inutiles string cleanQuery = cleanUselessWordsFromQuery(luisResponse.query); //Obtener los terminos financieros de la query string financialKeywords = getFinancialKeywordsFromQuery(luisResponse.query); string[] financialKeywordsArray = getFinancialKeywordsFromQueryAsArray(luisResponse.query); //ToDo Separar la respuesta de LUIS en los objetos IntentsPowerBi y EntitiesPowerBi. Cuando esté hecho quitar la llamada a EnviarMensajeAServiceBus string eventGuid = new Guid().ToString(); eventGuid = Guid.NewGuid().ToString(); DateTime dt = DateTime.Now; IntentsPowerBi iPBi = getPowerBIIntentsFromLuisResponse(luisResponse, eventGuid, dt, sentiment, cleanQuery, financialKeywords); //Añadido a mano para ver si funciona... iPBi.financialKeywordsArray = financialKeywordsArray; EntitiesPowerBi ePBi = getPowerBiEntitiesFromLuisResponse(luisResponse, eventGuid, dt, sentiment, cleanQuery, financialKeywords); addResultsToTreeViewNode(filename, iPBi, ePBi); //Envio de los datos a los Service Bus para cada tipo de objeto if (_envioActivado) { EnviarMensajeAServiceBus(luisResponse); EnviarIntentsPowerBiAServiceBus(iPBi); EnviarEntitiesPowerBiAServiceBus(ePBi); } } }
/// <summary> /// A partir de un objeto LuisResponse generamos un objeto específico para los Intents del evento /// De todos los intentes, sólo se enviará el que mayor score haya tenido en el analisis de LUIS /// Si se ha configurado la opción removeNONEIntent el intent tipo "None" se filtrará de la respuesta /// </summary> /// <param name="luis">Objeto tipo LUISResponse que usaremos para rellenar los datos del objeto IntentsPowerBi</param> /// <param name="GUID">Identificador unico del evento - generado en esta aplicación - para poder correlar en PowerBi</param> /// <param name="dt">Timestamp del evento para poder correlar</param> /// <returns></returns> private IntentsPowerBi getPowerBIIntentsFromLuisResponse(LUISResponse luis, string GUID, DateTime dt, double sentiment, string cleanQuery, string financialKeywords) { IntentsPowerBi result = new IntentsPowerBi(); Intents tempIntent = new Intents(); tempIntent.intent = ""; tempIntent.score = 0; //Recorremos todos los intents de la respuesta de LUIS y nos quedamos con la que tenga mayor score //Ademas filtramos el intent "None" si se ha especificado en las settings de la aplicación foreach (Intents intent in luis.intents) { if (!(intent.intent.Equals("None", StringComparison.CurrentCultureIgnoreCase) && Properties.Settings.Default.removeNONEIntent)) { if (intent.score > tempIntent.score) { tempIntent = intent; } } } //Componemos el objeto para enviar a PowerBi result.query = luis.query; result.queryKeywords = cleanQuery; result.intent = tempIntent.intent; result.score = tempIntent.score; result.sentiment = sentiment; result.financialKeywords = financialKeywords; result.ProcessedDateTime = dt.ToString(); result.processedYear = dt.Year; result.processedMonth = dt.Month; result.processedDay = dt.Day; result.processedHour = dt.Hour; result.processedMinute = dt.Minute; result.processedSecond = dt.Second; result.eventGUID = GUID; return(result); }
private void addResultsToTreeViewNode(string filename, IntentsPowerBi iPBi, EntitiesPowerBi ePBi) { if (!InvokeRequired) { TreeNode tn = new TreeNode(filename); TreeNode entityNode = new TreeNode("Entities"); TreeNode financialNode = new TreeNode("Financial Keywords"); tn.Nodes.Add(new TreeNode("Sentiment: " + iPBi.sentiment)); tn.Nodes.Add(new TreeNode("Intent: " + iPBi.intent)); TreeNode cn; foreach (Entities entity in ePBi.entities) { cn = new TreeNode(entity.type + " - " + entity.entity + " (" + entity.score + ")"); entityNode.Nodes.Add(cn); } foreach (string kw in iPBi.financialKeywordsArray.Distinct()) { cn = new TreeNode(kw); financialNode.Nodes.Add(cn); } tn.Nodes.Add(entityNode); tn.Nodes.Add(financialNode); treeView.Nodes.Add(tn); } else { addResultsToTreeViewNodeDelegate atD = new addResultsToTreeViewNodeDelegate(addResultsToTreeViewNode); this.Invoke(atD, new object[] { filename, iPBi, ePBi }); } }