Algorithm to determine how positive or negative a statement/text is

AlgorithmNlp

Algorithm Problem Overview


I need an algorithm to determine if a sentence, paragraph or article is negative or positive in tone... or better yet, how negative or positive.

For instance:

>>Jason is the worst SO user I have ever witnessed (-10)

>>Jason is an SO user (0)

>>Jason is the best SO user I have ever seen (+10)

>>Jason is the best at sucking with SO (-10)

>>While, okay at SO, Jason is the worst at doing bad (+10)

Not easy, huh? :)

I don't expect somebody to explain this algorithm to me, but I assume there is already much work on something like this in academia somewhere. If you can point me to some articles or research, I would love it.

Thanks.

Algorithm Solutions


Solution 1 - Algorithm

There is a sub-field of natural language processing called sentiment analysis that deals specifically with this problem domain. There is a fair amount of commercial work done in the area because consumer products are so heavily reviewed in online user forums (ugc or user-generated-content). There is also a prototype platform for text analytics called GATE from the university of sheffield, and a python project called nltk. Both are considered flexible, but not very high performance. One or the other might be good for working out your own ideas.

Solution 2 - Algorithm

In my company we have a product which does this and also performs well. I did most of the work on it. I can give a brief idea:

You need to split the paragraph into sentences and then split each sentence into smaller sub sentences - splitting based on commas, hyphen, semi colon, colon, 'and', 'or', etc. Each sub sentence will be exhibiting a totally seperate sentiment in some cases.

Some sentences even if it is split, will have to be joined together.

Eg: The product is amazing, excellent and fantastic.

We have developed a comprehensive set of rules on the type of sentences which need to be split and which shouldn't be (based on the POS tags of the words)

On the first level, you can use a bag of words approach, meaning - have a list of positive and negative words/phrases and check in every sub sentence. While doing this, also look at the negation words like 'not', 'no', etc which will change the polarity of the sentence.

Even then if you can't find the sentiment, you can go for a naive bayes approach. This approach is not very accurate (about 60%). But if you apply this to only sentence which fail to pass through the first set of rules - you can easily get to 80-85% accuracy.

The important part is the positive/negative word list and the way you split things up. If you want, you can go even a level higher by implementing HMM (Hidden Markov Model) or CRF (Conditional Random Fields). But I am not a pro in NLP and someone else may fill you in that part.

For the curious people, we implemented all of this is python with NLTK and the Reverend Bayes module.

Pretty simple and handles most of the sentences. You may however face problems when trying to tag content from the web. Most people don't write proper sentences on the web. Also handling sarcasm is very hard.

Solution 3 - Algorithm

This falls under the umbrella of Natural Language Processing, and so reading about that is probably a good place to start.

If you don't want to get in to a very complicated problem, you can just create lists of "positive" and "negative" words (and weight them if you want) and do word counts on sections of text. Obviously this isn't a "smart" solution, but it gets you some information with very little work, where doing serious NLP would be very time consuming.

One of your examples would potentially be marked positive when it was in fact negative using this approach ("Jason is the best at sucking with SO") unless you happen to weight "sucking" more than "best".... But also this is a small text sample, if you're looking at paragraphs or more of text, then weighting becomes more reliable unless you have someone purposefully trying to fool your algorithm.

Solution 4 - Algorithm

As pointed out, this comes under sentiment analysis under natural language processing.
Afaik GATE doesn't have any component that does sentiment analysis.
In my experience, I have implemented an algorithm which is an adaptation of the one in the paper 'Recognizing Contextual Polarity in Phrase-Level Sentiment Analysis' by Theresa Wilson, Janyce Wiebe, Paul Hoffmann (http://www.cs.pitt.edu/~wiebe/pubs/papers/emnlp05polarity.pdf">this</a>;) as a GATE plugin, which gives reasonable good results. It could help you if you want to bootstrap the implementation.

Solution 5 - Algorithm

Depending on your application you could do it via a Bayesian Filtering algorithm (which is often used in spam filters).

One way to do it would be to have two filters. One for positive documents and another for negative documents. You would seed the positive filter with positive documents (whatever criteria you use) and the negative filter with negative documents. The trick would be to find these documents. Maybe your could set it up so your users effectively rate documents.

The positive filter (once seeded) would look for positive words. Maybe it would end up with words like love, peace, etc. The negative filter would be seeded appropriately as well.

Once your filters are setup, then you run the test text through them to come up with positive and negative scores. Based on these scores and some weighting, you could come up with your numeric score.

Bayesian Filters, though simple, are surprisingly effective.

Solution 6 - Algorithm

You can do like this:

    Jason is the worst SO user I have ever witnessed (-10)

worst (-), the rest is (+). so, that would be (-) + (+) = (-)

    Jason is an SO user (0)

( ) + ( ) = ( )

    Jason is the best SO user I have ever seen (+10)

best (+) , the rest is ( ). so, that would be (+) + ( ) = (+)

    Jason is the best at sucking with SO (-10)

best (+), sucking (-). so, (+) + (-) = (-)

    While, okay at SO, Jason is the worst at doing bad (+10)

worst (-), doing bad (-). so, (-) + (-) = (+)

Solution 7 - Algorithm

There are many machine learning approaches for this kind of Sentiment Analysis. I used most of the machine learning algorithms, which are already implemented. my case I have used

weka classification algorithms

  • SVM
  • naive basian
  • J48

Only you have to do this train the model to your context , add featured vector and rule based tune up. In my case I got some (61% accuracy). So We move into stanford core nlp ( they trained their model for movie reviews) and we used their training set and add our training set. we could achieved 80-90% accuracy.

Solution 8 - Algorithm

This is an old question, but I happened upon it looking for a tool that could analyze article tone and found Watson Tone Analyzer by IBM. It allows 1000 api calls monthly for free.

Solution 9 - Algorithm

It's all about context, I think. If you're looking for the people who are best at sucking with SO. Sucking the best can be a positive thing. For determination what is bad or good and how much I could recommend looking into Fuzzy Logic.

It's a bit like being tall. Someone who's 1.95m can considered to be tall. If you place that person in a group with people all over 2.10m, he looks short.

Solution 10 - Algorithm

Maybe essay grading software could be used to estimate tone? [WIRED](http://www.wired.com/science/discoveries/news/2005/05/67458 "WIRED:Computers Grade Students") article.
[Possible](http://www3.interscience.wiley.com/journal/119380725/abstract?CRETRY=1&SRETRY=0 "Wiley InterScience") reference. (I couldn't read it.)
[This](http://www.jdentaled.org/cgi/reprint/69/2/285.pdf "Computerized Assessment of Dental Student Writing Skills") report compares writing skill to the Flesch-Kincaid Grade Level needed to read it!
Page 4 of [e-rator](http://www.ets.org/Media/Research/pdf/RD_Connections2.pdf "e-rator Overview") says that they look at mispelling and such. (Maybe bad post are misspelled too!)
[Slashdot](http://slashdot.org/article.pl?sid=04/05/20/1551235 "Slashdot:Indiana First With Computerized Grading ") article.

You could also use an email filter of some sort for negativity instead of spam-ness.

Solution 11 - Algorithm

How about sarcasm:

  • Jason is the best SO user I have ever seen, NOT
  • Jason is the best SO user I have ever seen, right

Solution 12 - Algorithm

Ah, I remember one java library for this called LingPipe (commercial license) that we evaluated. It would work fine for the example corpus that is available at the site, but for real data it sucks pretty bad.

Solution 13 - Algorithm

Most of the sentiment analysis tools are lexicon based and none of them is perfect. Also, sentiment analysis can be described as a trinary sentiment classification or binary sentiment classification. Moreover, it is a domain specific task. Meaning that tools which work well on news dataset may not do a good job on informal and unstructured tweets.

I would suggest using several tools and have an aggregation or vote based mechanism to decide the intensity of the sentiment. The best survey study on sentiment analysis tools that I have come across is SentiBench. You will find it helpful.

Solution 14 - Algorithm

   use Algorithm::NaiveBayes;
     my $nb = Algorithm::NaiveBayes->new;

     $nb->add_instance
       (attributes => {foo => 1, bar => 1, baz => 3},
        label => 'sports');

     $nb->add_instance
       (attributes => {foo => 2, blurp => 1},
        label => ['sports', 'finance']);

     ... repeat for several more instances, then:
     $nb->train;

     # Find results for unseen instances
     my $result = $nb->predict
       (attributes => {bar => 3, blurp => 2});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJasonView Question on Stackoverflow
Solution 1 - AlgorithmfawceView Answer on Stackoverflow
Solution 2 - AlgorithmcnuView Answer on Stackoverflow
Solution 3 - AlgorithmSoapBoxView Answer on Stackoverflow
Solution 4 - AlgorithmAnandView Answer on Stackoverflow
Solution 5 - AlgorithmTAGView Answer on Stackoverflow
Solution 6 - Algorithmaliv faizal muhammadView Answer on Stackoverflow
Solution 7 - AlgorithmParanetharan SaravanaperumalView Answer on Stackoverflow
Solution 8 - Algorithmweagle08View Answer on Stackoverflow
Solution 9 - AlgorithmSorskootView Answer on Stackoverflow
Solution 10 - AlgorithmwaynecolvinView Answer on Stackoverflow
Solution 11 - AlgorithmOsama Al-MaadeedView Answer on Stackoverflow
Solution 12 - AlgorithmcnuView Answer on Stackoverflow
Solution 13 - AlgorithmMonibaView Answer on Stackoverflow
Solution 14 - Algorithmuser906811View Answer on Stackoverflow