Análise de sentimento de texto no Node.js


Olá pessoal. O tópico é bastante interessante e pode parecer bastante difícil de implementar. Mas sou uma pessoa prática e quero tocar o belo especialmente sem forçar. Hoje faremos um "microsserviço" para a análise da sentimentalidade / tonalidade do texto. E o caso, algumas coisas mais interessantes que ajudarão você a preparar seu apelo textual para a Skynet.


Introdução


Porque Esta é uma pergunta muito boa. Mas antes de responder, vamos ficar um pouco mais inteligentes e descobrir qual é a análise da tonalidade do texto e qual é a tonalidade?


A análise da tonalidade do texto (análise de sentimentos, análise de sentimentos em inglês, mineração de opiniões em inglês) é uma classe de métodos de análise de conteúdo em linguística de computador, projetada para identificar automaticamente em textos vocabulário colorido emocionalmente e avaliação emocional de autores (opiniões) em relação a objetos, fala que aparece no texto.

Tonalidade é a atitude emocional do autor de uma declaração em relação a um objeto (um objeto do mundo real, evento, processo ou suas propriedades / atributos), expresso no texto. O componente emocional, expresso no nível do léxico ou fragmento comunicativo, é chamado tonalidade lexical (ou sentimento lexical). A tonalidade de todo o texto como um todo pode ser definida como uma função (no caso mais simples, a soma) da tonalidade lexical de suas unidades (frases) e as regras para combiná-las.

por wikipedia


Porque


Muitas vezes tenho mais perguntas do que respostas lendo a Wikipedia. Vamos simplificar - a chave do texto nos fala sobre o "humor do texto". Por exemplo, "Venha aqui, sua mãe ..." indica que o ouvinte está com problemas. "Querida, estou em casa" - um pouco melhor, mas de acordo com a situação.



Você pode usar essa análise para procurar notícias positivas, filtrar comentários negativos, criar classificações de produtos por comentários e assim por diante. Eu acho que a ideia geral é clara.


Instale o necessário


Como vamos usar o Node.js, precisaremos do Express. Você pode usar qualquer coisa, Expresse um nível baixo e não seja crítico para a tarefa.


npm install -g express-generator 

express-generator é um tipo de aplicativo de criação e reação para o framework Express.


node_nlp o aplicativo na pasta node_nlp :


 express node_nlp --no-view 

você pode simplificar os dois últimos comandos usando npx:


 npx express-generator node_nlp --no-view 

Para iniciar o aplicativo, vá para a pasta, baixe as dependências e ative:


 cd node_nlp npm install npm start 

Para não perder tempo reinicializando manualmente o servidor para cada alteração, vamos nodemon e configurar o nodemon :


 npm install --save nodemon 

Edições menores no package.json:


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

E para o desenvolvimento usamos:


 npm run dev 

Vamos colocar um monte de pacotes imediatamente, vou lhe dizer por que eles são necessários ao longo do caminho. É apenas um tutorial diferente para se esforçar para ser uma configuração do projeto e eu já esqueci o que estou escrevendo com todas essas npm install .


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


Encaminhamento


De fato, teremos apenas um ponto de extremidade; na pasta ./routers , há um arquivo index.js que o destruiremos:


 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; 

Um ponto de extremidade POST simples que aceita um body com um campo de text .


Processamento


Se você, como eu, de alguma forma entrou em contato com a criação skynet , processou os dados, você provavelmente sabe que o processo de preparação é tão importante quanto o processo de processamento de dados. Precisamos minimizar vários ruídos e possíveis erros, para que você não vá em direção ao alto-falante "bem, venha aqui sua mãe ...".


Livre-se dos cortes



Como o microsserviço se dedica à análise da tonalidade do idioma inglês, precisamos considerar como transformar abreviações como eu sou, você é e você é.
Para isso, usaremos a forma apos-para-lex


 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; 

Converter texto em minúsculas (minúsculas)


Para que as palavras IR AQUI e venham aqui sejam percebidas da mesma maneira, você precisa ter certeza de que o texto inteiro está em um registro.


 const casedReview = lexedText.toLowerCase(); 

Excluir caracteres extras


Para a próxima melhoria na precisão de nossa análise, você deve remover os caracteres extras, é difícil dizer qual é a tonalidade @ # $% ^ # desses caracteres. Portanto, removemos tudo desnecessário e deixamos apenas letras.
Usamos a função JavaScript padrão - replace() :


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

Tokenização


Tokenização é o processo de dividir o texto em componentes individuais. Por exemplo, a palavra é o símbolo da frase e a frase, por sua vez, é o símbolo do parágrafo.


Aqui nosso cavalo principal Natural corre para a cena.
Neste pacote, somos fornecidos com a WordTokenizer tokenização do WordTokenizer :


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

Correções de bugs


Como o texto pode vir de qualquer lugar, há uma chance de erros. Precisamos tentar consertá-los. O corretor ortográfico nos ajudará com isso.


 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; 

Excluir palavras de parada



Pare de palavras, estes são alguns tipos de palavras parasitas. Bem, por assim dizer, não como parasitas, mas apenas palavras supérfluas que não fazem absolutamente nenhum tempo para o nosso tônico. Com a remoção de tais palavras, o pacote de palavras irrelevantes nos ajudará.


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

Stemming


Stemming é o processo de normalizar palavras. Por exemplo, "dar", "deu" e "doador" na forma simples "dar".
Não tomaremos isso como uma etapa separada, pois o SentimentAnalyzer que nos fornece o pacote Natural pode fazer isso por nós.


Análise de texto por tom com Natural


Isso é tudo! Chegamos lá. Agora a Skynet aceitará a nossa e entenderá tudo. É hora de alimentar o texto no SentimentAnalyzer e entender se parecemos positivos em uma sociedade tão tolerante ou não.


A análise de tons funciona de maneira bastante complexa. O pacote natural possui seu próprio dicionário de palavras com a "polaridade" das palavras. Por exemplo, a palavra "bom" tem uma polaridade de 3 e a palavra "ruim" é -3. De fato, todos esses "pontos" são resumidos e normalizados para o tamanho da proposta. Portanto, de fato, fizemos muito para limpar nosso texto de tudo o que era supérfluo, para que não houvesse nada que nos impedisse de obter uma avaliação adequada.
O texto é positivo se a classificação for positiva, negativo se negativo e neutro se obtivermos 0.


SentimentAnalyzer aceita 3 parâmetros :


  • Idioma do texto
  • Transmitir ou não transmitir
  • Dicionário (AFINN, Senticon, Padrão), é incorporado

Todo o código final com análise de tom do texto no final:


 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; 

Adicionamos algumas novas linhas. Destruição natural , para obter as ferramentas necessárias, criamos uma variável para o analisador e atribuímos o resultado à analysis variáveis.
Os parâmetros do SentimentAnalyzer são relativamente óbvios. O idioma é inglês como o texto que processamos em inglês. Carimbar as palavras que mencionei acima e o dicionário que é fornecido pelo pacote Natrual .


Gostaria de criar uma interface do usuário para este caso, mas você pode testá-lo em alguns 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} 

Como vemos, funciona :)


Repo do Github


Conclusão


Neste artigo, fizemos um "microsserviço" que analisa a tonalidade do texto. Leve-o a qualquer confronto e analise o que seus oponentes estão dizendo. Também abordamos o tópico de preparação de dados e instalamos várias dependências. Obrigado pela atenção!


Leia o mesmo


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


All Articles