Introdução a Processamento de Linguagem Natural

Rodrigo Macedo
Ensina.AI
Published in
8 min readNov 2, 2018

--

Fonte: http://www.polisconsulting.com.br/nlp-como-funciona-o-processamento-de-linguagem-natural/

Você já deve ter ouvido falar sobre Processamento de Linguagem Natural (PLN). Não por acaso, essa é uma das áreas que tem empregado muitas pesquisas e estudos em Inteligência Artificial. Temos visto um grande movimento em aplicações de PLN em nosso dia a dia, como por exemplo:

  • Sumarização Automática: Que tal se um algoritmo fosse capaz de fazer um resumo legível de um determinado texto? Pense em artigos que são publicados diariamente num setor financeiro e que podem ser sumarizados através de um algoritmo que realize Processamento de Linguagem Natural.
  • Análise Morfológica e Segmentação de Palavras: A segmentação de palavras não é algo tão trivial, pois temos idiomas diversos, com estruturas diversas. Tome por exemplo, a língua inglesa. Nela as palavras são separadas por espaços em branco, e isso é um padrão para muitas outras línguas, porém há excessões, como o Chinês.
  • Tradução de Linguagem: Esse talvez seja uma das aplicações mais conhecidas. É o tipo de aplicação conhecida como ‘AI Complete’. A tradução envolve vários aspectos como a entonação (quando a tradução tem origem de arquivo de aúdio, a saber, APIs Speech To Text), contexto da linguagem, dentre outras características.
  • Reconhecimento de voz: Outra aplicação muito conhecida. Há quem projete que no futuro, o principal meio de comunicação será via voz. Existem algumas bibliotecas e APIs que reconhecem a voz e traduz texto para que o programa possa realizar alguma tarefa. Inclusive nesse ponto, as assistentes virtuais, como Siri, Alexa, Cortana, dentre outras, tem ganhado muita importância em nosso dia a dia.
  • Chatbots: Há quem diga que muito em breve os chatbots estarão revolucionando o atendimento e marketing digital. É provável que ao interagir com alguma empresa por meio de aplicativos de mensagem, como Slack, Facebook, dentre outros, um bot tenha sido desenvolvido para funcionar em horários que um funcionário não poderia estar atendendo.

Existem uma infinidade de aplicações em PLN que caso fôssemos citar aqui, daria um artigo bem grande, e ainda não chegaríamos em todas as aplicações existentes. Se você parou pra pensar, viu que boa parte dessas aplicações acima citadas, podem facilmente serem atribuídas a um profissional de linguista. E você está certo. Foi com esse estímulo que depois de muita pesquisa e estudos o termo Processamento de Linguagem Natural ganhou força. Notou-se que com o grande potencial de dados disponíveis (Big Data), e com a evolução da computação paralela por meio de GPUs, que os computadores poderiam começar a processar atividades repetitivas, que até então eram feitas por profissionais linguistas em linguagem natural. Apesar disso, ainda temos muito o que evoluir nessa área em relação a outras que já estão mais bem desenvolvidas como a Visão Computacional. Se você, conhecer algum profissional linguista, comente a ele que existem muitas e muitas startups, universidades, e grupos de pesquisa a procura desse tipo de profissional, que irá facilitar ainda mais a qualidade das pesquisas desenvolvidas em PLN. Agora que já entendemos o contexto do nosso tema, fica uma pergunta: O que seria linguagem natural? Pois bem, vamos a alguns exemplos:

  • O conteúdo de um livro é uma fonte de linguagem natural.
  • Quando você conversa com alguém, ouve ou escreve algo, você está usando linguagem natural.
  • Diálogos em filmes, séries, também sao exemplos de linguagem natural.
  • Suas conversas em aplicativos de mensagem, são exemplos de linguagem natural.

Nada que você já não usado ou praticado não é mesmo!? Pois bem, você deve ter pensado na quantidade de dados que produzimos a cada dia e que podem ser levadas para se trabalhar com problemas em Processamento de Linguagem Natural. É por meio, dessa temática, que chegamos a um conceito muito conhecido na área de PLN. O corpus. Uma conceituação para corpus seria:

Conjunto de textos escritos e registros orais em uma determinada língua e que serve como base de análise.

Para fins de comparação, em ciência da computação, um corpus é semelhante a um dataset, entretanto, corpus é mais comentado em PLN, por ser algo mais utilizando na área de linguística. E um conjunto de corpus é chamado de corpora. Ter um corpus é a primeira etapa para iniciar um processo de análise de PLN. E para organizarmos um corpus, precisaremos de dados, e de acordo com a operação que for feita, será necessário muitos dados. Embora não seja o foco desse post, acho interessante comentar que há diversas formas de coleta de dados hoje. São elas:

  • Dados em formato de textos: Dependendo da operação que você realizar, saiba que vários sites disponibilizam um amplo conjuntos de corpus (a maioria em inglês), que podem ser alvos de etapas de um processo de PLN. Sejam dados em pdf, txt, csv, dentre outros.
  • Dados da internet: Você tem a opção também de fazer a raspagem de dados de um site da internet utilizando WebScraping. É interessante ressaltar aqui, que existem alguns sites, em que essa atividade é considerada ilegal, então muito cuidado ao utilizá-la.

Outra alternativa, é montar o próprio corpus com base nos dados pessoais, profissionais e empresariais. Uma ferramenta que pode ser muito útil, sobretudo se você estiver usando a linguagem Python é o NLTK, inclusive, essa é uma das ferramentas mais populares para se trabalhar com PLN. Ainda acerca de PLN, há dois componentes que são considerados no PLN. São eles: NLU e NLG.

Fonte: https://www.re-work.co/blog/the-emergence-of-bring-your-own-agent-byoa

Podemos conceituar ambos os componentes da seguinte forma:

  • NLU (Natural Language Understanding): É considerado o primeiro componente da PLN. É o processo de converter linguagem natural em uma representação útil usando ferramentas linguísticas. Exemplo: Análise de sentimento (positivo ou negativo) de expressões, análise de palavras-chave em um texto, dentre outros.
  • NLG (Natural Language Generation): É considerado o segundo componente da PLN. É o processo de gerar linguagem natural a partir do output de uma máquina. Exemplo: Assistentes virtuais, como Alexa, Siri, Cortana, que respondem de acordo com a forma como foram desenvolvidas com o sistema de Inteligência Artificial. Outro exemplo também comum, é a geração de legendas a partir de um vídeo.

Agora que vimos alguns conceitos relacionados à PLN, vamos praticar um pouco com a linguagem Python, juntamente com a biblioteca NLTK. Se quando estamos iniciando uma etapa de análise num conjunto de dados, é essencial a etapa de análise estatística dos dados, quando estamos num processo de PLN, é essencial entedermos a frequência de distribuição de um determinado corpus. Veja o exemplo a seguir:

Frequência de distribuição de um corpus.

O exemplo acima utiliza a linguagem Python, e utiliza a biblioteca do NLTK, incluindo um dos corpus que a biblioteca possui. Perceba na linha 7 que extraímos alguns corpus, porém o corpus que estaremos analisando é o singles.txt. Na linha 11, capturamos as palavras que esse corpus tem, e na linha 12, calculamos a frequência de distribuição do corpus. O resultado, ao executar o script é esse:

Resulado — Frequência de distribuição corpus.

A próxima etapa que podemos aplicar em nosso corpus, é o Tokenization. Tokenization é o processo de dividir uma string em listas de pedaços ou tokens. Exemplo: Uma palavra é um token em uma sentença, e por sua vez, uma sentença é um token em um parágrafo. Existem várias técnicas variadas para aplicar o Tokenization, vamos demonstrar aqui no artigo, a Tokenization em sentenças e em palavras.

Tokenization de uma sentença.

Perceba no exemplo acima, que estamos utilizando o módulo tokenize do NLTK. Como estamos tokenizando apenas as sentenças, nesse caso, o NLTK vai entender que na nossa frase, o que estiver antes do ponto é uma sentença, e o que estiver depois do ponto, é outra frase.

Resultado — Tokenization de uma sentença.

O próximo exemplo, estaremos trabalhando no mesmo exemplo, utilizando a mesma frase, porém vamos mudar o Tokenization para trabalhar e separar as palavras, e não mais sentenças.

Tokenization de palavras.

Perceba que nesse exemplo, a única mudança foram nas linhas 7 e 8. Apesar disso, o resultado é totalmente diferente.

Resultado — Tokenization de palavras.

Note que agora, o algoritmo fez a tokenization para separar as palavras, e não mais as sentenças. Uma dúvida que poderia ficar é a seguinte: Como descartar alguns caracteres de um corpus? Essa característica é associada ao termo Stopword. Stopwords são palavras comuns que normalmente não contribuem para o significado de uma frase, pelo menos com relação ao propósito da
informação e do processamento da linguagem natural. Antes de aplicar stopword, precisamos consultar as palavras que por padrão, a biblioteca do NLTK, cadastrou como stopword. Para cada idioma, haverão stopwords diferentes.

Stopwords — Inglês.

Para mudar o idioma, basta alterar no parâmetro da linha 3. Com isso teremos o resultado:

Resultado — Stopwords — Inglês.

Essas são as palavras que o NLTK incluiu como sendo desnecessárias para o idioma inglês. Em relação as palavras do idioma português, basta alterarmos o parâmetro, como comentamos acima.

Stopwords —Português.

Agora, trabalhando com o idioma português, as palavras que o NLTK descartou para análise foram:

Resultado — Stopwords —Português.

Para consolidar essa técnica vamos construir um pequeno exemplo.

Exemplo — Stopword — Português.

Na linha 2, criamos um objeto que armazena as palavras de stopwords em português. Na linha 3 criamos uma frase para aplicar stopwords. E por último na linha 4, usamos uma list comprehension para listar todas as palavras da frase que não estiverem na lista de palavras do Stopword. Resultado:

Resultado — Exemplo — Stopword Português.

Como vimos acima, artigos como: um, em, foram descartados pelo stopword, conforme o que aplicamos no exemplo. O último conceito que veremos no artigo está relacionado com a técnica de remoção de sufixos e prefixos numa palavra, pois a título de PLN, eles não tem importância nenhuma. Essa técnica é chamada de Stemming. Existem vários tipos de Stemming no NLTK, vamos utitilizar no exemplo, dois deles.

Exemplo — Stemming.

Note que estamos usando o PorterStemmer e o LancasterStemmer. Existem muitos outros, depois dá uma conferida na documentação da biblioteca. O resultado é apresentado a seguir:

Resultado — Exemplo — Stemming.

Com base no exemplo a seguir, vimos que o LancasterStemmer apresentou um resultado melhor. A escolha por qual Stemmer utilizar é um trade-off baseado com os dados que se tem em mãos e que serão objetos de análise. Com isso, finalizamos este artigo que introduziu um dos temas quentes em Inteligência Artificial que é o Processamento de Linguagem Natural (PLN). Nos vemos num próximo artigo. Até a próxima.

--

--

Rodrigo Macedo
Ensina.AI

Professor Informática EBTT IFMA | Estudande de Data Science, Cloud Computing e Inteligência Artificial.