sentiment icon indicating copy to clipboard operation
sentiment copied to clipboard

Support for 2-grams

Open cristiano-belloni opened this issue 6 years ago • 2 comments

Hello, I'm trying to override the AFINN scores for 2-grams, but it doesn't seem to work:

sentiment.analyze( 'This stuff is made up', { extras: { 'made up': -1 } } )

{ score: 0,
  comparative: 0,
  tokens: [ 'this', 'is', 'made', 'up' ],
  words: [],
  positive: [],
  negative: [] }

The effect is even more accentuated when a 2-gram would flip the overall score of a phrase; here "fucking good" reinforces a positive word, but the overall score is -1:

sentiment.analyze( 'This stuff is fucking good', { extras: { 'fucking good': 3 } } )
{ score: -1,
  comparative: -0.2,
  tokens: [ 'this', 'stuff', 'is', 'fucking', 'good' ],
  words: [ 'good', 'fucking' ],
  positive: [ 'good' ],
  negative: [ 'fucking' ] }
>

Would it be possible and a good idea to add support for overridden 2-grams?

cristiano-belloni avatar Oct 29 '18 11:10 cristiano-belloni

You could possibly add something like this to your code:


let negativePhrases = ['refund', 'drop in revenue']
let positivePhrases = ['high-end', 'new product']

export const analyzeSentiment = (text) => {

    let sentiment = new Sentiment();
    let result = sentiment.analyze(text);

    [...negativePhrases, ...positivePhrases].forEach((phrase, index) => {
        if(text?.toLowerCase().includes(phrase?.toLowerCase()) && result.words.indexOf(phrase?.toLowerCase()) === -1){
            let obj = {}
            if(index < negativePhrases.length){
                obj[phrase] = -3
            }else{
                obj[phrase] = 3
            }
            result.calculation.push(obj)
        }
    })

    let values = [];
    result.calculation.forEach((obj) => {
        values.push(Object.values(obj)?.[0])
    })

    result.comparative = average(values);
    return result;
}

export const average = arr => {
    if(arr?.length === 0 || arr === undefined){
        return 0
    }
    return arr.reduce((p, c) => p + c, 0) / arr.length
};

martin-richter-uk avatar Sep 15 '22 09:09 martin-richter-uk