Exemple #1
0
        public static async Task <List <TweetSentiment> > AnalyzeTweetSentiment(List <TweetRaw> tweets)
        {
            var tweetsSentiment = new List <TweetSentiment>();
            int page            = 0;
            int itemPerPage     = 50;


            var temp = new List <TweetRaw>();

            temp.AddRange(tweets.Skip(itemPerPage * page++).Take(itemPerPage));
            while (temp.Count > 0)
            {
                var textBatchInput = new TextAnalyticsBatchInput();
                foreach (var t in temp)
                {
                    var textAnalysis = new TextAnalyticsInput
                    {
                        Id   = t.Id.ToString(),
                        Text = t.Text
                    };
                    textBatchInput.Documents.Add(textAnalysis);
                }
                var sentimentResponse = await AzureSentiment.SentimentV3PreviewPredictAsync(textBatchInput);

                Console.WriteLine($"Tweets analyzed:{itemPerPage + itemPerPage * (page - 1)}");
                foreach (var document in sentimentResponse.Documents)
                {
                    var tweetSentiment = new TweetSentiment
                    {
                        TweetRawId    = long.Parse(document.Id),
                        PositiveScore = document.DocumentScores.Positive,
                        NeutralScore  = document.DocumentScores.Neutral,
                        NegativeScore = document.DocumentScores.Negative,
                        Sentiment     = Enum.Parse <Degree.Models.DocumentSentimentLabel>(document.Sentiment.ToString()),
                    };
                    if (document.Sentences != null && document.Sentences.Count() > 0)
                    {
                        foreach (var sentence in document.Sentences)
                        {
                            var s = new TweetSentenceSentiment()
                            {
                                TweetSentimentId = long.Parse(document.Id),
                                Length           = sentence.Length,
                                PositiveScore    = sentence.SentenceScores.Positive,
                                NeutralScore     = sentence.SentenceScores.Neutral,
                                NegativeScore    = sentence.SentenceScores.Negative,
                                Offset           = sentence.Offset,
                                Sentiment        = Enum.Parse <Degree.Models.SentenceSentimentLabel>(sentence.Sentiment.ToString()),
                                Warnings         = sentence.Warnings
                            };
                            tweetSentiment.Sentences.Add(s);
                        }
                    }
                    tweetsSentiment.Add(tweetSentiment);
                }
                temp.Clear();
                temp.AddRange(tweets.Skip(itemPerPage * page++).Take(itemPerPage));
            }
            return(tweetsSentiment);
        }
Exemple #2
0
        public async Task ProcessTweetAsync(string keyword, MatchedTweetReceivedEventArgs args)
        {
            var responseDocument = await MakeRequest(args.Tweet.FullText);

            var tweetSentiment = new TweetSentiment
            {
                FullText = args.Tweet.FullText,
                Score    = responseDocument.Score
            };

            Console.WriteLine($"[{DateTime.Now}] - Tweet: {tweetSentiment.FullText}. Sentiment: {tweetSentiment.Score}");

            await _tweetsRepository.SaveTweetAsync(args, keyword, tweetSentiment);
        }
        public void SaveSentiment(TweetSentiment tweetSentiment)
        {
            if (tweetSentiment == null)
            {
                return;
            }

            var fields = new Dictionary <string, object>
            {
                { "fullText", tweetSentiment.FullText },
                { "score", tweetSentiment.Score }
            };

            _metricsCollectorWrapper.Write("sentiment", fields);
        }
Exemple #4
0
        public async Task SaveTweetAsync(MatchedTweetReceivedEventArgs args, string keyword,
                                         TweetSentiment tweetSentiment)
        {
            var document = new TweetSentimentDocument
            {
                PartitionKey = args.Tweet.CreatedBy.UserIdentifier.ScreenName,
                FullText     = args.Tweet.FullText,
                CreatedAt    = args.Tweet.CreatedAt,
                Score        = tweetSentiment.Score,
                Keyword      = keyword
            };

            try
            {
                await _documentClient.CreateDocumentAsync(_documentCollectionUri, document);
            }
            catch (DocumentClientException documentClientException)
            {
                if (documentClientException.StatusCode != null)
                {
                    var statusCode = (int)documentClientException.StatusCode;

                    // Error 429 ("Request rate is large") indicates that the application has exceeded the provisioned RU quota, and should retry the request after a small time interval.
                    if (statusCode == 429 || statusCode == (int)HttpStatusCode.ServiceUnavailable)
                    {
                        var retryAfterMilliseconds = documentClientException.RetryAfter.Milliseconds;
                        Console.WriteLine(
                            $"Status Code: {statusCode}. Retry after: {retryAfterMilliseconds} ms.");

                        Thread.Sleep(retryAfterMilliseconds);
                    }
                    else
                    {
                        throw;
                    }
                }
                else
                {
                    throw;
                }
            }
        }
Exemple #5
0
        public static async Task <TweetSentiment> InsertOrUpdateSentimentAsync(TweetSentiment tweetSentiment)
        {
            using (var context = new AppDbContext())
            {
                if (context.TweetsSentiment.Count(x => x.TweetRawId == tweetSentiment.TweetRawId) > 0)
                {
                    context.Remove(tweetSentiment);
                    await context.SaveChangesAsync();

                    await context.AddAsync(tweetSentiment);

                    await context.SaveChangesAsync();
                }
                else
                {
                    await context.AddAsync(tweetSentiment);

                    await context.SaveChangesAsync();
                }

                return(tweetSentiment);
            }
        }
Exemple #6
0
        public void SaveValidSentiment()
        {
            // Arrange
            var metricsCollectorWrapper = new Mock <IMetricsCollectorWrapper>();
            var tweetsRepository        = new TweetsRepository(metricsCollectorWrapper.Object);

            // Act
            var tweetSentiment = new TweetSentiment
            {
                FullText = "I am happy!",
                Score    = 0.99
            };

            tweetsRepository.SaveSentiment(tweetSentiment);

            // Assert
            var fields = new Dictionary <string, object>
            {
                { "fullText", "I am happy!" },
                { "score", 0.99 }
            };

            metricsCollectorWrapper.Verify(x => x.Write("sentiment", fields), Times.Once);
        }