Le sentiment est un module Node.js qui utilise la liste de mots AFINN-165 et le classement des sentiments emoji pour effectuer une analyse des sentiments sur les blocs arbitraires du texte d'entrée. Le sentiment fournit plusieurs choses:
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 Vous pouvez ajouter la prise en charge d'une nouvelle langue en l'enregistrant à l'aide de la méthode 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.5Vous pouvez également définir des stratégies de notation personnalisées pour gérer des choses comme la négation et l'accent mis sur une base permanente:
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 Vous pouvez ajouter et / ou écraser les valeurs de AFINN en injectant simplement des paires de clés / valeur dans un appel de méthode de sentiment:
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])| Argument | Taper | Requis | Description |
|---|---|---|---|
| options | object | false | Options de configuration (aucune option prise en charge actuellement) |
sentiment.analyze(phrase, [options], [callback])| Argument | Taper | Requis | Description |
|---|---|---|---|
| phrase | string | true | Phrase d'entrée pour analyser |
| options | object | false | Options (voir ci-dessous) |
| rappel | function | false | Si spécifié, le résultat est renvoyé à l'aide de cette fonction de rappel |
options Propriétés des objets:
| Propriété | Taper | Défaut | Description |
|---|---|---|---|
| langue | string | 'en' | Langue à utiliser pour l'analyse des sentiments |
| extras | object | {} | Ensemble d'étiquettes et leurs valeurs associées à ajouter ou à écraser |
sentiment.registerLanguage(languageCode, language)| Argument | Taper | Requis | Description |
|---|---|---|---|
| Languagecode | string | true | Code international à deux chiffres pour la langue à ajouter |
| langue | object | true | Module linguistique (voir l'ajout de nouvelles langues) |
Afinn est une liste de mots évalués pour la valence avec un entier entre moins cinq (négatifs) et plus cinq (positifs). L'analyse des sentiments est effectuée en reversant les jetons de chaîne (mots, emojis) avec la liste afinn et en obtenant leurs scores respectifs. Le score comparatif est simplement: sum of each token / number of tokens . Ainsi, par exemple, prenons ce qui suit:
I love cats, but I am allergic to them.
Cette chaîne se traduit par ce qui suit:
{
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'
]
} Dans ce cas, l'amour a une valeur de 3, l'allergique a une valeur de -2, et les jetons restants sont neutres avec une valeur de 0. Parce que la chaîne a 9 jetons, le score comparatif résultant ressemble: (3 + -2) / 9 = 0.111111111
Cette approche vous laisse avec un point médian de 0 et les limites supérieures et inférieures sont limitées respectivement à 5 positifs et négatifs (les mêmes que chaque jeton!?). Par exemple, imaginons une chaîne incroyablement "positive" avec 200 jetons et où chaque jeton a un score afinn de 5. Notre score comparatif qui en résulterait ressemblerait à ceci:
(max positive score * number of tokens) / number of tokens
(5 * 200) / 200 = 5
La tokenisation fonctionne en divisant les lignes de chaîne d'entrée, puis en supprimant les caractères spéciaux et en le divisant enfin à l'aide d'espaces. Ceci est utilisé pour obtenir une liste de mots dans la chaîne.
Une motivation principale pour la conception sentiment était la performance. En tant que tel, il comprend un script de référence dans le répertoire de test qui le compare au module sentimental qui fournit une interface et une approche presque équivalentes. Sur la base de ces repères, fonctionnant sur un MacBook Pro avec Node V6.9.1, sentiment est presque deux fois plus rapide que les implémentations alternatives:
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)Pour exécuter les repères vous-même:
npm run test:benchmark Bien que la précision fournie par Afinn soit assez bonne compte tenu de ses performances informatiques (voir ci-dessus), il y a toujours place à amélioration. Par conséquent, le module sentiment est ouvert à l'acceptation des PR qui modifient ou modifient les ensembles de données AFINN / Emoji ou la mise en œuvre étant donné qu'elles améliorent la précision et maintiennent des caractéristiques de performance similaires. Afin d'établir cela, nous testons le module sentiment par rapport à trois ensembles de données étiquetés fournis par UCI.
Pour exécuter les tests de validation vous-même:
npm run test:validate Amazon: 0.726
IMDB: 0.765
Yelp: 0.696
npm test