domingo, 15 de setembro de 2013

Pré-processamento de Textos

Vimos no post anterior que quando analisamos textos precisamos fazer alguns ajustes nele antes. Estes ajustem servem para melhorar os resultados e corrigir algumas imperfeições da análise que passam desapercebidas por nós quando estamos simplesmente lendo um texto.

São elas:
  1. Pontuações - as pontuações no texto acabam transformando as palavras. Como o Python não sabe identificar as palavras automaticamente, uma palavra 'concluído' acaba sendo diferente de uma palavra 'concluído!'.
  2. Acentuações - o mesmo problema que temos nas pontuações também se aplica nas acentuações, ou seja, a palavra 'conversão' é diferente a palavra 'conversao'. Desta forma, erros ortográficos no texto são facilmente confundidos com palavras diferentes.
  3. Case Sensitive - este termo define quando a palavra está sendo escrita em maiúscula ou minúscula. O Python (e a maioria das linguagens de programação) identifica como palavras diferentes, por exemplo: 'Conversão' e 'conversão'.
Existem outras tarefas mais complexas que fazem parte do pré-processamento de textos mas deixaremos isso para um próximo post. Hoje vamos focar nos três itens apresentados acima.

Case Sensitive

Antes de qualquer processamento, vamos converter todo o nosso texto para letras minúsculas. Aproveitando o código do texto anterior que gera uma variável chamada texto_longo: 

# -*- coding: utf-8 -*-
texto_longo = '''
 Esta é uma demonstracao de como podemos escrever textos
 longos. Estes textos longos podem ser parágrafos inteiros
 de livros, reportagens, notícias e ate mesmo posts de blogs.
 Seja qual for a sua fonte, ela poderá ter textos longos como
 este, tenha certeza disto!
 '''

texto_longo = texto_longo.lower()
print texto_longo

Pontuações e Acentuações

Para remoção de pontuações e acentuações podemos utilizar o comando replace() que aprendemos no post anterior para remoção das quebras de linha. A diferença aqui é que, no caso acentuações, precisamos substituir a letra acentuada pela sua correspondente não acentuada, enquanto que para pontuações basta a remoção como fizemos para as quebras de linha.


As pontuações principais são:
  • Ponto final (.)
  • Vírgula (,)
  • Ponto de exclamação (!)
  • Ponto de interrogação (?)
  • Ponto-e-vírgula (;)
Vamos nos limitar a estes que aparecem no texto sugerido (nem todas), mas esta metodologia pode ser extendida a todos os caracteres especiais. Desta forma, aplicamos o comando replace() recorrentemente para remover as pontuações.

pontos = ['.',',','!','?',';']

for p in pontos:
 texto_longo = texto_longo.replace(p, '')

print texto_longo

Para remoção das acentuações temos que substituir cada letra acentuada pela sua correspondente não acentuada utilizando também o comando replace(). Veja abaixo:

acentos = ['á','é','í','ó','ú','à','è','ì','ò','ù',
     'ã','ẽ','ĩ','õ','ũ','â','ê','î','ô','û']
s_acentos = ['a','e','i','o','u','a','e','i','o','u',
    'a','e','i','o','u','a','e','i','o','u']

for i in range(0, len(acentos)):
 texto_longo = texto_longo.replace(acentos[i], s_acentos[i])

print texto_longo

Agora que nosso texto está preparado, vamos contar as palavras como fizemos no post anterior:

from collections import Counter

palavras = texto_longo.replace('\n',' ').replace('\t','').split(' ')
contador = Counter(palavras)

for i in contador.items():
 print i

Diferente do resultado anterior, sem pré-processamento, temos agora as palavras mais frequentes:
  • 'textos': 3
  • 'longos': 3
  • 'de': 3
No post anterior vimos que 'longos' tinha apenas 2 citações, entretanto, uma citação estava escondida junto ao ponto final da primeira frase. Agora temos uma análise mais correta.

No próximo post veremos como remover palavras de alta frequência e pouca relevância, chamadas de stop words, e veremos um pouco sobre extração de radicais, para eliminar o efeito da conjugação de verbos e flexão. Até a próxima!


Nenhum comentário:

Postar um comentário