Aluno: Rafael Capaci Pereira
Professores: Luis Gustavo Nonato e Moacir Antonelli Ponti
Cemeai - ICMC/USP São Carlos
A avaliação vale 10 pontos. As questões de 1 a 4, caso respondidas da forma correta, já totalizam 10 pontos.
**ATENÇÃO:**
pip
.!pip install tqdm
!pip install plotly
Requirement already satisfied: tqdm in /home/capaci/anaconda3/envs/mba/lib/python3.9/site-packages (4.59.0) Requirement already satisfied: plotly in /home/capaci/anaconda3/envs/mba/lib/python3.9/site-packages (4.14.3) Requirement already satisfied: six in /home/capaci/anaconda3/envs/mba/lib/python3.9/site-packages (from plotly) (1.16.0) Requirement already satisfied: retrying>=1.3.3 in /home/capaci/anaconda3/envs/mba/lib/python3.9/site-packages (from plotly) (1.3.3)
Considere o arquivo modcovid.pdf (disponível para download no moodle). Escreva um código para extrair o texto (ASCII) do arquivo PDF e escreva o texto extraído em um arquivo chamado modcovid.txt
.
Para resolver a questão, foram desenvolvidas as funções convert_pdf_to_string
e write_string_to_file
.
O arquivo .pdf é lido como imagem e o conteúdo de todas as páginas é retornado como uma string.
from pdf2image import convert_from_path
from PIL import Image
from pytesseract import image_to_string
def convert_pdf_to_string(pdf_path):
"""
Dado o caminho de um arquivo em pdf, converte o arquivo para uma imagem e
concatena o texto de cada página e retorna esse texto.
"""
imgs = convert_from_path(pdf_path)
content = ''
for img in imgs:
content += image_to_string(img, lang='por')
return content
def write_string_to_file(content, file_path):
f = open(file_path, 'w')
f.write(content)
f.close()
content = convert_pdf_to_string(pdf_path='./modcovid.pdf')
write_string_to_file(content, file_path='modcovid.txt')
Leia o arquivo modcovid.txt
e realize as seguinte operações:
Extraia todas palavras contidas no arquivo e armazene em uma lista de palavras (utilize o método word_tokenize do pacote nltk).
Remova da lista de palavras todas as "palavras" que não sejam formadas exclusivamente de caracteres do alfabeto.
Quantas palavras com apenas 1 caractere sobraram na lista?
from nltk import word_tokenize
A função get_tokens_from_file
lê um arquivo e extrai as palavras do texto, retornando-as em uma lista através da função word_tokenize
, do pacote nltk
def get_tokens_from_file(filename):
f = open(filename, 'r')
content = f.read()
f.close()
return word_tokenize(content, language='portuguese')
A função abaixo remove todas as palavras que não são formadas exclusivamente por caracteres alfanuméricos
def remove_non_alpha_from_tokens_list(tokens):
return [token for token in tokens if token.isalpha()]
A próxima função filtra as palavras de uma lista pelo tamanho
def filter_tokens_by_length(tokens, length):
return [token for token in tokens if len(token) == length]
A seguir, as três funções declaradas anteriormente são executadas, lendo o arquivo modcovid.txt
, removendo as palavras não alfanuméricas e por fim, filtrando as palavras de tamanho 1, de modo a responder a terceira pergunta.
Ao executar esses passos, observa-se que o número de palavras de tamanho 1 é 44
tokens = get_tokens_from_file('modcovid.txt')
tokens = remove_non_alpha_from_tokens_list(tokens)
len(filter_tokens_by_length(tokens, length=1))
44
Carregue o arquivo artists_mba21.csv
e armazene em um pandas DataFrame.
Esse arquivo possui os atributos:
import pandas as pd
%matplotlib inline
df = pd.read_csv('artists_mba21.csv')
Exiba um histograma contendo a frequência dos diferentes gêneros dos artistas. Note que um artista pode ter mais do que um gênero associado.
Dica: use a função str.split(',')
para separar múltiplos gêneros
df.head()
name | years | genre | nationality | bio | wikipedia | paintings | |
---|---|---|---|---|---|---|---|
0 | Amedeo Modigliani | 1884 - 1920 | Expressionism | Italian | Amedeo Clemente Modigliani (Italian pronunciat... | http://en.wikipedia.org/wiki/Amedeo_Modigliani | 193 |
1 | Vasiliy Kandinskiy | 1866 - 1944 | Expressionism,Abstractionism | Russian | Wassily Wassilyevich Kandinsky (Russian: Васи́... | http://en.wikipedia.org/wiki/Wassily_Kandinsky | 88 |
2 | Diego Rivera | 1886 - 1957 | Social Realism,Muralism | Mexican | Diego María de la Concepción Juan Nepomuceno E... | http://en.wikipedia.org/wiki/Diego_Rivera | 70) |
3 | Claude Monet | 1840 - 1926 | Impressionism | French | Oscar-Claude Monet (; French: [klod mɔnɛ]; 14 ... | http://en.wikipedia.org/wiki/Claude_Monet | 73 |
4 | Rene Magritte | 1898 - 1967 | Surrealism,Impressionism | Belgian | René François Ghislain Magritte (French: [ʁəne... | http://en.wikipedia.org/wiki/René_Magritte | 194 |
Podemos verificar que na coluna genre, os dados estão dentro de uma string, onde os gêneros de um artista são separados por vírgula.
Inicialmente, o método str.split()
é utilizado para converter cada string em um array contendo os gêneros.
df['genre'] = df['genre'].str.split(',')
Como estamos interessados somente na frequência dos gêneros, utilizaremos o método explode
para "concatenar" todas as listas em uma nova série do pandas.
genres = df['genre'].explode()
A partir da série genres
montamos o gráfico de barras com as frequências de cada gênero, ordenadas de maneira decrescente.
import plotly.graph_objects as go
counts = genres.value_counts(ascending=True)
bar_plot = go.Bar(x=counts,
y=counts.index,
orientation='h',
)
fig = go.Figure(bar_plot)
fig.update_layout(title='Frequência por gênero',
height=800,
yaxis={'title': 'Gêneros'},
xaxis={'title': 'Frequência'},
)
fig.show()