Text-Stimmungsanalyse auf Node.js


Hallo allerseits. Das Thema ist sehr interessant und scheint schwierig umzusetzen zu sein. Aber ich bin ein praktischer Mensch und möchte das Schöne besonders ohne Anstrengung berühren. Heute werden wir einen "Microservice" für die Analyse der Sentimentalität / Tonalität des Textes erstellen. Und der Fall, einige weitere interessante Dinge, die Ihnen helfen werden, Ihren textlichen Appell an Skynet vorzubereiten.


Intro


Warum? Das ist eine sehr gute Frage. Aber bevor wir darauf antworten, lassen Sie uns ein bisschen schlauer werden und herausfinden, wie die Tonalität des Textes analysiert wird und was die Tonalität ist.


Die Analyse der Texttonalität (Stimmungsanalyse, englische Stimmungsanalyse, englisches Opinion Mining) ist eine Klasse von Methoden zur Inhaltsanalyse in der Computerlinguistik, mit denen in Texten automatisch emotional gefärbtes Vokabular und emotionale Einschätzung von Autoren (Meinungen) in Bezug auf Objekte, Sprache identifiziert werden das geht in den text.

Tonalität ist die emotionale Einstellung des Autors einer Aussage zu einem Objekt (einem Objekt der realen Welt, einem Ereignis, einem Prozess oder ihren Eigenschaften / Attributen), die im Text ausgedrückt wird. Die emotionale Komponente, ausgedrückt auf der Ebene des Lexems oder des kommunikativen Fragments, wird als lexikalische Tonalität (oder lexikalisches Gefühl) bezeichnet. Die Tonalität des gesamten Textes kann als Funktion (im einfachsten Fall die Summe) der lexikalischen Tonalität seiner Einheiten (Sätze) und der Regeln für deren Kombination definiert werden.

von Wikipedia


Warum?


Ich habe oft mehr Fragen als Antworten, wenn ich Wikipedia lese. Lassen Sie uns vereinfachen - der Schlüssel des Textes gibt Auskunft über die "Stimmung des Textes". Zum Beispiel bedeutet "Komm her, deine Mutter ...", dass der Zuhörer Probleme hat. "Schatz, ich bin zu Hause" - ein bisschen besser, aber je nach Situation.



Mithilfe dieser Analyse können Sie nach positiven Nachrichten suchen, negative Kommentare filtern, Produktbewertungen nach Bewertungen erstellen usw. Ich denke, die allgemeine Idee ist klar.


Installieren Sie die erforderlichen


Da wir Node.js verwenden, benötigen wir Express. Sie können alles verwenden, Express ala low level und nicht kritisch für die Aufgabe.


npm install -g express-generator 

Express-Generator ist eine Art Create-React-App für das Express-Framework.


Wir generieren die Anwendung im Ordner node_nlp :


 express node_nlp --no-view 

Sie können die letzten beiden Befehle mit npx vereinfachen:


 npx express-generator node_nlp --no-view 

Um die Anwendung zu starten, gehen Sie in den Ordner, laden Sie die Abhängigkeiten herunter und starten Sie sie:


 cd node_nlp npm install npm start 

Um nicht bei jeder Änderung Zeit für einen manuellen Neustart des Servers zu nodemon und konfigurieren nodemon :


 npm install --save nodemon 

Kleinere Änderungen in package.json:


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

Und für die Entwicklung verwenden wir:


 npm run dev 

Lassen Sie uns gleich einen Arm voll Pakete einpacken, ich sage Ihnen, warum sie unterwegs gebraucht werden. Es ist nur ein anderes Tutorial, um ein Projekt-Setup zu sein, und ich habe bereits vergessen, was ich mit all diesen npm install schreibe.


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


Routing


In der Tat werden wir nur einen Endpunkt haben, im Ordner ./routers gibt es eine index.js Datei, die wir zerkleinern werden:


 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; 

Ein einfacher POST Endpunkt, der einen text mit einem text .


Bearbeitung


Wenn Sie, wie ich, irgendwie mit der Schöpfung in Kontakt gekommen sind Skynet Wenn Sie die Daten verarbeitet haben, wissen Sie wahrscheinlich, dass der Vorbereitungsprozess genauso wichtig ist wie der Datenverarbeitungsprozess. Wir müssen verschiedene Geräusche und mögliche Fehler minimieren, damit Sie nicht auf den Sprecher zugehen. "Nun, kommen Sie her, Ihre Mutter ...".


Schnitte loswerden



Da der Microservice mit der Analyse der Tonalität der englischen Sprache befasst sein wird, müssen wir uns überlegen, wie man solche Abkürzungen umdreht, wie ich, du, ich bin, du bist.
Hierfür verwenden wir die 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; 

Text in Kleinbuchstaben umwandeln


Damit die Wörter HIER GEHEN und hierher kommen, müssen Sie sicherstellen, dass sich der gesamte Text in einem Register befindet.


 const casedReview = lexedText.toLowerCase(); 

Löschen Sie zusätzliche Zeichen


Für die nächste Verbesserung der Genauigkeit unserer Analyse sollten Sie die zusätzlichen Zeichen entfernen. Es fällt mir schwer zu sagen, welche Tonalität @ # $% ^ # solche Zeichen sind. Deshalb entfernen wir alle unnötigen und lassen nur Buchstaben.
Wir verwenden die Standard-JavaScript-Funktion - replace() :


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

Tokenisierung


Tokenisierung ist das Aufteilen von Text in einzelne Komponenten. Beispielsweise ist das Wort das Satzzeichen und der Satz wiederum das Absatzzeichen.


Hier stürzt unser Hauptpferd Natural in die Szene.
In diesem Paket ist das WordTokenizer Tokenisierungstool enthalten:


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

Fehlerbehebungen


Da der Text von überall kommen kann, besteht die Möglichkeit von Fehlern. Wir müssen versuchen, sie zu reparieren. Die Rechtschreibkorrektur hilft uns dabei.


 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; 

Stoppwörter löschen



Stoppen Sie Wörter, diese sind irgendeine Art Wortparasiten. Sozusagen, äh, ouu, hey, nicht wie Parasiten, sondern nur überflüssige Worte, die für unser Tonikum absolut kein Wetter machen. Wenn solche Wörter entfernt werden, hilft uns das Stopword- Paket.


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

Stemming


Stemming ist der Prozess der Normalisierung von Wörtern. Zum Beispiel "Geben", "Geben" und "Geber" in der einfachen Form "Geben".
Wir werden dies nicht als separaten Schritt betrachten, da der SentimentAnalyzer , der uns das Natural Paket zur Verfügung stellt, dies für uns tun kann.


Tontextanalyse mit Natural


Das ist alles! Wir sind dort angekommen. Jetzt wird Skynet unsere akzeptieren und alles verstehen. Es ist Zeit, den Text in SentimentAnalyzer und zu verstehen, ob wir in einer so toleranten Gesellschaft positiv klingen oder nicht.


Die Tonanalyse funktioniert ziemlich kompliziert. Natural Package hat ein eigenes Wörterbuch mit der "Polarität" der Wörter. Zum Beispiel hat das Wort "gut" eine Polarität von 3 und das Wort "schlecht" ist -3. Tatsächlich werden alle diese „Punkte“ zusammengefasst und auf die Größe des Vorschlags normiert. Tatsächlich haben wir also so viel unternommen, um unseren Text von allem Überflüssigen zu befreien, sodass uns nichts daran hindert, eine angemessene Bewertung zu erhalten.
Der Text ist positiv, wenn die Bewertung positiv ist, negativ, wenn negativ und neutral, wenn wir 0 erhalten.


SentimentAnalyzer akzeptiert 3 Parameter :


  • Textsprache
  • Streamen oder nicht streamen
  • Wörterbuch (AFINN, Senticon, Pattern), es ist eingebaut

Aller endgültige Code mit Tonanalyse des Textes am Ende:


 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; 

Wir haben einige neue Zeilen hinzugefügt. Destruction natural , um die Werkzeuge zu erhalten, die wir benötigen, haben wir eine Variable für den Analysator erstellt und das Ergebnis der Variablenanalyse zugewiesen.
Die Parameter des SentimentAnalyzer sind relativ offensichtlich. Die Sprache ist Englisch als der Text, den wir in Englisch verarbeiten. Stempeln der oben genannten Wörter und des Wörterbuchs, das uns vom Natrual Paket zur Verfügung gestellt wird.


Ich möchte eine Benutzeroberfläche für diesen Fall erstellen, aber Sie können sie in einigen DevTools testen:


 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} 

Wie wir sehen, funktioniert es :)


Github Repo


Fazit


In diesem Artikel haben wir einen "Microservice" erstellt, der die Tonalität des Textes analysiert. Nehmen Sie es zu einem Showdown und analysieren Sie, was Ihre Gegner sagen. Wir haben auch das Thema Datenaufbereitung angesprochen und eine Menge Abhängigkeiten installiert. Vielen Dank für Ihre Aufmerksamkeit!


Lies dasselbe


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


All Articles