Esempio n. 1
0
        public async Task <KeyPhrasesResponse> GetKeyPhrases(KeyPhrasesRequest request)
        {
            string     getKeyPhrasesUrl = "https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/keyPhrases";
            HttpClient objHttpClient    =
                new HttpClient();
            string        jsonRequest   = Newtonsoft.Json.JsonConvert.SerializeObject(request);
            StringContent objStrContent = new StringContent(jsonRequest);

            objStrContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            objStrContent.Headers.Add("Ocp-Apim-Subscription-Key", AccessToken);
            var result = await objHttpClient.PostAsync(getKeyPhrasesUrl, objStrContent);

            var resultString = await result.Content.ReadAsStringAsync();

            KeyPhrasesResponse objKeyPhrasesResponse =
                Newtonsoft.Json.JsonConvert.DeserializeObject <KeyPhrasesResponse>(resultString);

            return(objKeyPhrasesResponse);
        }
        public static async Task Run([QueueTrigger("messagesqueue", Connection = "AzureWebJobsStorage")] string myQueueItem, TraceWriter log)
        {
            log.Info($"Processing: {myQueueItem}");

            //variables
            var azureWebJobsStorage        = CloudConfigurationManager.GetSetting("AzureWebJobsStorage");
            var messagesTableContainerName = CloudConfigurationManager.GetSetting("MessagesTableContainerName");
            var messagesTablePartitionKey  = CloudConfigurationManager.GetSetting("MessagesTablePartitionKey");
            var alertsTableContainerName   = CloudConfigurationManager.GetSetting("AlertsTableContainerName");
            var alertsTablePartitionKey    = CloudConfigurationManager.GetSetting("AlertsTablePartitionKey");
            var textAnalyticsApiKey        = CloudConfigurationManager.GetSetting("TextAnalyticsApiKey");
            var textAnalyticsApiUrl        = CloudConfigurationManager.GetSetting("TextAnalyticsApiUrl");
            var luisApiKey     = CloudConfigurationManager.GetSetting("LuisApiKey");
            var luisApiUrl     = CloudConfigurationManager.GetSetting("LuisApiUrl");
            var bullyingApiKey = CloudConfigurationManager.GetSetting("BullyingApiKey");
            var bullyingApiUrl = CloudConfigurationManager.GetSetting("BullyingApiUrl");
            var storageAccount = CloudStorageAccount.Parse(azureWebJobsStorage);
            var tableClient    = storageAccount.CreateCloudTableClient();

            //parse the message JSON to a dynamic object, then entity
            dynamic queueItem         = JObject.Parse(myQueueItem);
            var     chatMessageEntity = new ChatMessageEntity(messagesTablePartitionKey, Guid.NewGuid().ToString());

            chatMessageEntity.Message = queueItem.Message;
            chatMessageEntity.Time    = queueItem.Time;
            chatMessageEntity.UserId  = queueItem.UserId;
            chatMessageEntity.ChatId  = queueItem.ChatId;

            //Get Text Analytics Sentiment data and add to entity
            var sentimentData = await GetTextAnalyticsData(textAnalyticsApiUrl, textAnalyticsApiKey, queueItem.Message.ToString(), "sentiment");

            SentimentResponse sentiment = JsonConvert.DeserializeObject <SentimentResponse>(sentimentData);

            chatMessageEntity.Sentiment = sentiment.documents[0].score;
            log.Info($"Sentiment: {chatMessageEntity.Sentiment}");

            //Get Text Analytics key phrase data and add to entity
            var keyPhrasesData = await GetTextAnalyticsData(textAnalyticsApiUrl, textAnalyticsApiKey, queueItem.Message.ToString(), "keyPhrases");

            KeyPhrasesResponse keyPhrases = JsonConvert.DeserializeObject <KeyPhrasesResponse>(keyPhrasesData);

            chatMessageEntity.KeyPhrases = string.Join(",", keyPhrases.documents[0].keyPhrases);
            log.Info($"Key Phrases: {chatMessageEntity.KeyPhrases }");

            //Do LUIS entity and intent extraction here
            var luisData = await GetLUISData(luisApiUrl, luisApiKey, queueItem.Message.ToString());

            LuisResponse luis = JsonConvert.DeserializeObject <LuisResponse>(luisData);

            if (luis.topScoringIntent.intent != "None")
            {
                //create an alert
                var alertEntity = new AlertEntity(alertsTablePartitionKey, Guid.NewGuid().ToString());
                alertEntity.AlertCategory = ResolveCategory(luis.topScoringIntent.intent);
                alertEntity.AlertText     = queueItem.Message.ToString();
                alertEntity.ChatMessageId = chatMessageEntity.RowKey.ToString();
                alertEntity.StartIndex    = -1;
                alertEntity.EndIndex      = -1;
                alertEntity.ChatId        = chatMessageEntity.ChatId;

                await LogAlert(tableClient, alertsTableContainerName, alertEntity);
            }
            if (luis.entities.Count > 0)
            {
                //create an alert for each entity
                foreach (var entity in luis.entities)
                {
                    //create an alert
                    var alertEntity = new AlertEntity(alertsTablePartitionKey, Guid.NewGuid().ToString());
                    alertEntity.AlertCategory = ResolveCategory(entity.type);
                    alertEntity.AlertText     = entity.entity;
                    alertEntity.ChatMessageId = chatMessageEntity.RowKey.ToString();
                    alertEntity.StartIndex    = entity.startIndex;
                    alertEntity.EndIndex      = entity.endIndex;
                    alertEntity.ChatId        = chatMessageEntity.ChatId;

                    await LogAlert(tableClient, alertsTableContainerName, alertEntity);
                }
            }

            //bullying detection
            var bullyingData = await GetBullyingData(bullyingApiUrl, bullyingApiKey, queueItem.Message.ToString());

            // Create the TableOperation object that inserts the entity
            var messagesTable          = tableClient.GetTableReference(messagesTableContainerName);
            var messageInsertOperation = TableOperation.Insert(chatMessageEntity);

            messagesTable.Execute(messageInsertOperation);

            log.Info($"Processed: {myQueueItem}");
        }