Aula 08 - Criando e usando um "Saco de Palavras"


1- O que é um saco de palavras?

Essa técnica de processamento de linguagem natural é bastante conhecida e propicia a extração de informações pela quantidade ou frequência das palavras citadas em um texto.
Imagine que você está escrevendo um texto para uma revista médica sobre uma mutação de uma doença que está em investigação. É muito provável que você utilize termos relacionados a biologia e algumas palavras serão mais frequentes que outras. Por exemplo, partes do corpo humano, órgãos, composições químicas serão muito mais frequentes que palavras relacionadas a algoritmos computacionais (provavelmente não aparecerão).
A frequência de determinadas palavras podem nos indicar o assunto que um determinado texto está tratando. Com esta informação podemos classificar documentos em grupos ou até mesmo encontrar candidatos mais prováveis a leitura e ordenar uma lista de resultados por relevância.

2- Como criar um saco de palavras

O primeiro passo para criar um saco de palavras é importar os módulos necessários para o pré-processamento e criação do saco.


import nltk import re # inserimos um texto aleatório texto = """France, in Western Europe, encompasses medieval cities, alpine villages and Mediterranean beaches. Paris, its capital, is famed for its fashion houses, classical art museums including the Louvre and monuments like the Eiffel Tower. The country is also renowned for its wines and sophisticated cuisine. Lascaux’s ancient cave drawings, Lyon’s Roman theater and the vast Palace of Versailles attest to its rich history."""


A seguir iremos dividir o texto em sentenças e agrupar tudo em uma lista:

# Divide o texto em frases
dataset = nltk.sent_tokenize(texto)


O pré-processamento deverá remover caracteres indesejados para a criação do saco de palavras:

#realizando o pré-processamento
for i in range (len(dataset)):
    dataset[i] = dataset[i].lower() #converte todas as palavras para letras minusculas
    dataset[i] = re.sub(r'\W', ' ', dataset[i]) # troca tudo que não for uma palavra para um espaço
    dataset[i] = re.sub(r'\s+', ' ', dataset[i]) # troca tudo que for quebras de linha para um espaço simples
    
print (dataset)

['france in western europe encompasses medieval cities alpine villages and mediterranean beaches ', 'paris its capital is famed for its fashion houses classical art museums including the louvre and monuments like the eiffel tower ', 'the country is also renowned for its wines and sophisticated cuisine ', 'lascaux s ancient cave drawings lyon s roman theater and the vast palace of versailles attest to its rich history ']


Com o texto já pre-processado podemos criar um histograma. Nada mais é do que uma lista de registros que nos informa a quantidade de vezes que uma palavra aparece no texto:

# criando um histograma

word2count = {}
for data in dataset:
    words = nltk.word_tokenize(data)
    for word in words:
        if word not in word2count.keys():
            word2count[word] = 1
        else:
            word2count[word] += 1
            
print (word2count)

{'france': 1, 'in': 1, 'western': 1, 'europe': 1, 'encompasses': 1, 'medieval': 1, 'cities': 1, 'alpine': 1, 'villages': 1, 'and': 4, 'mediterranean': 1, 'beaches': 1, 'paris': 1, 'its': 4, 'capital': 1, 'is': 2, 'famed': 1, 'for': 2, 'fashion': 1, 'houses': 1, 'classical': 1, 'art': 1, 'museums': 1, 'including': 1, 'the': 4, 'louvre': 1, 'monuments': 1, 'like': 1, 'eiffel': 1, 'tower': 1, 'country': 1, 'also': 1, 'renowned': 1, 'wines': 1, 'sophisticated': 1, 'cuisine': 1, 'lascaux': 1, 's': 2, 'ancient': 1, 'cave': 1, 'drawings': 1, 'lyon': 1, 'roman': 1, 'theater': 1, 'vast': 1, 'palace': 1, 'of': 1, 'versailles': 1, 'attest': 1, 'to': 1, 'rich': 1, 'history': 1}


Devemos agora ordenar essa lista considerando aqueles termos que aparecem no texto mais frequentemente:

# biblioteca para ordenação
import heapq

# ordena a lista para saber qual é a palavra que mais se repete
freq_words = heapq.nlargest(50,word2count, key=word2count.get)
print (freq_words)


['and', 'its', 'the', 'is', 'for', 's', 'france', 'in', 'western', 'europe', 'encompasses', 'medieval', 'cities', 'alpine', 'villages', 'mediterranean', 'beaches', 'paris', 'capital', 'famed', 'fashion', 'houses', 'classical', 'art', 'museums', 'including', 'louvre', 'monuments', 'like', 'eiffel', 'tower', 'country', 'also', 'renowned', 'wines', 'sophisticated', 'cuisine', 'lascaux', 'ancient', 'cave', 'drawings', 'lyon', 'roman', 'theater', 'vast', 'palace', 'of', 'versailles', 'attest', 'to']


O ultimo passo é criar o saco de palavras transcrevendo cada documento para uma informação booleana dizendo se cada palavra do saco de palavras está presente ou não no documento:

import numpy as np

x = []

for data in dataset:
    vector = []
    for word in freq_words:
        if word in nltk.word_tokenize(data):
            vector.append(1) # se a palavra está contida no documento coloca-se 1
        else:
            vector.append(0) # se a palavra não está contida no documento coloca-se 0
    x.append(vector)
    
y = np.asarray(x)
print (y)

[[1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0] [1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1]]

3- Observações importantes

O saco de palavras permite que você utilize classificadores e faça outras análises posteriormente. Criar um saco de palavra não te dá informação alguma instantaneamente.

O saco de palavras utilizando a incidência das palavras pode ser utilizado, porém, esse modelo possui problemas já bem conhecidos. São eles: (1) "perca" de informação sintática, considerando que se trata de uma abordagem estatística. (2) Modelos que consideram a frequência inversa de palavras no conjunto de documentos já provaram ser mais eficientes em muitos casos.
Aula 08 - Criando e usando um "Saco de Palavras" Aula 08 - Criando e usando um "Saco de Palavras" Reviewed by Vinicius dos Santos on 09:52:00 Rating: 5

Nenhum comentário

Escreve ai sua opinião!