
Hello everyone. The topic is quite interesting and may seem rather difficult to implement. But I am a practical person and I want to touch the beautiful especially without straining. Today we will make a "microservice" for the analysis of sentimentality / tonality of the text. And the case, some more interesting things that will help you to prepare your textual appeal to Skynet.
Intro
? . , , ?
́ ́ ́ (-, . Sentiment analysis, . Opinion mining) — - , () , .
— ( , , /), . , , ( ). ( ) () .
by wikipedia
?
. — " ". " ..." . ", " — , .

, , . .
Node.js, Express. , Express low level .
npm install -g express-generator
express-generator — create-react-app Express .
node_nlp:
express node_nlp --no-view
npx:
npx express-generator node_nlp --no-view
, :
cd node_nlp
npm install
npm start
, , nodemon:
npm install --save nodemon
package.json:
"dev": "nodemon ./bin/www"
:
npm run dev
, . npm install.
npm install --save natural apos-to-lex-form spelling-corrector stopword

, ./routers, index.js :
const express = require('express');
const natural = require('natural');
const router = express.Router();
router.post('/', function(req, res, next) {
  const { text } = req.body;
});
module.exports = router;
POST body text.
, - 

"" , I’m, you’re I am, you are.
apos-to-lex-form
const express = require('express');
const natural = require('natural');
const aposToLexForm = require('apos-to-lex-form')
const router = express.Router();
router.post('/', function(req, res, next) {
  const { text } = req.body;
  const lexedText = aposToLexForm(text);
});
module.exports = router;
lowercase ( )
, , , .
const casedReview = lexedText.toLowerCase();
, , @#$%^# . .
JavaScript — replace():
const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '')
. , .
Natural.
WordTokenizer:
...
const { WordTokenizer } = natural;
const tokenizer = new WordTokenizer();
const tokenizedReview = tokenizer.tokenize(alphaOnlyReview);
...
, . . spelling-corrector.
const express = require('express');
const natural = require('natural');
const aposToLexForm = require('apos-to-lex-form');
const SpellCorrector = require('spelling-corrector');
const router = express.Router();
const spellCorrector = new SpellCorrector();
spellCorrector.loadDictionary();
router.post('/', function(req, res, next) {
  const { text } = req.body;
  const lexedText = aposToLexForm(text);
  const casedReview = lexedText.toLowerCase();
  const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '')
  const { WordTokenizer } = natural;
  const tokenizer = new WordTokenizer();
  const tokenizedReview = tokenizer.tokenize(alphaOnlyReview);
  tokenizedReview.forEach((word, index) => {
    tokenizedReview[index] = spellCorrector.correct(word);
  });
});
module.exports = router;

, . , , , , , , . stopword.
const SW = require('stopword');
...
const filteredReview = SW.removeStopwords(tokenizedReview);
(Stemming)
, . “giving,” “gave,” and “giver” “give”.
, SentimentAnalyzer Natural, .
Natural
! . . SentimentAnalyzer , .
. Natural "" . "good" 3, "bad" -3. "" . , .
, 0.
SentimentAnalyzer 3 :
- (AFINN, Senticon, Pattern),
:
const express = require('express');
const natural = require('natural');
const aposToLexForm = require('apos-to-lex-form');
const SpellCorrector = require('spelling-corrector');
const SW = require('stopword');
const router = express.Router();
const spellCorrector = new SpellCorrector();
spellCorrector.loadDictionary();
router.post('/', function(req, res, next) {
  const { text } = req.body;
  const lexedText = aposToLexForm(text);
  const casedReview = lexedText.toLowerCase();
  const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '')
  const { WordTokenizer } = natural;
  const tokenizer = new WordTokenizer();
  const tokenizedReview = tokenizer.tokenize(alphaOnlyReview);
  tokenizedReview.forEach((word, index) => {
    tokenizedReview[index] = spellCorrector.correct(word);
  });
  const filteredReview = SW.removeStopwords(tokenizedReview);
  const { SentimentAnalyzer, PorterStemmer } = natural;
  const analyzer = new SentimentAnalyzer('English', PorterStemmer, 'afinn');
  const analysis = analyzer.getSentiment(filteredReview);
  res.status(200).json({ analysis });
});
module.exports = router;
. natural, analysis.
SentimentAnalyzer, . . C , Natrual.
UI , DevTools:
fetch('/', 
 {
   method: 'POST',
   headers: {
     'Content-Type': 'application/json'
   }, 
  body: JSON.stringify({text: 'hey'})
})
fetch('/', 
 {
   method: 'POST',
   headers: {
     'Content-Type': 'application/json'
   }, 
  body: JSON.stringify({text: 'hey f*** you'})
})
fetch('/', 
 {
   method: 'POST',
   headers: {
     'Content-Type': 'application/json'
   }, 
  body: JSON.stringify({text: 'hey love you'})
})
:)
Github repo
"" . , . . !