SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

segunda-feira, 15 de dezembro de 2014

Text Mining com kernels string no R - Parte 1.


A Mineração de texto (Text Mining), também denominada de extração de dados de textuais, ou ainda, análise de textual, refere-se ao processo de obter informação quantitativa a partir de um determinado texto.

Essas informações normalmente são obtidas por meio do reconhecimento de padrões e tendências através de aprendizagem estatística. A Mineração de Texto geralmente envolve o processo de estruturação do texto de entrada, reconhecimento dos padrões de dados estruturados, e, finalmente, a avaliação e interpretação dos resultados.

Nesse post mostraremos como realizar algumas das principais tarefas de Text Mining, as quais são úteis no estudo das mídias sociais com propósitos estratégicos gerenciais e de aplicações em marketing.

Análise textual descritiva: Wordcloud.


Uma nuvem de palavras ou Wordcloud é uma representação visual de dados de texto, normalmente usada para descrever os metadados de palavras-chave em textos específicos. Em geral é representada por palavras isoladas, e a importância de cada palavra é mostrada com um tamanho da fonte ou cor. Neste formato é fácil perceber rapidamente os termos mais proeminentes e sua importância relativa.

Considere por exemplo o Soneto da Felicidade:

#Guarda o texto a ser analisado no objeto "soneto"
soneto<-"A Felicidade

Tristeza não tem fim
Felicidade sim

A felicidade é como a pluma
Que o vento vai levando pelo ar
Voa tão leve
Mas tem a vida breve
Precisa que haja vento sem parar

A felicidade do pobre parece
A grande ilusão do carnaval
A gente trabalha o ano inteiro
Por um momento de sonho
Pra fazer a fantasia
De rei ou de pirata ou jardineira
Pra tudo se acabar na quarta-feira

Tristeza não tem fim
Felicidade sim

A felicidade é como a gota
De orvalho numa pétala de flor
Brilha tranqüila
Depois de leve oscila
E cai como uma lágrima de amor

A felicidade é uma coisa boa
E tão delicada também
Tem flores e amores
De todas as cores
Tem ninhos de passarinhos
Tudo de bom ela tem
E é por ela ser assim tão delicada
Que eu trato dela sempre muito bem

Tristeza não tem fim
Felicidade sim

A minha felicidade está sonhando
Nos olhos da minha namorada
É como esta noite, passando, passando
Em busca da madrugada
Falem baixo, por favor
Pra que ela acorde alegre com o dia
Oferecendo beijos de amor"
Uma vez armazenado o texto de interesse, podemos construir a Wordcloud da seguinte forma:
#Habilita as bibliotecas necessárias
library(tm)           #Text Mining
library(wordcloud)    #Wordcloud
Uma vez habilitadas as bibliotecas tm e wordcloud, é necessário transformar o texto em um objeto próprio para análise:
#Transforma os dados de texto em vetores
vs <- VectorSource(soneto)

#Coloca no formato de Corpus do pacote tm
temp<- Corpus(vs)

#Faz o Word Cloud
wordcloud(temp)
O qual fornece a seguinte Wordcloud:
Podemos melhorar a Wordcloud retirando as preposições e artigos desnecessários, tais como: "por", "de", "pelo", "a", etc. Essa etapa consiste em criar um objeto do tipo Corpus para o qual:
  • Converte todas as palavras para minúsculo.
  • Expande todas as contrações de palavra, por exemplo, "pelo" vira "per o".
  • Remove as palavras "ruído".
  • Remove as pontuações.
#Coloca tudo em minúsculo
wc_corpus <- tm_map(temp, tolower)

#Tira a pountuação e palavras ruído
wc_corpus <- tm_map(wc_corpus, removePunctuation)
wc_corpus <- tm_map(wc_corpus, removeWords, stopwords('portuguese'))

#Cria a frequência de palavras
td_mtx <- TermDocumentMatrix(wc_corpus, control = list(minWordLength = 3))
v <- sort(rowSums(as.matrix(td_mtx)), decreasing=TRUE)
df <- data.frame(word=names(v), freq=v)
wordcloud(df$word, df$freq, min.freq=3)
Obtendo assim:
Para deixar mais interessante a Wordcloud fazemos:
#Habilitando o pacote de cores
library(RColorBrewer)
pal2 <- brewer.pal(8,"Dark2")

#Gera o word cloud
wordcloud(df$word, df$freq, min.freq=1,
          max.words=Inf, random.order=FALSE, 
          rot.per=.15, colors=pal2)

11 comentários:

  1. Me ajudou muito!!! Muito obrigado!!!

    ResponderExcluir
  2. Em primeiro lugar gostaria de agradecer pelo tutorial.
    Ao tentar rodar o segmento TermDocumentMatrix... aparecia o erro abaixo

    TermDocumentMatrix(wc_corpus2, control = list(minWordLength = 3))
    Error: inherits(doc, "TextDocument") is not TRUE

    Solucionei introduzindo a seguinte linha antes do comando
    wc_corpus <- tm_map(wc_corpus, PlainTextDocument)
    O restante funcionou direitinho.

    ResponderExcluir
  3. Em primeiro lugar gostaria de agradecer pelo tutorial.
    Ao tentar rodar o segmento TermDocumentMatrix... aparecia um erro

    TermDocumentMatrix(wc_corpus2, control = list(minWordLength = 3))
    Error: inherits(doc, "TextDocument") is not TRUE

    Solucionei introduzindo a seguinte linha antes do comando
    wc_corpus <- tm_map(wc_corpus, PlainTextDocument)
    O restante funcionou direitinho

    ResponderExcluir
  4. Obrigado, Jobenil.
    Fica registrado a sua correção.
    Grande abraço

    ResponderExcluir
  5. Pedro

    Grato pelas dicas. Conhece algum outro material de preferência em português sobre mineração de texto com R?

    grato

    ResponderExcluir
    Respostas
    1. Oi Flávio,
      Infelizmente não conheço nenhum material em português sobre o assunto.
      Grande abraço

      Excluir
  6. Olá pessoal, estou com dificuldade para achar a correlação entre dois termos do mesmo documento, se alguém tivar uma resposta, ficarei grato. Obrigado

    ResponderExcluir
  7. Tem como fazer isso se for um documento em PDF?

    ResponderExcluir
  8. Olá,

    Muito obrigada pelas dicas. No entanto, estou com um probleminha: não foi possível encontrar a função "plot.new". Como posso resolver?

    Desde já, obrigada pelo auxílio!

    ResponderExcluir
  9. Parabéns pela postagem. Tenho interesse no assunto e estou com dificuldades de fazer a leitura de vários textos de uma pasta, poderia me ajudar com isso?

    ResponderExcluir