private IList <double> SentimentValence(double valence, SentiText sentiText, string item, int i, IList <double> sentiments) { string itemLowerCase = item.ToLower(); if (!Lexicon.ContainsKey(itemLowerCase)) { sentiments.Add(valence); return(sentiments); } bool isCapDiff = sentiText.IsCapDifferential; IList <string> wordsAndEmoticons = sentiText.WordsAndEmoticons; valence = Lexicon[itemLowerCase]; if (isCapDiff && item.IsUpper()) { if (valence > 0) { valence += SentimentUtils.CIncr; } else { valence -= SentimentUtils.CIncr; } } for (int startI = 0; startI < 3; startI++) { if (i > startI && !Lexicon.ContainsKey(wordsAndEmoticons[i - (startI + 1)].ToLower())) { double s = SentimentUtils.ScalarIncDec(wordsAndEmoticons[i - (startI + 1)], valence, isCapDiff); if (startI == 1 && s != 0) { s = s * 0.95; } if (startI == 2 && s != 0) { s = s * 0.9; } valence = valence + s; valence = NeverCheck(valence, wordsAndEmoticons, startI, i); if (startI == 2) { valence = IdiomsCheck(valence, wordsAndEmoticons, i); } } } valence = LeastCheck(valence, wordsAndEmoticons, i); sentiments.Add(valence); return(sentiments); }
/// <summary> /// Return metrics for positive, negative and neutral sentiment based on the input text. /// </summary> /// <param name="input"></param> /// <returns></returns> public SentimentAnalysisResults PolarityScores(string input) { SentiText sentiText = new SentiText(input); IList <double> sentiments = new List <double>(); IList <string> wordsAndEmoticons = sentiText.WordsAndEmoticons; for (int i = 0; i < wordsAndEmoticons.Count; i++) { string item = wordsAndEmoticons[i]; double valence = 0; if (i < wordsAndEmoticons.Count - 1 && item.ToLower() == "kind" && wordsAndEmoticons[i + 1] == "of" || SentimentUtils.BoosterDict.ContainsKey(item.ToLower())) { sentiments.Add(valence); continue; } sentiments = SentimentValence(valence, sentiText, item, i, sentiments); } sentiments = ButCheck(wordsAndEmoticons, sentiments); return(ScoreValence(sentiments, input)); }