segunda-feira, 7 de outubro de 2013

Unigramas, bigramas e trigramas.

O post de hoje é bem curto mas muito funcional.

No post anterior aprendemos a fazer o pré-processamento do texto, chegando no afim a um array de palavras com seu radical extraído, sem stopwords e com padronização (sem acentos e caracteres especiais). Este array, por si só, já pode ser considerado como um conjunto de unigramas, ou seja, palavras únicas que podem ser utilizadas em uma afinidade de aplicações.

Uma das aplicações é, por exemplo, a contagem das palavras no conjunto de dados (coisa que já realizamos no post passado também). As unigramas podem dar noção do tema do texto, por exemplo, se você considerar um conjunto de 10 ou 15 palavras mais frequentes. Entretanto, as vezes a simples análise da frequência de unigramas não traz conhecimento preciso.

Alguns pesquisadores que estudaram a probabilidade de uma palavra aparecer após outra propuseram o uso dos bigramas e trigramas para caracterizar textos. Os bigramas são sequências de duas palavras e os trigramas são sequências de três palavras. Após a criação dos bigramas e trigramas, podemos contar as suas frequências e ver se trazem algum significado relevante para o texto.

Em Python, construir os bigramas e trigramas a partir das unigramas é relativamente simples, veja a função que criaremos a seguir:


def bigramas(words):
 
    bigrams = []
 
    for i in range(0, len(words)):
        if (i == len(words)-1):
            break
        else:
            bigrama_obs = words[i] + '_' + words[i+1]
            bigrams.append(bigrama_obs)
 
    return bigrams

A único input desta função é o próprio array de unigramas que vimos no post anterior. A função de trigramas é muito semelhante e segue a mesma lógica da função de bigramas:


def trigramas(words):
 
    trigrams = []
 
    for i in range(0, len(words)):
        if (i == len(words)-2):
            break
        else:
            trigrama_obs = words[i] + '_' + words[i+1] + '_' + words[i+2]
            trigrams.append(trigrama_obs)
 
    return trigrams

Os bigramas e trigramas funcionam melhor com textos mais longos, de alguns parágrafos. Neste caso, recomendo o uso de um texto de notícia, por exemplo, como deste link do UOL. Aplicando os procedimentos vistos no post anterior na seguinte ordem:
  1. Eliminação de pontuações e caracteres especiais
  2. Eliminação dos acentos
  3. Tokenização
  4. Eliminação das stopwords
podemos aplicar as funções bigramas() e trigramas() para criar arrays destes tipos e utilizar a função FreqDist() da biblioteca NLTK para calcular as frequências.

Para este exemplo, as 3 palavras (unigramas) mais frequentes foram black, blocs e rio, com cinco ocorrências cada. Já para a análise de bigramas foram: black_blocs, capital_paulista e policiais_militares, com cinco, duas e duas ocorrências cada, respectivamente. Neste caso, a análise de bigramas trouxe uma compreensão muito mais precisa do tema do texto.

Até a próxima!

4 comentários: