Nature Language Processing em JavaScript com Natural

PNL, abreviação de Processamento de Linguagem Natural, é um campo da Inteligência Artificial amplamente usado para interpretar, compreender e processar a linguagem humana / natural. É comumente usado para reconhecimento de fala e NLG (Natural Language Generation).

Os recursos mais comuns da PNL são os seguintes:
1. Categorização de conteúdo
2. Extração contextual
3. Análise sentimental
4. Speech-to-text e text-to-speech
5. Sumarização de documentos

Hoje, nesse post, estou explorando a PNL usando Javascript.
Temos muitas libs de PNL disponíveis em JS, onde temos a maioria dos recursos / tarefas de PNL.
Neste post, estaremos mais concentrados na lib natural, mas você pode verificar com outra biblioteca como compromise, node-npl.

Aqui, veremos algumas de suas principais funcionalidades, como tokenização, operações de string e classificador.

Primeiro, temos que instalar a lib do natural:

npm install natural

e depois importa-la:

const natural = require('natural')
  1. O termo Tokenização significa quebrar um string em um array como:
tokenizer.tokenize("Isso é um exemplo de tokenização")["Isso", "é", "um", "exemplo", "de", "tokenização"]

Podemos conseguir isso usando o método String do JS, mas a diferença está além dessa simples tokenização, ela também nos dá a tokenização baseada em maiúsculas e minúsculas, regex, frase e pontuação para qualquer idioma.

2. Uma distância de string conta o número de caracteres diferentes.

console.log('Diferença de String entre Amol e Amol: ', natural.HammingDistance("Amol","Amol" , false));console.log('Diferença de String entre Amol e Anmol: ', natural.HammingDistance("Amol","Anmol" , false));console.log('Diferença de String entre Amol e ABCD: ', natural.HammingDistance("Amol","ABCD" , false));

No exemplo acima, ele simplesmente retorna o número de caracteres não correspondentes.

Ele está ignorando o case, pois definimos o sinalizador como falso, também retornamos -1 se o comprimento da string não for o mesmo.

Ele também oferece suporte para correspondência de String.

3. Um Infletor, para forma de palavra singularizada ou pluralizada,

var nounInflector = new.natural.NounInflector();
console.log('Pluralize: ', nounInflector.pluralize('Programmer'));
console.log('Singular:' , nounInflector.singularize('Developers'));

4. Agora, veremos a parte mais fascinante, Classificadores, treinaremos o classificador com os dados de amostra e obteremos o resultado deles. (Aqui, estamos apenas demonstrando como o classificador funciona em nosso caso, em vez de sua implementação.)

const natural = require('natural');var classifier = new natural.BayesClassifier();// Dados de exemplo
classifier.addDocument('buy stock', 'buy');
classifier.addDocument('buy more', 'buy');
classifier.addDocument('short sell', 'sell');
classifier.addDocument('sell stock', 'sell');
// Dados para Treinoclassifier.train();// Testando com novos dados
console.log('Result for `Today, I buy my first stock`: ', classifier.classify('Today, I buy my first stock'));
console.log('Result for `Yesterday, I brought my first stock`: ', classifier.classify('Today, I brought my first stock'));
console.log('Result for `Tomorrow, I will sell all my stocks`: ', classifier.classify('Tomorrow, I will sell all my stocks'));

E o output:

No exemplo 1, em palavras simples, treinamos o classificador com dados de amostra, fornecemos entrada e saída, portanto, no futuro, se o classificador obtiver um contexto semelhante, ele retornará a saída desejada.

No exemplo acima, definimos a compra / venda de saída em alguns dados de amostra de entrada para que, após o treinamento, quando verificamos com dados diferentes, ela produza compra / venda de acordo com os dados do treino.

A lib natural nos dá mais muita facilidade para trabalhar com PNL.
Da mesma forma, a compromise também é boa, com facilidade quase semelhante, você pode executar o a compromise no NodeJS ou no próprio navegador.

Créditos

Exploring NLP in JavaScript escrito por Amol Kedari

Software Engineer | Front-end Specialist @ Grover (https://rubenmarcus.dev)

Software Engineer | Front-end Specialist @ Grover (https://rubenmarcus.dev)