public async Task AnalyseAsync()
        {
            _logger.WriteLine("In AnalyseAsync");

            var mails = await _repository.GetMailCollectedToBeAnalysedAsync();

            _logger.WriteLine($"Collected #{mails?.Count()} mail messages");

            if (mails != null && mails.Count() > 0)
            {
                foreach (var mailMsg in mails)
                {
                    _logger.WriteLine($"Processing mail: [{mailMsg.From}]");

                    var result = await TextAnalyticConfigurationSettings.CreateUsingConfigurationKeys(_config.TextanalyticApiKey, LocationKeyIdentifier.WestUs)
                                 .AddConsoleDiagnosticLogging()
                                 .UsingHttpCommunication()
                                 .WithTextAnalyticAnalysisActions()
                                 .AddSentimentAnalysis(mailMsg.Body)
                                 .AddKeyPhraseAnalysis(mailMsg.Body)
                                 .AnalyseAllSentimentsAsync();

                    await UpdateMailMessage(mailMsg, result);
                }
            }
        }
Пример #2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Sentiment Analysis CLI tool.");
            Console.WriteLine("API Location: {0}", Config.ConfigReader.ApiLocation);
            Console.WriteLine("API Key: {0}", string.IsNullOrWhiteSpace(Config.ConfigReader.ApiKey) ? "Not set!" : "Set");

            var cliArguments = new CliArguments(args);

            if (cliArguments.ArgumentType == ArgType.Invalid)
            {
                Console.WriteLine("Options: \n\t-k: Include Keyphrase Analysis\n\t-f {filename.ext} : Process contents of file.\n\t-t \"Text to analyse\" : Process text as entered.");
                Console.WriteLine("\nFormat: \n\tSentimentAnalysisConsoleTestTool -f {filename.txt}");
                Console.WriteLine("\tSentimentAnalysisConsoleTestTool -t \"Text to analyse\"");
                Console.WriteLine("\tSentimentAnalysisConsoleTestTool -f {filename.txt} -k\n");

                return;
            }

            if (string.IsNullOrWhiteSpace(Config.ConfigReader.ApiKey) || string.IsNullOrWhiteSpace(Config.ConfigReader.ApiLocation))
            {
                Console.WriteLine("No API location or key is present. Cannot continue.");
                return;
            }


            string textToAnalyse = GetAnalysisInput(cliArguments);

            if (textToAnalyse == null)
            {
                return;
            }

            var location = (LocationKeyIdentifier)System.Enum.Parse(typeof(LocationKeyIdentifier), Config.ConfigReader.ApiLocation, true);

            try
            {
                Console.WriteLine("Sentiment Analysis: Submitting {0} characters of text for analysis.", textToAnalyse.Length);
                if (cliArguments.Options == ArgOptions.IncludeKeyphraseAnalysis)
                {
                    Console.WriteLine("Including Keyphrase analysis");
                }
                var analysis = TextAnalyticConfigurationSettings.CreateUsingConfigurationKeys(Config.ConfigReader.ApiKey, location)
                               .AddConsoleDiagnosticLogging()
                               .UsingHttpCommunication()
                               .WithTextAnalyticAnalysisActions()
                               .AddSentimentAnalysisSplitIntoSentences(textToAnalyse);
                if (cliArguments.Options == ArgOptions.IncludeKeyphraseAnalysis)
                {
                    analysis = analysis.AddKeyPhraseAnalysis(textToAnalyse);
                }
                var result = analysis.AnalyseAllAsync().Result;

                ProcessResults(result);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error calling the Cognitive service. [{0}]", ex.Message);
            }
        }
Пример #3
0
        private async Task AnalyseAllMail(List <AnalysedMailMessageEntity> mailToAnalyse)
        {
            if (mailToAnalyse == null || mailToAnalyse.Count == 0)
            {
                _coreDependencies.DiagnosticLogging.Verbose("ProcessMail: No mail to analyse");
                return;
            }

            var apiKey   = _config.ApiKey;
            var location = _config.ApiLocation;

            foreach (var m in mailToAnalyse)
            {
                var result = await TextAnalyticConfigurationSettings.CreateUsingConfigurationKeys(apiKey, location)
                             .AddCustomDiagnosticLogging(new SentimentAnalysisLoggingAdapter(_coreDependencies))
                             .UsingHttpCommunication()
                             .WithTextAnalyticAnalysisActions()
                             .AddSentimentAnalysisSplitIntoSentences(m.SanitisedBody)
                             .AddKeyPhraseAnalysisSplitIntoSentences(m.SanitisedBody)
                             .AnalyseAllAsync();

                if (!result.SentimentAnalysis.AnalysisResult.ActionSubmittedSuccessfully)
                {
                    var message = result.SentimentAnalysis.AnalysisResult.ResponseData.errors != null?result.SentimentAnalysis.AnalysisResult.ResponseData.errors.First().message : result.SentimentAnalysis.AnalysisResult.ApiCallResult.Data;

                    _coreDependencies.DiagnosticLogging.Error("ProcessMail: Error processing SentimentAnalysis results: [{message}]", message);
                }
                else
                {
                    m.SentimentClassification = result.SentimentAnalysis.GetResults().Average(s => s.score);
                }
                if (!result.KeyPhraseAnalysis.AnalysisResult.ActionSubmittedSuccessfully)
                {
                    var message = result.KeyPhraseAnalysis.AnalysisResult.ResponseData.errors != null?result.KeyPhraseAnalysis.AnalysisResult.ResponseData.errors.First().message : result.KeyPhraseAnalysis.AnalysisResult.ApiCallResult.Data;

                    _coreDependencies.DiagnosticLogging.Error("ProcessMail: Error processing KeyphraseAnalysis results: [{message}]", message);
                }
                else
                {
                    m.SentimentKeyPhrases = string.Join(",", result.KeyPhraseAnalysis.AnalysisResult.ResponseData?.documents?.Select(s => string.Join(",", s.keyPhrases)));
                }

                m.AnalysedTimestampUtc = DateTime.UtcNow;
            }
        }
        public async Task <bool> ExecuteAsync()
        {
            if (!_options.KeyPhraseAnalysis && !_options.SentimentAnalysis && !_options.LanguageDetection)
            {
                Console.Error.WriteLine("ERROR! At least one analysis option must be specified; Sentiment analysis, Keyphrase analysis or language detection ");
                return(await Task.FromResult <bool>(false));
            }
            var location     = (LocationKeyIdentifier)System.Enum.Parse(typeof(LocationKeyIdentifier), _options.Location, true);
            var txtToAnalyse = _options.Filename != null?File.ReadAllText(_options.Filename.FullName) : _options.TextToAnalyse;

            if (string.IsNullOrWhiteSpace(txtToAnalyse))
            {
                Console.Error.WriteLine("ERROR! No text supplied for analysis.");
                return(await Task.FromResult <bool>(false));
            }


            var analysis = TextAnalyticConfigurationSettings.CreateUsingConfigurationKeys(_options.ApiKey, location)
                           .AddConsoleDiagnosticLogging()
                           .UsingHttpCommunication()
                           .WithTextAnalyticAnalysisActions()
                           .AddSentimentAnalysisSplitIntoSentences(txtToAnalyse);

            if (_options.KeyPhraseAnalysis)
            {
                analysis = analysis.AddKeyPhraseAnalysis(txtToAnalyse);
            }
            if (_options.LanguageDetection)
            {
                analysis = analysis.AddLanguageAnalysis(txtToAnalyse);
            }
            var result = await analysis.AnalyseAllAsync();

            await ProcessResultsAsync(result); // Note: Not the optimal to return results as we want to output to multiple formats but will do for now.

            return(await Task.FromResult <bool>(true));
        }