コード例 #1
0
        public void Netgative()
        {
            var value = new SentimentValue(wordItem.Object, "Text", -0.5);

            Assert.AreEqual(-0.5, value.DataValue.Value);
            Assert.IsFalse(value.DataValue.IsPositive);
        }
コード例 #2
0
        public void CreateGood()
        {
            var value = SentimentValue.CreateGood(wordItem.Object);

            Assert.AreEqual(1, value.DataValue.Value);
            Assert.IsTrue(value.DataValue.IsPositive);
        }
コード例 #3
0
        public void Positive()
        {
            var value = new SentimentValue(wordItem.Object, "Text", 0.5);

            Assert.AreEqual(0.5, value.DataValue.Value);
            Assert.IsTrue(value.DataValue.IsPositive);
        }
コード例 #4
0
        public void CalculateQuantMultiTest()
        {
            relationships.Setup(item => item.Inverted)
            .Returns((IWordItem)null);
            relationships.Setup(item => item.PriorQuants)
            .Returns(
                new List <IWordItem>
            {
                new TestWordItem("Word")
                {
                    QuantValue = 10,
                },
                new TestWordItem("Word")
                {
                    QuantValue = 2,
                }
            });

            var value  = SentimentValue.CreateGood(wordItem.Object);
            var target = new SentimentCalculator(value);

            var result = (double)target.InvokeMethod("CalculateQuant");

            Assert.AreEqual(6, result);
        }
コード例 #5
0
        public void CreateBad()
        {
            var value = SentimentValue.CreateBad(wordItem.Object);

            Assert.AreEqual(-1, value.DataValue.Value);
            Assert.IsFalse(value.DataValue.IsPositive);
        }
コード例 #6
0
        public SentimentValue CheckSentiment(IWordItem word)
        {
            if (Context.DisableFeatureSentiment &&
                word.IsFeature)
            {
                return(null);
            }

            if (Context.Lexicon != null)
            {
                SentimentValue sentiment = Context.Lexicon.MeasureSentiment(word);
                if (sentiment != null ||
                    !Context.UseBuiltInSentiment)
                {
                    return(sentiment);
                }

                var builtIn = inner.CheckSentiment(word);
                if (builtIn != null)
                {
                    // original max strength is 3 we move it save scale as custom and also make it 4 time less powerfull
                    return(new SentimentValue(word, builtIn.Span, builtIn.DataValue.Value / 3 * Context.Lexicon.AverageStrength / 4));
                }
                else
                {
                    return(null);
                }
            }

            return(inner.CheckSentiment(word));
        }
コード例 #7
0
        private SentimentValue ResolveSentiment()
        {
            var sentimentValue = handler?.MeasureSentiment(Owner);

            if (Owner.IsInvertor &&
                !Owner.IsUsedInSentiment())
            {
                if (handler?.Context.DisableFeatureSentiment == true)
                {
                    return(null);
                }

                // is something inverted, but unknown to us
                if (sentimentValue != null)
                {
                    return(sentimentValue);
                }

                return(SentimentValue.CreateInvertor(Owner));
            }

            if (sentimentValue == null)
            {
                return(null);
            }

            sentimentValue = new SentimentCalculator(sentimentValue).Calculate();
            return(sentimentValue);
        }
コード例 #8
0
        public void MeasureSentiment(string word, string pos, int sentiment)
        {
            Text.Words.IWordItem wordItem   = ActualWordsHandler.InstanceSimple.WordFactory.CreateWord(word, pos);
            SentimentValue       measurment = sentimentData.MeasureSentiment(wordItem);

            Assert.AreEqual(sentiment, measurment?.DataValue.Value ?? 0);
        }
コード例 #9
0
        public Document ReparseDocument(IRatingAdjustment adjustment)
        {
            if (adjustment?.Review?.Document == null)
            {
                throw new System.ArgumentNullException(nameof(adjustment));
            }

            adjustment.CalculateRating();
            var document = new Document();

            document.DocumentTime = adjustment.Review.Document.DocumentTime;
            document.Stars        = adjustment.Review.Document.Stars;
            document.Id           = adjustment.Review.Document.Id;
            document.Author       = adjustment.Review.Document.Author;

            if (adjustment.Rating != null)
            {
                document.Stars = adjustment.Rating.StarsRating;
            }

            if (adjustment.Review.Text == null)
            {
                document.Text = adjustment.Review.Text;
            }

            foreach (var sentence in adjustment.Review.Sentences)
            {
                if (string.IsNullOrWhiteSpace(sentence.Text))
                {
                    continue;
                }

                var sentenceItem = new SentenceItem(sentence.Text);
                document.Add(sentenceItem);
                foreach (var wordItem in sentence.Occurrences)
                {
                    var word = WordExFactory.Construct(wordItem);
                    word.IsStop           = wordItem.IsStopWord;
                    word.Phrase           = wordItem.Parent?.Text;
                    word.NormalizedEntity = wordItem.NormalizedEntity;
                    word.Value            = wordItem.Relationship.Sentiment?.DataValue?.Value;
                    word.IsAspect         = wordItem.IsFeature;
                    SentimentValue value = adjustment.GetSentiment(wordItem);
                    if (value != null)
                    {
                        word.CalculatedValue = value.DataValue.Value;
                    }
                    else if (word.Value != null)
                    {
                        word.CalculatedValue = 0;
                    }

                    sentenceItem.Add(word);
                }
            }

            document.Text = adjustment.Review.Document.Text;
            return(document);
        }
コード例 #10
0
        public SentimentCalculator(SentimentValue value)
        {
            if (value is null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            wordItem       = value.Owner;
            sentimentValue = value;
        }
コード例 #11
0
        public void Adjust(string word, double weight, double sentiment)
        {
            var table = new Dictionary <string, double>();

            table[word]   = weight;
            sentimentData = SentimentDataHolder.PopulateEmotionsData(table);
            Text.Words.IWordItem wordItem    = ActualWordsHandler.InstanceSimple.WordFactory.CreateWord(word, "NN");
            SentimentValue       measurement = sentimentData.MeasureSentiment(wordItem);

            Assert.AreEqual(sentiment, measurement.DataValue.Value);
        }
コード例 #12
0
        public SentimentValue MeasureSentiment(IWordItem word)
        {
            if (!EmotionsTable.TryGetWordValue(word, out var value))
            {
                return(MeasureLookupSentiment(word));
            }

            var sentiment = new SentimentValue(word, value.Word, new SentimentValueData(value.Data.Value));

            return(sentiment);
        }
コード例 #13
0
        public void GetDistanced()
        {
            var value     = SentimentValue.CreateBad(wordItem.Object);
            var distanced = value.GetDistanced(1);

            Assert.AreEqual(-1, distanced.DataValue.Value);
            distanced = value.GetDistanced(2);
            Assert.AreEqual(-1, distanced.DataValue.Value);
            distanced = value.GetDistanced(3);
            Assert.AreEqual(-0.5, distanced.DataValue.Value);
            distanced = value.GetDistanced(5);
            Assert.AreEqual(-0.25, distanced.DataValue.Value);
        }
コード例 #14
0
        public void SentimentCalculatorConstructorTest()
        {
            IWordItem invertor = new TestWordItem(String.Empty);

            relationships.Setup(item => item.Inverted)
            .Returns(invertor);
            relationships.Setup(item => item.PriorQuants)
            .Returns(new List <IWordItem>());

            var value  = SentimentValue.CreateGood(wordItem.Object);
            var target = new SentimentCalculator(value);

            Assert.AreEqual(wordItem.Object, target.GetField <IWordItem>("wordItem"));
            Assert.AreEqual(value, target.GetField <SentimentValue>("sentimentValue"));
        }
コード例 #15
0
        private SentimentValue MeasureLookupSentiment(IWordItem word)
        {
            if (word is IPhrase ||
                !EmotionsLookup.TryGetWordValue(word, out var value))
            {
                return(null);
            }

            var isInverted = word.Text.EndsWith("free", StringComparison.OrdinalIgnoreCase) ||
                             word.Text.EndsWith("proof", StringComparison.OrdinalIgnoreCase) ||
                             word.Text.EndsWith("less", StringComparison.OrdinalIgnoreCase);
            var invertingEnd = isInverted ? -1 : 1;
            var sentiment    = new SentimentValue(word, word.Text, new SentimentValueData(value.Value * invertingEnd));

            return(sentiment);
        }
コード例 #16
0
        public void CalculateInvertTest()
        {
            IWordItem invertor = new TestWordItem("Invert");

            relationships.Setup(item => item.Inverted)
            .Returns(invertor);
            relationships.Setup(item => item.PriorQuants)
            .Returns(new List <IWordItem>());

            var value = SentimentValue.CreateGood(wordItem.Object);

            var target = new SentimentCalculator(value);

            var result = target.Calculate();

            Assert.AreEqual(-1, result.DataValue.Value);
        }
コード例 #17
0
        public SentimentValue Calculate()
        {
            var calculatedValue = sentimentValue.DataValue.Value;

            if (wordItem.Relationship.Inverted != null)
            {
                calculatedValue = -calculatedValue;
            }

            var quantitifier = CalculateQuant();

            calculatedValue = calculatedValue * quantitifier;
            var value = new SentimentValue(
                wordItem,
                new SentimentValueData(calculatedValue, sentimentValue.DataValue.SentimentSource));

            return(value);
        }
コード例 #18
0
        protected void Add(SentimentValue sentiment)
        {
            if (calculatedSentiments.ContainsKey(sentiment.Owner))
            {
                return;
            }

            if (sentiment.Owner.Relationship.Inverted != null)
            {
                calculatedSentiments[sentiment.Owner.Relationship.Inverted] =
                    new SentimentValue(
                        sentiment.Owner.Relationship.Inverted,
                        new SentimentValueData(0, SentimentSource.AdjustedCanceled));
            }

            Rating.AddSentiment(sentiment.DataValue);
            calculatedSentiments[sentiment.Owner] = sentiment;
        }
コード例 #19
0
        public void CalculateSmallQuantTest()
        {
            relationships.Setup(item => item.Inverted)
            .Returns((IWordItem)null);
            relationships.Setup(item => item.PriorQuants)
            .Returns(
                new List <IWordItem>
            {
                new TestWordItem("Quant")
                {
                    QuantValue = 0.5
                }
            });

            var value  = SentimentValue.CreateGood(wordItem.Object);
            var target = new SentimentCalculator(value);
            var result = target.Calculate();

            Assert.AreEqual(0.5, result.DataValue.Value);
        }
コード例 #20
0
        public SentimentValue CheckSentiment(IWordItem word)
        {
            if (Context.DisableFeatureSentiment &&
                word.IsFeature)
            {
                return(null);
            }

            if (Context.Lexicon != null)
            {
                SentimentValue sentiment = Context.Lexicon.MeasureSentiment(word);
                if (sentiment != null ||
                    !Context.UseBuiltInSentiment)
                {
                    return(sentiment);
                }
            }

            return(inner.CheckSentiment(word));
        }
コード例 #21
0
        public void CalculateQuantInvertor()
        {
            var invertor = new TestWordItem(String.Empty);

            relationships.Setup(item => item.Inverted)
            .Returns(invertor);
            relationships.Setup(item => item.PriorQuants)
            .Returns(
                new List <IWordItem>
            {
                new TestWordItem("Word")
                {
                    QuantValue = 10,
                }
            });

            var value  = SentimentValue.CreateGood(wordItem.Object);
            var target = new SentimentCalculator(value);

            var result = (double)target.InvokeMethod("CalculateQuant");

            Assert.AreEqual(10, result);
        }
コード例 #22
0
        public Document ReparseDocument(IRatingAdjustment adjustment)
        {
            if (adjustment?.Review?.Document == null)
            {
                throw new ArgumentNullException(nameof(adjustment));
            }

            adjustment.CalculateRating();
            var document = new Document();

            document.DocumentTime = adjustment.Review.Document.DocumentTime;
            document.Stars        = adjustment.Review.Document.Stars;
            document.Id           = adjustment.Review.Document.Id;
            document.Author       = adjustment.Review.Document.Author;

            if (adjustment.Rating != null)
            {
                document.Stars = adjustment.Rating.StarsRating;
            }

            bool buildText = false;

            if (adjustment.Review.Text != null)
            {
                document.Text = adjustment.Review.Text;
                buildText     = true;
            }

            var vector = new SentimentVector();

            foreach (var sentence in adjustment.Review.Sentences)
            {
                if (string.IsNullOrWhiteSpace(sentence.Text))
                {
                    continue;
                }

                var sentenceItem = new SentenceItem(sentence.Text);
                document.Add(sentenceItem, buildText);
                foreach (var wordItem in sentence.Occurrences)
                {
                    var word = WordExFactory.Construct(wordItem);
                    word.IsStop           = wordItem.IsStopWord;
                    word.Phrase           = wordItem.Parent?.Text;
                    word.NormalizedEntity = wordItem.NormalizedEntity;
                    word.Span             = word.Text;
                    var sentiment = wordItem.Relationship.Sentiment?.DataValue;
                    if (sentiment != null)
                    {
                        word.Value = sentiment.Value;
                        word.Span  = wordItem.Relationship.Sentiment.Span;
                    }

                    word.IsAspect = wordItem.IsFeature;
                    SentimentValue value = adjustment.GetSentiment(wordItem);
                    if (value != null)
                    {
                        word.CalculatedValue = value.DataValue.Value;
                    }
                    else if (word.Value != null)
                    {
                        word.CalculatedValue = 0;
                    }

                    if (adjustment.Review.Context.ExtractAttributes)
                    {
                        PopulateAttributes(vector, word, wordItem);
                    }

                    sentenceItem.Add(word);
                }
            }

            document.Text = adjustment.Review.Document.Text;
            if (adjustment.Review.Context.ExtractAttributes)
            {
                document.Attributes = vector.GetProbabilities().ToDictionary(item => item.Data, item => item.Probability.ToString());
            }

            return(document);
        }
コード例 #23
0
        public void Setup()
        {
            sentence     = new Mock <ISentence>();
            parent       = new Mock <IWordItemRelationships>();
            sentencePart = new Mock <ISentencePart>();
            owner        = new Mock <IWordItem>();
            child        = new Mock <IWordItemRelationships>();
            parent.Setup(item => item.Owner)
            .Returns(owner.Object);
            owner.Setup(item => item.WordIndex)
            .Returns(5);
            first  = new Mock <IWordItem>();
            second = new Mock <IWordItem>();
            third  = new Mock <IWordItem>();
            sentence.Setup(item => item.Occurrences)
            .Returns(
                new[]
            {
                first.Object,
                second.Object,
                third.Object
            });

            sentencePart.Setup(item => item.Sentence)
            .Returns(sentence.Object);
            first.Setup(item => item.POS).Returns(POSTags.Instance.NN);
            first.Setup(item => item.Text).Returns("1");
            first.Setup(item => item.IsSentiment)
            .Returns(true);
            first.Setup(item => item.IsFeature)
            .Returns(false);
            first.Setup(item => item.WordIndex)
            .Returns(1);

            second.Setup(item => item.Text).Returns("2");
            second.Setup(item => item.POS).Returns(POSTags.Instance.NN);
            second.Setup(item => item.IsSentiment)
            .Returns(false);
            second.Setup(item => item.IsFeature)
            .Returns(false);
            second.Setup(item => item.WordIndex)
            .Returns(3);

            third.Setup(item => item.Text).Returns("3");
            third.Setup(item => item.POS).Returns(POSTags.Instance.NN);
            third.Setup(item => item.IsSentiment)
            .Returns(true);
            third.Setup(item => item.IsFeature)
            .Returns(false);
            third.Setup(item => item.WordIndex)
            .Returns(10);

            parent.Setup(item => item.Part)
            .Returns(sentencePart.Object);

            first.Setup(item => item.Relationship)
            .Returns(child.Object);
            second.Setup(item => item.Relationship)
            .Returns(child.Object);
            third.Setup(item => item.Relationship)
            .Returns(child.Object);

            child.SetupSequence(item => item.Sentiment)
            .Returns(SentimentValue.CreateBad(owner.Object))
            .Returns(SentimentValue.CreateBad(owner.Object))
            .Returns(SentimentValue.CreateGood(owner.Object))
            .Returns(SentimentValue.CreateGood(owner.Object));
            child.Setup(item => item.PriorQuants)
            .Returns(new List <IWordItem>());
        }
コード例 #24
0
        public static bool IsSentiment(this IContextWordsHandler instance, IWordItem word)
        {
            SentimentValue sentiment = instance.MeasureSentiment(word);

            return(sentiment != null);
        }