Analyse de sentiment de texte sur Node.js


Bonjour à tous. Le sujet est assez intéressant et peut sembler assez difficile à mettre en œuvre. Mais je suis une personne pratique et je veux toucher la belle surtout sans forcer. Aujourd'hui, nous allons faire un "microservice" pour l'analyse de la sentimentalité / tonalité du texte. Et le cas, quelques choses plus intéressantes qui vous aideront à préparer votre appel textuel à Skynet.


Intro


Pourquoi? C'est une très bonne question. Mais avant d'y répondre, soyons un peu plus intelligents et découvrons quelle est l'analyse de la tonalité du texte et quelle est la tonalité?


L'analyse de la tonalité du texte (analyse des sentiments, analyse des sentiments en anglais, exploration des opinions en anglais) est une classe de méthodes d'analyse de contenu en linguistique informatique, conçue pour identifier automatiquement dans les textes le vocabulaire émotionnellement coloré et l'évaluation émotionnelle des auteurs (opinions) en relation avec les objets, la parole qui va dans le texte.

La tonalité est l'attitude émotionnelle de l'auteur d'une déclaration à un objet (un objet du monde réel, un événement, un processus ou leurs propriétés / attributs), exprimée dans le texte. La composante émotionnelle, exprimée au niveau du lexème ou fragment communicatif, est appelée tonalité lexicale (ou sentiment lexical). La tonalité de l'ensemble du texte dans son ensemble peut être définie comme une fonction (dans le cas le plus simple, la somme) de la tonalité lexicale de ses unités (phrases) et des règles de combinaison.

par wikipedia


Pourquoi?


J'ai souvent plus de questions que de réponses en lisant Wikipédia. Simplifions - la clé du texte nous parle de "l'humeur du texte". Par exemple, «Viens ici, ta mère ...» signale que l'auditeur a des problèmes. «Chérie, je suis à la maison» - un peu mieux, mais selon la situation.



Vous pouvez utiliser cette analyse pour rechercher des nouvelles positives, filtrer les commentaires négatifs, créer des évaluations de produits par avis, etc. Je pense que l'idée générale est claire.


Installez le nécessaire


Puisque nous allons utiliser Node.js, nous aurons besoin d'Express. Vous pouvez utiliser n'importe quoi, Express ala bas niveau et non critique pour la tâche.


npm install -g express-generator 

express-generator est une sorte d'application create-react- framework pour Express.


Nous générons l'application dans le dossier node_nlp :


 express node_nlp --no-view 

vous pouvez simplifier les deux dernières commandes en utilisant npx:


 npx express-generator node_nlp --no-view 

Pour démarrer l'application, allez dans le dossier, téléchargez les dépendances et lance:


 cd node_nlp npm install npm start 

Afin de ne pas perdre de temps à redémarrer manuellement le serveur pour chaque changement, nodemon et configurons nodemon :


 npm install --save nodemon 

Modifications mineures dans package.json:


 "dev": "nodemon ./bin/www" 

Et pour le développement, nous utilisons:


 npm run dev 

Mettons tout de suite une multitude de paquets, je vais vous expliquer pourquoi ils sont nécessaires en cours de route. C’est juste un didacticiel différent pour s’efforcer d’être une configuration de projet et j’ai déjà oublié ce que j’écris avec toutes ces npm install .


 npm install --save natural apos-to-lex-form spelling-corrector stopword 


Acheminement


En fait, nous n'aurons qu'un seul point de terminaison, dans le dossier ./routers , il y a un fichier index.js que nous allons 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; 

Un point de terminaison POST simple qui prend un body avec un champ de text .


Traitement


Si vous, comme moi, êtes en quelque sorte entré en contact avec la création skynet , traité les données, vous savez probablement que le processus de préparation est aussi important que le processus de traitement des données. Nous devons minimiser les différents bruits et les erreurs possibles, afin que vous n'iriez pas vers le haut-parleur, "eh bien, viens ici ta mère ...".


Débarrassez-vous des coupures



Étant donné que le microservice sera engagé dans l'analyse de la tonalité de la langue anglaise, nous devons examiner comment transformer des abréviations telles que je suis, vous êtes en je suis, vous êtes.
Pour cela, nous utiliserons 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; 

Convertir le texte en minuscules (minuscules)


Pour que les mots ALLER ICI et venir ici soient perçus de la même manière, vous devez vous assurer que tout le texte est dans un seul registre.


 const casedReview = lexedText.toLowerCase(); 

Supprimer des caractères supplémentaires


Pour la prochaine amélioration de la précision de notre analyse, vous devez supprimer les caractères supplémentaires, il m'est difficile de dire quelle tonalité @ # $% ^ # ces caractères sont. Par conséquent, nous supprimons tous les inutiles et ne laissons que des lettres.
Nous utilisons la fonction JavaScript standard - replace() :


 const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '') 

Tokenisation


La tokenisation est le processus de décomposition du texte en composants individuels. Par exemple, le mot est le jeton de phrase et la phrase, à son tour, est le jeton de paragraphe.


Ici, notre cheval principal Natural se précipite dans la scène.
Dans ce package, nous sommes fournis avec l' WordTokenizer WordTokenizer:


 ... const { WordTokenizer } = natural; const tokenizer = new WordTokenizer(); const tokenizedReview = tokenizer.tokenize(alphaOnlyReview); ... 

Corrections de bugs


Comme le texte peut provenir de n'importe où, il y a un risque d'erreurs. Nous devons essayer de les réparer. Le correcteur orthographique nous y aidera.


 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; 

Supprimer les mots vides



Arrêtez les mots, ce sont des mots parasites. Eh bien, pour ainsi dire, euh, ouu, hé, pas comme des parasites, mais juste des mots superflus qui ne font absolument aucun temps pour notre tonique. Avec la suppression de ces mots, le paquet de mots vides nous aidera.


 const SW = require('stopword'); ... const filteredReview = SW.removeStopwords(tokenizedReview); 

Stemming


La racine est le processus de normalisation des mots. Par exemple, «donner», «donner» et «donner» sous la forme simple «donner».
Nous ne considérerons pas cela comme une étape distincte, car le SentimentAnalyzer qui nous fournit le package Natural peut le faire pour nous.


Analyse du texte de tonalité avec Natural


C’est tout! Nous y sommes arrivés. Skynet va maintenant accepter la nôtre et tout comprendre. Il est temps d'alimenter le texte dans SentimentAnalyzer et de comprendre si nous semblons positifs dans une société aussi tolérante ou non.


L'analyse de tonalité fonctionne de manière assez complexe. Le paquet naturel a son propre dictionnaire de mots avec la "polarité" des mots. Par exemple, le mot «bon» a une polarité de 3 et le mot «mauvais» est -3. En fait, tous ces «points» sont résumés et normalisés en fonction de la taille de la proposition. Par conséquent, en fait, nous avons tant fait pour éliminer notre texte de tout ce qui était superflu, afin que rien ne nous empêche d'obtenir une évaluation adéquate.
Le texte est positif si la note est positive, négatif s'il est négatif et neutre si nous obtenons 0.


SentimentAnalyzer accepte 3 paramètres :


  • Langue du texte
  • Diffuser ou ne pas diffuser
  • Dictionnaire (AFINN, Senticon, Pattern), il est intégré

Tout le code final avec analyse du ton du texte à la fin:


 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; 

Nous avons ajouté de nouvelles lignes. Destruction natural , pour obtenir les outils dont nous avons besoin, nous avons créé une variable pour l'analyseur et affecté le résultat à l' analysis variables.
Les paramètres du SentimentAnalyzer sont relativement évidents. La langue est l'anglais comme texte que nous traitons en anglais. Tamponner les mots que j'ai mentionnés ci-dessus et le dictionnaire qui nous est fourni par le package Natrual .


Je voudrais faire une interface utilisateur pour ce cas, mais vous pouvez le tester dans quelques DevTools:


 fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({text: 'hey'}) }) // {"analysis":0} fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({text: 'hey f*** you'}) }) // {"analysis":-2} fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({text: 'hey love you'}) }) // {"analysis":1} 

Comme nous le voyons, cela fonctionne :)


Github repo


Conclusion


Dans cet article, nous avons créé un "microservice" qui analyse la tonalité du texte. Amenez-le à n'importe quelle épreuve de force et analysez ce que disent vos adversaires. Nous avons également abordé le sujet de la préparation des données et installé une tonne de dépendances. Merci de votre attention!


Lisez la même chose


Source: https://habr.com/ru/post/fr486036/


All Articles