
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рд╡рд┐рд╖рдп рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡реНрдпрдХреНрддрд┐ рд╣реВрдВ рдФрд░ рдореИрдВ рд╕реБрдВрджрд░ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ рддрдирд╛рд╡ рдХреЗ рдЫреВрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдЬ рд╣рдо рдкрд╛рда рдХреА рднрд╛рд╡реБрдХрддрд╛ / рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ "рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕" рдмрдирд╛рдПрдВрдЧреЗред рдФрд░ рдорд╛рдорд▓рд╛, рдХреБрдЫ рдФрд░ рд░реЛрдЪрдХ рдмрд╛рддреЗрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдХрд╛рдИрдиреЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкрд╛рдареНрдп рдЕрдкреАрд▓ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреАред
рдкрд░рд┐рдЪрдп
рдХреНрдпреЛрдВ? рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрди рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдереЛрдбрд╝рд╛ рд╣реЛрд╢рд┐рдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдВ рдФрд░ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдкрд╛рда рдХреА рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА рдХреНрдпрд╛ рд╣реИ?
рдЯреЗрдХреНрд╕реНрдЯ рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг (рд╕реЗрдВрдЯреАрдореЗрдВрдЯ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕, рдЗрдВрдЧреНрд▓рд┐рд╢ рд╕реЗрдВрдЯреАрдореЗрдВрдЯ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕, рдЗрдВрдЧреНрд▓рд┐рд╢ рдУрдкрд┐рдирд┐рдпрди рдорд╛рдЗрдирд┐рдВрдЧ) - рдХрдВрдкреНрдпреВрдЯрд░ рднрд╛рд╖рд╛рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ, рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд▓реЗрдЦрдХреЛрдВ рдХреА рднрд╛рд╡рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд░рдВрдЧреАрди рд╢рдмреНрджрд╛рд╡рд▓реА рдФрд░ рд▓реЗрдЦрдХреЛрдВ (рд╡рд┐рдЪрд╛рд░реЛрдВ) рдХреЗ рднрд╛рд╡рдирд╛рддреНрдордХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреЛ рдкрд╛рда рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рд╡рд╕реНрддреБ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рдПрдХ рд╡рд╕реНрддреБ, рдПрдХ рдШрдЯрдирд╛, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдЙрдирдХреЗ рдЧреБрдг / рдЧреБрдг), рдкрд╛рда рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЧрдП рдПрдХ рдмрдпрд╛рди рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рднрд╛рд╡рдирд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рднрд╛рд╡рдирд╛рддреНрдордХ рдШрдЯрдХ, рдЬреЛ рд▓реЗрдХреНрд╕реЗрдо рдпрд╛ рд╕рдВрдЪрд╛рд░реА рдЕрдВрд╢ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА (рдпрд╛ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╕реЗрдВрдЯрд┐рдореЗрдВрдЯ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реЗ рдкрд╛рда рдХреА рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдЯреЛрдиреЗрд▓рд┐рдЯреА (рдпреЛрдЧ) рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛
рдХреНрдпреЛрдВ?
рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдХреНрд╕рд░ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдЬрд╡рд╛рдм рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╕рд╡рд╛рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЪрд▓реЛ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ - рдкрд╛рда рдХреА рдХреБрдВрдЬреА рд╣рдореЗрдВ "рдкрд╛рда рдХреЗ рдореВрдб" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдпрд╣рд╛рдБ рдЖрдУ, рддреБрдореНрд╣рд╛рд░реА рдорд╛рдБ ..." рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВред "рд╣рдиреА, рдореИрдВ рдШрд░ рд╣реВрдБ" - рдереЛрдбрд╝реА рдмреЗрд╣рддрд░, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред

рдЖрдк рдЗрд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдорд╛рдЪрд╛рд░реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ, рдирдХрд╛рд░рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ, рд╕рдореАрдХреНрд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рдж рд░реЗрдЯрд┐рдВрдЧ рдмрдирд╛рдиреЗ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдЪреВрдВрдХрд┐ рд╣рдо Node.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрд▓рд╛ рд▓реЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
npm install -g express-generator
рдПрдХреНрд╕рдкреНрд░реЗрд╕-рдЬрдирд░реЗрдЯрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рдХрд╛ рдХреНрд░рд┐рдПрдХреНрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рд╣реИ ред
рд╣рдо node_nlp
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:
express node_nlp --no-view
рдЖрдк npx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд┐рдЫрд▓реЗ рджреЛ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
npx express-generator node_nlp --no-view
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ, рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:
cd node_nlp npm install npm start
рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо nodemon
рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ nodemon
:
npm install --save nodemon
рдкреИрдХреЗрдЬ рдореЗрдВ рд▓рдШреБ рд╕рдВрдкрд╛рджрди
"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
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЬреЛ text
рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ body
рд▓реЗрддрд╛ рд╣реИред
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдпрджрд┐ рдЖрдк, рдореЗрд░реА рддрд░рд╣, рдХрд┐рд╕реА рддрд░рд╣ рд░рдЪрдирд╛ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрдП рд╣реИрдВ рд╕реНрдХрд╛рдИрдиреЗрдЯ , рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рддреИрдпрд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд┐рддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╢реЛрд░ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рд╕реНрдкреАрдХрд░ рдХреА рдУрд░ рди рдЬрд╛рдПрдВ, "рдареАрдХ рд╣реИ, рдЕрдкрдиреА рдорд╛рдБ рдХреЗ рдпрд╣рд╛рдБ рдЖрдУ ..."ред
рдХрдЯреМрддреА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛

рдЪреВрдБрдХрд┐ microservice рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреА рдЖрдЬ рдХреА рд░рд╛рдд рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд▓рдЧреА рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрддреАрдХрд░рдг рдХреЛ рдореИрдВ рдХреИрд╕реЗ рдХрд░реВрдВ, рдЖрдк рдореИрдВ рд╣реВрдВ, рдЖрдк рд╣реИрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо 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;
рдкрд╛рда рдХреЛ рд▓реЛрдЕрд░рдХреЗрд╕ (рд▓реЛрдЕрд░рдХреЗрд╕) рдореЗрдВ рдмрджрд▓реЗрдВ
рдпрд╣рд╛рдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдпрд╣рд╛рдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рд╕реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг рдкрд╛рда рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╣реЛред
const casedReview = lexedText.toLowerCase();
рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдг рд╣рдЯрд╛рдПрдВ
рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рдЕрдЧрд▓реЗ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд╣рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдЖрдЬ рд░рд╛рдд @ # $% ^ # рдРрд╕реЗ рд╡рд░реНрдг рдХреНрдпрд╛ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдкрддреНрд░ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
рд╣рдо рдорд╛рдирдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - replace()
:
const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '')
tokenization
рдЯреЛрдХрдирд╛рдЗрдЬреЗрд╢рди рдкрд╛рда рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж рд╡рд╛рдХреНрдп рдЯреЛрдХрди рд╣реИ, рдФрд░ рд╡рд╛рдХреНрдп, рдмрджрд▓реЗ рдореЗрдВ, рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЯреЛрдХрди рд╣реИред
рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдШреЛрдбрд╝рд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рджреГрд╢реНрдп рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдЗрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ, рд╣рдореЗрдВ WordTokenizer
рдЯреЛрдХрди WordTokenizer
:
... const { WordTokenizer } = natural; const tokenizer = new WordTokenizer(); const tokenizedReview = tokenizer.tokenize(alphaOnlyReview); ...
рдмрдЧ рдареАрдХ рдХрд░рддрд╛ рд╣реИ
рдЪреВрдВрдХрд┐ рдкрд╛рда рдХрд╣реАрдВ рд╕реЗ рднреА рдЖ рд╕рдХрддрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдореМрдХрд╛ рд╣реИред рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╡рд░реНрддрдиреА-рд╕реБрдзрд╛рд░рдХ рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред
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;
рд╕реНрдЯреЙрдк рд╢рдмреНрдж рд╣рдЯрд╛рдПрдВ

рд╢рдмреНрджреЛрдВ рдХреЛ рд░реЛрдХреЗрдВ, рдпреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рдмреНрдж рдкрд░рдЬреАрд╡реА рд╣реИрдВред рдЦреИрд░, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рдЙрд╣, рдКрдК, рд╣реЗ, рдкрд░рдЬреАрд╡рд┐рдпреЛрдВ рдХреА рддрд░рд╣ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рд╕рддрд╣реА рд╢рдмреНрдж рдЬреЛ рд╣рдорд╛рд░реЗ рдЯреЙрдирд┐рдХ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдХреЛрдИ рдореМрд╕рдо рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕реНрдЯреЙрдкрд╡рд╛рд░реНрдб рдкреИрдХреЗрдЬ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред
const SW = require('stopword'); ... const filteredReview = SW.removeStopwords(tokenizedReview);
рд╕реНрдЯреЗрдорд┐рдВрдЧ (рд╕реНрдЯреЗрдорд┐рдВрдЧ)
рд╕реНрдЯреЗрдорд┐рдВрдЧ рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рджреЗрдирд╛," "рджрд┐рдпрд╛," рдФрд░ "рджреЗрдиреЗ рд╡рд╛рд▓рд╛" рд╕рд░рд▓ рд░реВрдк рдореЗрдВ "рджреЗрдирд╛" рд╣реИред
рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд▓реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ SentimentAnalyzer
рдЬреЛ рд╣рдореЗрдВ Natural
рдкреИрдХреЗрдЬ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХреЗ рд╕рд╛рде рдЯреЛрди рдкрд╛рда рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдо рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪ рдЧрдПред рдЕрдм рд╕реНрдХрд╛рдИрдиреЗрдЯ рд╣рдорд╛рд░реА рдмрд╛рдд рдорд╛рди рд▓реЗрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ SentimentAnalyzer
рдореЗрдВ рдкрд╛рда рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдРрд╕реЗ рд╕рд╣рд┐рд╖реНрдгреБ рд╕рдорд╛рдЬ рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдЯреЛрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреА "рдзреНрд░реБрд╡рддрд╛" рдХреЗ рд╕рд╛рде рд╢рдмреНрджреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рд╢рдмреНрджрдХреЛрд╢ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЕрдЪреНрдЫрд╛" рд╢рдмреНрдж рдореЗрдВ 3 рдХреА рдзреНрд░реБрд╡реАрдпрддрд╛ рд╣реИ, рдФрд░ "рдмреБрд░рд╛" рд╢рдмреНрдж -3 рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрди рд╕рднреА "рдмрд┐рдВрджреБрдУрдВ" рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдкрд╛рда рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫрд╛ рдерд╛, рддрд╛рдХрд┐ рд╣рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рди рд╣реЛред
рдпрджрд┐ рд░реЗрдЯрд┐рдВрдЧ 0 рд╣реИ рддреЛ рдЯреЗрдХреНрд╕реНрдЯ рдкреЙрдЬрд┐рдЯрд┐рд╡ рд╣реИ, рдЕрдЧрд░ рд░реЗрдЯрд┐рдВрдЧ рдкреЙрдЬрд┐рдЯрд┐рд╡ рд╣реИ, рддреЛ рдиреЗрдЧреЗрдЯрд┐рд╡ рдФрд░ рдиреЗрдЧреЗрдЯрд┐рд╡ рдиреНрдпреВрдЯреНрд░рд▓ рд╣реИред
SentimentAnalyzer
3 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ :
- рдкрд╛рда рдХреА рднрд╛рд╖рд╛
- рд╕реНрдЯреНрд░реАрдо рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдирд╣реАрдВ
- рд╢рдмреНрджрдХреЛрд╢ (AFINN, рд╕реЗрдВрдЯрд┐рдХреЙрди, рдкреИрдЯрд░реНрди), рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИ
рдЕрдВрдд рдореЗрдВ рдкрд╛рда рдХреЗ рдЯреЛрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╕рднреА рдЕрдВрддрд┐рдо рдХреЛрдб:
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
рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рднрд╛рд╖рд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрди рд╢рдмреНрджреЛрдВ рдкрд░ Natrual
, Natrual
рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЬреЛ рд╢рдмреНрджрдХреЛрд╢ рд╣рдореЗрдВ Natrual
рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ UI рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХреБрдЫ DevTools рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({text: 'hey'}) })
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)
рдЧрд┐рддреБрдм рд░реЗрдкреЛ
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдордиреЗ рдПрдХ "рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕" рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдкрд╛рда рдХреА рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд╕рд▓реАрдо рдкрд░ рд▓реЗ рдЬрд╛рдПрдВ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рд░реЛрдзреА рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рд╣рдордиреЗ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рднреА рдмрд╛рдд рдХреА рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдПрдХ рдЯрди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╡рд╣реА рдкрдврд╝реЗрдВ