sentiment
sentiment copied to clipboard
Support for 2-grams
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?
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
};