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