Package Exports
- Barfer
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (Barfer) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Barfer
This module provides a set of NLP tools, using other modules, to find various things:
- Sentiment (English and Spanish) using trigrams and bigrams
- Emoji sentiment
- Intention
- Topics
- Context
- Discover language (defaults to a white-list of eng, spa, por, fra and ger)
Changes
* 1.2.4 - Improved stopwords and sentiment, general system speed improvement
* 1.2.0 - Added more default taggers
* 1.1.1 - Fixing some bugs
* 1.1.0 - Overhaul to the core, removed a couple of modules, simplified logic, and, optimized parsingHow to use
Start Barfer
const barfer = new Barfer( {
lang:
{
whitelist: [ 'spa' ] // works best when focused in one single language for now...
// whitelist: [ 'eng', 'spa' ]
},
} );Additional configuration options
const conf = {
// process data as Twitter data
twitter: true,
// enable morphing into ascii only characters.
latinize: true,
// define a very important target/topic
target: 'some name',
// add interesting topics for the tagger.
interesting: [ 'some', 'other' ],
// set this to an empty array if you want to surpass the white-list
lang:
{
whitelist: [ 'eng', 'spa', 'por', 'fra', 'ger' ]
},
};Implement a term
// this term is a default in Barfer
barfer.addParameter( ( tokens ) => {
const match = /^(car|bus|metro|train|plane|boat|taxi|bike|bicicle)\b/igm.exec(tokens.rest());
if ( match !== null )
{
return {
tag: 'vehicles',
length: match[ 0 ].length,
data: match[ 0 ].toLowerCase()
};
}
} );
Study
const data = barfer.study( twit, ( err, data ) => {
// data is full of rich data!
} );Output
{
str: 'rt @jonbershad: @realdonaldtrump fun. so you won\'t be giving us a date when you\'ll be discussing your massive conflicts of interest?',
lang: 'eng',
topics:
[ { count: 135,
length: 10,
stem: 'discuss',
text: 'discussing',
weight: 9.64,
action: true,
topic: true },
{ count: 134,
length: 6,
stem: 'give',
text: 'giving',
weight: 9.57,
stopword: true,
action: true,
topic: true },
{ count: 59,
length: 9,
stem: 'conflict',
text: 'conflicts',
weight: 4.21,
topic: true,
sentiment: -2,
negative: true },
{ count: 35,
length: 7,
stem: 'massiv',
text: 'massive',
weight: 2.5,
topic: true },
{ count: 34,
length: 6,
stem: 'youll',
text: 'youll',
weight: 2.42,
stopword: true,
topic: true },
{ count: 29,
length: 9,
stem: 'interest',
text: 'interest',
weight: 2.07,
stopword: true,
topic: true,
sentiment: 1,
positive: true },
[length]: 6 ],
tagger:
{
actions:
{
tag: 'actions',
words:
{
giving: { text: 'giving', count: 1, action: true },
discussing: { text: 'discussing', count: 1, action: true }
}
},
topics:
{
tag: 'topics',
words:
{
giving: { text: 'giving', data: { index: 0 } },
youll: { text: 'youll', data: { index: 0 } },
discussing: { text: 'discussing', data: { index: 0 } },
massive: { text: 'massive', data: { index: 0 } },
conflicts: { text: 'conflicts', data: { index: 1 } },
interest: { text: 'interest', data: { index: 2 } }
}
},
positive:
{
tag: 'positive',
words:
{
interest:
{
text: 'interest',
data: [ 'massive', 'conflicts', [length]: 2 ] }
}
},
negative:
{ tag: 'negative',
words:
{
conflicts:
{
text: 'conflicts',
data: [ 'massive', 'interest', [length]: 2 ] } }
}
},
rest: [ 'discussing', 'massive', [length]: 2 ],
sentiment:
{
polarity: -1,
positive: { score: 1, words: [ 'interest', [length]: 1 ] },
negative: { score: -2, words: [ 'conflicts', [length]: 1 ] } },
emojiSentiment:
{
polarity: 0,
positive: { score: 0, emoji: [ [length]: 0 ] },
negative: { score: 0, emoji: [ [length]: 0 ] }
},
twitter:
{
parsedAt: 1481743750671,
mentions: [ 'jonbershad', 'realdonaldtrump', [length]: 2 ],
hashtags: [ [length]: 0 ],
cashtags: [ [length]: 0 ],
replies: [ [length]: 0 ],
urls: [ [length]: 0 ]
},
wordMap:
{ '@jonbershad':
{ count: 5,
length: 12,
stem: '@jonbershad',
text: '@jonbershad',
weight: 0.35,
rest: true,
mention: true },
'@realdonaldtrump':
{ count: 5,
length: 16,
stem: '@realdonaldtrump',
text: '@realdonaldtrump',
weight: 0.35,
rest: true,
mention: true },
fun: { count: 1, length: 4, stem: 'fun', text: 'fun', weight: 0.07 },
you: { count: 1, length: 3, stem: 'you', text: 'you', weight: 0.07 },
wont:
{ count: 1,
length: 5,
stem: 'wont',
text: 'wont',
weight: 0.07,
stopword: true },
giving:
{ count: 134,
length: 6,
stem: 'give',
text: 'giving',
weight: 9.57,
stopword: true,
action: true,
topic: true },
date:
{ count: 1,
length: 4,
stem: 'date',
text: 'date',
weight: 0.07,
stopword: true },
when:
{ count: 1,
length: 4,
stem: 'when',
text: 'when',
weight: 0.07,
stopword: true },
youll:
{ count: 34,
length: 6,
stem: 'youll',
text: 'youll',
weight: 2.42,
stopword: true,
topic: true },
discussing:
{ count: 135,
length: 10,
stem: 'discuss',
text: 'discussing',
weight: 9.64,
action: true,
topic: true },
your:
{ count: 1,
length: 4,
stem: 'your',
text: 'your',
weight: 0.07,
stopword: true },
massive:
{ count: 35,
length: 7,
stem: 'massiv',
text: 'massive',
weight: 2.5,
topic: true },
conflicts:
{ count: 59,
length: 9,
stem: 'conflict',
text: 'conflicts',
weight: 4.21,
topic: true,
sentiment: -2,
negative: true },
interest:
{ count: 29,
length: 9,
stem: 'interest',
text: 'interest',
weight: 2.07,
stopword: true,
topic: true,
sentiment: 1,
positive: true }
}
}Note
This is proof of concept still, but I'm working regularly in improving it.
See test/index.js for more example in how to use Barfer.
Tests
Run VERBOSE=true npm test to run tests and see all data output
And npm test just to run the tests.
License
See LICENSE for license info