Processo para limpeza eficaz de dados de texto (com estudo de caso utilizando Python)

Tradução de: Steps for effective text data cleaning (with case study using Python)

Autor: 

O tempo em que se poderia obter dados em planilhas tabuladas já ficaram para trás. (Um minuto de silêncio para os dados que residem exclusivamente em planilhas.) Hoje, mais de 80% dos dados são desestruturados – ou estão presentes em silos ou espalhados em arquivos digitais. Os dados estão sendo produzidos enquanto falamos – de todas as conversas que fazemos na mídia social para todos os conteúdos gerados a partir de fontes de notícias. A fim de produzir uma visão prática e significativa dos dados, é importante saber como trabalhar com eles em sua forma não estruturada. Como um data scientist em uma das empresas de Data Science de mais rápido crescimento, o meu ganha-pão vem de derivar insights significativos de informações de textos não estruturados.

Um dos primeiros passos para trabalhar com dados de texto é pré-processá-los. Passo essencial antes dos dados estarem prontos para análise. Por natureza, a maioria dos dados de texto disponível é altamente desestruturado e cheio de ruídos – para conseguir uma visão melhor ou para construir melhores algoritmos, é necessário manipular os dados limpos. Por exemplo, dados de mídia social são altamente desestruturados – é uma comunicação informal – erros de digitação, gramática, uso de gírias, presença de conteúdo indesejado, como URLs, Stopwords, expressões idiomáticas etc, são os problemas de costume.

Neste post, portanto, eu discuto os possíveis elementos de ruído e como você pode limpá-los, passo a passo. Aqui, faço isso usando Python.

Como um típico problema de negócio, suponha que você esteja interessado em encontrar características de um iPhone que são mais populares entre os usuários. Você extraiu as opiniões dos consumidores relacionadas com iPhone e aqui está o tweet que você extraiu:

“I luv my <3 iphone & you’re awsm apple. DisplayIsAwesome, sooo happppppy 🙂http://www.apple.com”

Passos para a limpeza de dados:

Aqui segue o que você faz:

1.Livre-se dos caracteres HTML: Os dados obtidos a partir da web normalmente contém uma grande quantidade de entidades HTML como & lt; & Gt; & Amp; que vêm embutida nos dados originais. É, portanto, necessário se livrar dessas entidades. Uma abordagem é removê-los diretamente através da utilização de expressões regulares específicas. Outra abordagem é a utilização de pacotes e módulos apropriados (por exemplo HTMLParser de Python), que pode converter estas entidades a tags HTML padrão. Por exemplo: & lt; é convertido a “<” e & amp; é convertido a “&”.

Snippet:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
tweet = html_parser.unescape(original_tweet)
Output:
>> “I luv my <3 iphone & you’re awsm apple. DisplayIsAwesome, sooo happppppy 🙂http://www.apple.com”

2.Decodificando dados: Esta parte do processo transforma informação de símbolos complexos para caracteres simples e mais fáceis de entender. Dados de texto podem estar sujeitos a diferentes formas de decodificação como “Latin-1”, “UTF-8”, etc. Portanto, para melhor análise, é necessário manter os dados completos no formato de codificação padrão. UTF-8 é amplamente aceito e é recomendado para uso.

Snippet:
tweet = original_tweet.decode("utf8").encode(‘ascii’,’ignore’)
Output:
>>  “I luv my <3 iphone & you’re awsm apple. DisplayIsAwesome, sooo happppppy 🙂http://www.apple.com”

3.Busca por apóstrofos (nota tradutor: aplicável para a língua inglesa): Para evitar qualquer desambiguação lexical de sentido no texto, recomenda-se manter a estrutura adequada nele e respeitar as regras de gramática livres de contexto. Quando apóstrofos são usados, as chances de desambiguação aumenta.

Por exemplo, “it’s is a contraction for it is or it has”.

Todos os apóstrofos devem ser convertidos em léxicos padrão. Pode-se usar uma tabela de pesquisa de todas as chaves possíveis para se livrar de disambíguos.

Snippet:
APPOSTOPHES = {“'s" : " is", "'re" : " are", ...} ## Need a huge dictionary
words = tweet.split()
reformed = [APPOSTOPHES[word] if word in APPOSTOPHES else word for word in words]
reformed = " ".join(reformed)
Outcome:
>>  “I luv my <3 iphone & you are awsm apple. DisplayIsAwesome, sooo happppppy 🙂http://www.apple.com”

4.Remoção de palavras vazias: Quando a análise de dados precisam ser orientados a dados no nível de palavra, as palavras mais frequentes (palavras vazias) deve ser removido. Pode-se criar uma longa lista de palavras vazias ou pode-se usar bibliotecas específicas de idioma pré-definido.

5.Remoção de pontuações: Todas as marcas de pontuação devem ser tratadas de acordo com as prioridades. Por exemplo: “”. “?”, “,”, são pontuações importantes que devem ser retidas, enquanto outros têm de ser removidas.

6. Remoção de expressões: Dados textuais (geralmente transcrições de fala) pode conter expressões humanas como [rindo], [Chorando], [Audiência pausada]. Estas expressões geralmente não são relevantes para o conteúdo do texto e, portanto, precisam ser removidas. Expressões regulares simples podem ser úteis neste caso.

7.Separação de palavras juntadas: Nós seres humanos, nas redes sociais, geramos dados de texto que são completamente informais por natureza. A maioria dos tweets são acompanhados com várias palavras juntadas como diachuvoso, brincandnofrio etc. Essas entidades podem ser divididas em suas formas normais usando regras simples e regex.

Snippet:
cleaned = “ ”.join(re.findall(‘[A-Z][^A-Z]*’, original_tweet))
Outcome:
>>  “I luv my <3 iphone & you are awsm apple. Display Is Awesome, sooo happppppy 🙂http://www.apple.com”

8.Pesquisa de gírias: Mais uma vez, a mídia social é composta em sua maioria por gírias. As gírias devem ser transformadas em palavras padrão para retornar texto livre. As palavras como vc será convertido para você, findi para fim de seman. A mesma abordagem dada ao apóstrofo pode ser usada para converter gírias em palavras padrão. Várias fontes estão disponíveis na web, que fornece listas de todas as gírias possíveis. Este seria o seu Santo Graal e você pode usá-los como dicionários de pesquisa para fins de conversão.

Snippet:
tweet = _slang_loopup(tweet)
Outcome:
>>  “I love my <3 iphone & you are awesome apple. Display Is Awesome, sooo happppppy 🙂http://www.apple.com”

9.Padronizando palavras: Às vezes as palavras não estão em formatos adequados. Por exemplo: “Eu aaaaaaaaamooooo você” deve ser “eu te amo”. Regras simples e expressões regulares podem ajudar a resolver estes casos.

Snippet:
tweet = ''.join(''.join(s)[:2] for _, s in itertools.groupby(tweet))
Outcome:
>>  “I love my <3 iphone & you are awesome apple. Display Is Awesome, so happy 🙂http://www.apple.com”

10.Remoção de URLs: devem ser removidos dos dados de texto as URLs e hiperlinks como comentários, opiniões, e tweets.

Limpeza de dados avançada:

1.Verificação gramatical: verificação gramatical é, na sua maior parte, baseada em aprendizagem. Uma grande quantidade de dados de texto adequada é aprendida e modelos são criados para fins de correção gramatical. Existem muitas ferramentas on-line que estão disponíveis para fins de correção gramatical.

2.Correção ortográfica: Em linguagem natural, erros ortográficos são facilmente encontrados. Empresas como Google e Microsoft têm atingido um nível de precisão muito decente na correção ortográfica automática. Pode-se usar algoritmos como o “Levenshtein Distances”, dicionário de pesquisa etc., ou outros módulos e pacotes para corrigir esses erros.

Notas finais:

Espero que este artigo tenha sido útil para você. Essas foram algumas dicas e truques que eu aprendi ao trabalhar com uma grande quantidade de dados de texto. Se você seguir os passos acima para limpar os dados, você pode melhorar drasticamente a precisão dos seus resultados e tirar melhores insights. Não deixe de compartilhar suas opiniões/dúvidas na seção de comentários, ficarei feliz em participar.


Veja também: