El sentimiento es un módulo Node.js que utiliza la clasificación de sentimientos de la lista de palabras AFINN-165 y emoji para realizar un análisis de sentimientos en bloques arbitrarios del texto de entrada. El sentimiento proporciona varias cosas:
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 Puede agregar soporte para un nuevo idioma registrándolo utilizando el método de 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.5También puede definir estrategias de puntuación personalizadas para manejar cosas como la negación y el énfasis en una base por idioma:
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 Puede agregar y/o sobrescribir valores de AFINN simplemente inyectando pares de clave/valor en una llamada de método de sentimiento:
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 | Requerido | Descripción |
|---|---|---|---|
| opción | object | false | Opciones de configuración (no hay opciones admitidas actualmente) |
sentiment.analyze(phrase, [options], [callback])| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
| frase | string | true | Frase de entrada para analizar |
| opción | object | false | Opciones (ver más abajo) |
| llamar de vuelta | function | false | Si se especifica, el resultado se devuelve utilizando esta función de devolución de llamada |
options Propiedades del objeto:
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
| idioma | string | 'en' | Lenguaje para usar para el análisis de sentimientos |
| extras | object | {} | Conjunto de etiquetas y sus valores asociados para agregar o sobrescribir |
sentiment.registerLanguage(languageCode, language)| Argumento | Tipo | Requerido | Descripción |
|---|---|---|---|
| lenguaje | string | true | Código internacional de dos dígitos para que el idioma agregue |
| idioma | object | true | Módulo de idioma (ver Agregar nuevos idiomas) |
Afinn es una lista de palabras clasificadas para valencia con un entero entre menos cinco (negativo) y más cinco (positivo). El análisis de sentimientos se realiza mediante la verificación cruzada de los tokens de cadena (palabras, emojis) con la lista Afinn y obteniendo sus respectivos puntajes. La puntuación comparativa es simplemente: sum of each token / number of tokens . Entonces, por ejemplo, tomemos lo siguiente:
I love cats, but I am allergic to them.
Esa cadena da como resultado lo siguiente:
{
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'
]
} En este caso, el amor tiene un valor de 3, alérgico tiene un valor de -2, y los tokens restantes son neutrales con un valor de 0. Debido a que la cadena tiene 9 tokens, la puntuación comparativa resultante parece: (3 + -2) / 9 = 0.111111111
Este enfoque lo deja con un punto medio de 0 y los límites superior e inferior están limitados a positivo y negativo 5 respectivamente (¡lo mismo que cada token!). Por ejemplo, imaginemos una cadena increíblemente "positiva" con 200 tokens y donde cada ficha tiene una puntuación AFINN de 5. Nuestro puntaje comparativo resultante se vería así:
(max positive score * number of tokens) / number of tokens
(5 * 200) / 200 = 5
La tokenización funciona dividiendo las líneas de la cadena de entrada, luego eliminando los caracteres especiales y finalmente dividiéndolo usando espacios. Esto se usa para obtener una lista de palabras en la cadena.
Una motivación principal para diseñar sentiment fue el rendimiento. Como tal, incluye un script de referencia dentro del directorio de prueba que lo compara con el módulo sentimental que proporciona una interfaz y enfoque casi equivalentes. Basado en estos puntos de referencia, que se ejecuta en un MacBook Pro con el nodo V6.9.1, sentiment es casi el doble que las implementaciones 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 ejecutar los puntos de referencia usted mismo:
npm run test:benchmark Si bien la precisión proporcionada por AFINN es bastante buena teniendo en cuenta su rendimiento computacional (ver arriba), siempre hay margen de mejora. Por lo tanto, el módulo sentiment está abierto a aceptar PRS que modifican o modifican los conjuntos de datos o implementación AFINN / Emoji dado que mejoran la precisión y mantienen características de rendimiento similares. Para establecer esto, probamos el módulo sentiment en tres conjuntos de datos etiquetados proporcionados por UCI.
Para ejecutar las pruebas de validación usted mismo:
npm run test:validate Amazon: 0.726
IMDB: 0.765
Yelp: 0.696
npm test