O sentimento é um módulo Node.js que usa o ranking Afinn-165 WordList e Emoji Sentiment para executar análises de sentimentos em blocos arbitrários de texto de entrada. O sentimento fornece várias coisas:
npm install sentiment var Sentiment = require ( 'sentiment' ) ;
var sentiment = new Sentiment ( ) ;
var result = sentiment . analyze ( 'Cats are stupid.' ) ;
console . dir ( result ) ; // Score: -2, Comparative: -0.666 Você pode adicionar suporte para um novo idioma registrando -o usando o método registerLanguage :
var frLanguage = {
labels : { 'stupide' : - 2 }
} ;
sentiment . registerLanguage ( 'fr' , frLanguage ) ;
var result = sentiment . analyze ( 'Le chat est stupide.' , { language : 'fr' } ) ;
console . dir ( result ) ; // Score: -2, Comparative: -0.5Você também pode definir estratégias de pontuação personalizadas para lidar com coisas como negação e ênfase em uma base por língua:
var frLanguage = {
labels : { 'stupide' : - 2 } ,
scoringStrategy : {
apply : function ( tokens , cursor , tokenScore ) {
if ( cursor > 0 ) {
var prevtoken = tokens [ cursor - 1 ] ;
if ( prevtoken === 'pas' ) {
tokenScore = - tokenScore ;
}
}
return tokenScore ;
}
}
} ;
sentiment . registerLanguage ( 'fr' , frLanguage ) ;
var result = sentiment . analyze ( 'Le chat n'est pas stupide' , { language : 'fr' } ) ;
console . dir ( result ) ; // Score: 2, Comparative: 0.4 Você pode anexar e/ou substituir os valores da AFINN simplesmente injetando pares de chave/valor em uma chamada de método de sentimento:
var options = {
extras : {
'cats' : 5 ,
'amazing' : 2
}
} ;
var result = sentiment . analyze ( 'Cats are totally amazing!' , options ) ;
console . dir ( result ) ; // Score: 7, Comparative: 1.75 var sentiment = new Sentiment([options])| Argumento | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| opções | object | false | Opções de configuração (sem opções suportadas atualmente) |
sentiment.analyze(phrase, [options], [callback])| Argumento | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| frase | string | true | Frase de entrada para analisar |
| opções | object | false | Opções (veja abaixo) |
| ligar de volta | function | false | Se especificado, o resultado é retornado usando esta função de retorno de chamada |
options Propriedades do objeto:
| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
| linguagem | string | 'en' | Idioma a ser usado para análise de sentimentos |
| extras | object | {} | Conjunto de rótulos e seus valores associados para adicionar ou substituir |
sentiment.registerLanguage(languageCode, language)| Argumento | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| LanguageCode | string | true | Código internacional de dois dígitos para o idioma adicionar |
| linguagem | object | true | Módulo de idioma (consulte Adicionando novos idiomas) |
Afinn é uma lista de palavras classificadas para valência com um número inteiro entre cinco (negativo) e mais cinco (positivos). A análise de sentimentos é realizada verificando os tokens de string (palavras, emojis) com a lista Afinn e obtendo suas respectivas pontuações. A pontuação comparativa é simplesmente: sum of each token / number of tokens . Por exemplo, vamos tomar o seguinte:
I love cats, but I am allergic to them.
Essa string resulta no seguinte:
{
score : 1 ,
comparative : 0.1111111111111111 ,
calculation : [ { allergic : - 2 } , { love : 3 } ] ,
tokens : [
'i' ,
'love' ,
'cats' ,
'but' ,
'i' ,
'am' ,
'allergic' ,
'to' ,
'them'
] ,
words : [
'allergic' ,
'love'
] ,
positive : [
'love'
] ,
negative : [
'allergic'
]
} Nesse caso, o amor tem um valor de 3, o alérgico tem um valor de -2, e os tokens restantes são neutros com um valor 0. Porque a string possui 9 tokens que a pontuação comparativa resultante se parece: (3 + -2) / 9 = 0.111111111
Essa abordagem deixa você com um ponto médio de 0 e os limites superior e inferior são restringidos a 5 positivos e negativos, respectivamente (o mesmo que cada token!?). Por exemplo, vamos imaginar uma corda incrivelmente "positiva" com 200 tokens e onde cada token tem uma pontuação de 5. Nossa pontuação comparativa resultante ficaria assim:
(max positive score * number of tokens) / number of tokens
(5 * 200) / 200 = 5
A tokenização funciona dividindo as linhas da string de entrada e removendo os caracteres especiais e finalmente dividindo -a usando espaços. Isso é usado para obter lista de palavras na string.
Uma motivação primária para projetar sentiment foi o desempenho. Como tal, inclui um script de referência no diretório de teste que o compara com o módulo sentimental que fornece uma interface e abordagem quase equivalentes. Com base nesses benchmarks, executando em um MacBook Pro com o nó v6.9.1, sentiment é quase o dobro do que implementações alternativas:
sentiment (Latest) x 861,312 ops/sec ±0.87% (89 runs sampled)
Sentimental (1.0.1) x 451,066 ops/sec ±0.99% (92 runs sampled)Para executar os benchmarks mesmo:
npm run test:benchmark Embora a precisão fornecida pela AFINN seja muito boa, considerando seu desempenho computacional (veja acima), sempre há espaço para melhorias. Portanto, o módulo sentiment está aberto a aceitar PRs que modificam ou alteram os conjuntos de dados ou implementação do AFINN / EMOJI, uma vez que eles melhoram a precisão e mantêm características de desempenho semelhantes. Para estabelecer isso, testamos o módulo sentiment em relação a três conjuntos de dados rotulados fornecidos pela UCI.
Para executar os testes de validação:
npm run test:validate Amazon: 0.726
IMDB: 0.765
Yelp: 0.696
npm test