情感是一个节点.js模块,它使用Afinn-165 WordList和表情符号的情感排名对输入文本的任意块进行情感分析。情绪提供了几件事:
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 您可以使用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.5您还可以定义自定义评分策略,以处理否定和强调语言的诸如:
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 您可以通过简单地将密钥/值对注入情感方法来调用:
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])| 争论 | 类型 | 必需的 | 描述 |
|---|---|---|---|
| 选项 | object | false | 配置选项(当前不支持选项) |
sentiment.analyze(phrase, [options], [callback])| 争论 | 类型 | 必需的 | 描述 |
|---|---|---|---|
| 短语 | string | true | 输入短语分析 |
| 选项 | object | false | 选项(请参见下文) |
| 打回来 | function | false | 如果指定,则使用此回调函数返回结果 |
options对象属性:
| 财产 | 类型 | 默认 | 描述 |
|---|---|---|---|
| 语言 | string | 'en' | 用于情感分析的语言 |
| 额外 | object | {} | 一组标签及其相关值以添加或覆盖 |
sentiment.registerLanguage(languageCode, language)| 争论 | 类型 | 必需的 | 描述 |
|---|---|---|---|
| Langualagecode | string | true | 用于添加该语言的国际两位数代码 |
| 语言 | object | true | 语言模块(请参阅添加新语言) |
Afinn是额定值的单词列表,其整数在负五(负)和五个(正)之间。情感分析是通过交叉检查字符串令牌(单词,表情符号)与Afinn列表并获得各自的分数来执行的。比较得分简单: sum of each token / number of tokens 。因此,例如,让我们以以下内容:
I love cats, but I am allergic to them.
该字符串导致以下内容:
{
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'
]
}在这种情况下,爱的值为3,过敏值为-2,其余令牌为中性,值为0。由于字符串具有9个令牌,因此结果比较得分看起来像: (3 + -2) / 9 = 0.111111111
这种方法使您的中点为0,并且上限和下限分别约束为正和负5(与每个令牌相同!?)。例如,让我们想象一个具有200个令牌的“正面”字符串,每个令牌的afinn得分为5。我们由此产生的比较得分看起来像这样:
(max positive score * number of tokens) / number of tokens
(5 * 200) / 200 = 5
令牌化是通过拆分输入字符串的线,然后删除特殊字符,最后使用空格将其拆分来起作用。这用于获取字符串中的单词列表。
设计sentiment的主要动机是表现。因此,它在测试目录中包含一个基准脚本,该脚本将其与情感模块进行比较,该模块提供了几乎等效的接口和方法。基于这些基准测试,在带有节点v6.9.1的MacBook Pro上运行的sentiment几乎是替代实现的两倍:
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)自己运行基准:
npm run test:benchmark考虑到它的计算性能(见上)总有改进的余地,虽然Afinn提供的准确性相当不错。因此, sentiment模块开放,可以接受修改或修改Afinn / emoji数据集或实现的PR,鉴于它们提高了准确性并保持相似的性能特征。为了建立这个问题,我们针对UCI提供的三个标记数据集测试sentiment模块。
自己运行验证测试:
npm run test:validate Amazon: 0.726
IMDB: 0.765
Yelp: 0.696
npm test