
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'}) })
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