<jupyter_start><jupyter_text>Importar bibliotecas<jupyter_code>import pandas as pd
import numpy as np
import html
import nltk
import regex as re
import string
import seaborn as sns
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem.snowball import SnowballStemmer
from nltk.stem import WordNetLemmatizer
!pip install nltk
nltk.download()<jupyter_output>showing info https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml<jupyter_text>Importar dados<jupyter_code>data = pd.read_csv('G:/Meu Drive/DataScience/DS-Tera/ProjetoBNCC/bncc-classifier/data/raw/bncc_first_classifier.csv')
data_clone = data.copy()
# renomeando as colunas do dataset

data_clone.columns = ['id', 'questoes', 'tipoQuestoes', 'topico', 'slug', 'materia', 'slug.1','etapaEnsino']
data_clone.head()<jupyter_output><empty_output><jupyter_text>Pre-processamento * Escrevendo funcões para etapa de pre-processamento de Texto usando regex<jupyter_code># Função para remover tags de html usando regex

def remove_tags(text: str) -> str:
    pattern = re.compile("<.*?>")
    cleantext = re.sub(pattern, " ", text).replace(u"\xa0", u" ")
    return cleantext

# Função para deixar todo o texto em caixa baixa
def to_lower(text: str) -> str:
    return text.lower()

# Função para remover numeros
def remove_numbers(text: str) -> str:
    pattern = re.compile("[0-9]+")
    clean_text = re.sub(pattern, " ", text)
    return clean_text

# Função para remover caracteres especiais e pontuação
def remove_punctuation(text: str) -> str:
    pattern = re.compile("[\d\.\,\*\"\'\”\“\?\!\:\-]")
    clean_text = re.sub(pattern," ", text) 
    return clean_text

# Função para remover stopwords em portugues; preposições, conjunções, artigos, etc
def remove_standard_stopwords_pt(text: str) -> str:
    stop_words = set(stopwords.words("portuguese"))
    word_tokens = word_tokenize(text)
    filtered_sentence = [w for w in word_tokens if not w in stop_words]
    final_sentence = " ".join(filtered_sentence)
    return final_sentence  

def remove_standard_stopwords_en(text: str) -> str:
    stop_words = set(stopwords.words("english"))
    word_tokens = word_tokenize(text)
    filtered_sentence = [w for w in word_tokens if not w in stop_words]
    final_sentence = " ".join(filtered_sentence)
    return final_sentence  
         
# resolve problema de codificação html da coluna 'questoes'
data_clone['questoes_html']= data['question'].astype('str').apply(html.unescape)

# limpando o texto utilizando as funçoes criadas
data_clone['questoes_tags'] = data_clone['questoes_html'].apply(remove_tags)
data_clone['questoes_lower'] = data_clone['questoes_tags'].apply(to_lower)
data_clone['questoes_numbers'] = data_clone['questoes_lower'].apply(remove_numbers)
data_clone['questoes_punct'] = data_clone['questoes_numbers'].apply(remove_punctuation)
data_clone['questoes_stopw_pt'] = data_clone['questoes_punct'].apply(remove_standard_stopwords_pt)
data_clone['questoes_stopw_en'] = data_clone['questoes_stopw_pt'].apply(remove_standard_stopwords_en)

data_clone.head()
data_clone['questoes_punct']<jupyter_output><empty_output><jupyter_text>Verifica a existência de questões para concursos e outros tipos que não é interessante para análise<jupyter_code>data_clone['etapaEnsino'].value_counts()<jupyter_output><empty_output><jupyter_text>Selecionando apenas questões relacionadas ao Ensino Fundamental e Médio<jupyter_code>data_pre_process = data_clone[data_clone["etapaEnsino"].isin(["Médio & Pré-Vestibular", "Fundamental II", "Fundamental I"])]
data_pre_process.head()
# Verificando se foram selecionadas as etapas targets corretas

data_pre_process['etapaEnsino'].value_counts()<jupyter_output><empty_output><jupyter_text>A variável tipoQuestoes contém items dos tipos:1. Somatória2. Múltipla Escolha3. Certo e Errado4. Discursiva5. Redação ou items que é necessário enviar foto da resolução6. Questões com mais de uma alternativa certa7. Não representa nada em específicoIremos remover questoes tipo 5 e 6 pois não se adequam ao tipo de alvo do nosso problema.<jupyter_code>data_pre_process["tipoQuestoes"].value_counts(ascending=True)<jupyter_output><empty_output><jupyter_text>Obs.: Questoes tipo Multipla escolha e Discursiva somam a maioria das questões Remover as questoes tipo 5 e 6 pois não se adequam ao nosso problema de Classificação<jupyter_code>data_pre_process_quest= data_pre_process[~data_pre_process["tipoQuestoes"].isin([5, 6])]
data_pre_process_quest["tipoQuestoes"].value_counts(ascending=True)<jupyter_output><empty_output><jupyter_text>Existem algumas matérias que não se encaixam na BNCC, por isso será necessário removê-las<jupyter_code>data_pre_process_quest["materia"].value_counts(ascending=True)<jupyter_output><empty_output><jupyter_text>Materias listadas pela BNCCEnsino Fundamental 1 e 2 :* Português* Artes* Educação Física* Inglês* Matemática* Ciências* Geografia* História* Ensino ReligiosoEnsino Médio* Linguagens e suas Tecnologias (Arte, Educação Física, Língua Inglesa e Língua Portuguesa)* Matemática e suas Tecnologias (Matemática)* Ciências da Natureza e suas Tecnologias (Biologia, Física e Química)* Ciências Humanas e Sociais Aplicadas ( História, Geografia, Filosofia e Sociologia) Primeiro iremos agrupar materias para coincidir com as listadas na BNCC<jupyter_code>data_pre_process_group = data_pre_process_quest.copy()
data_pre_process_group.replace('Língua inglesa','Inglês', inplace = True)
data_pre_process_group.replace('Desenho Geométrico','Matemática', inplace = True)
data_pre_process_group.replace(['Produção de Texto', 'Literatura'],'Língua Portuguesa', inplace = True)<jupyter_output><empty_output><jupyter_text>Selecionando apenas as matérias listadas na BNCC para Ensino médio e Fundamental 1 e 2<jupyter_code>data_pre_process_group = data_pre_process_group[~data_pre_process_group["materia"].isin([
    'Italiano', 'Espanhol','Francês','Alemão', 'Redação','Atualidades','Geral', 'Conhecimentos Gerais','Outros','Ciências Humanas'])]
data_pre_process_group["materia"].value_counts(ascending=True)<jupyter_output><empty_output><jupyter_text>Tokenizaçao das Questoes usando NLTK<jupyter_code>data_pre_process_tokens = data_pre_process_group.copy()
data_pre_process_tokens['questoes_tokens'] = data_pre_process_tokens['questoes_stopw_en'].apply(word_tokenize)
data_pre_process_tokens['questoes_tokens'].head()<jupyter_output><empty_output><jupyter_text>Stemming - Remove sufixo das palavras e reduz à sua forma basal<jupyter_code># função para aplicar processo de 'stemming' na coluna questoes

stemmer = SnowballStemmer("portuguese")

def stemming_text(text):
    return [stemmer.stem(w) for w in text]

data_pre_process_tokens['questoes_stemm'] = data_pre_process_tokens['questoes_tokens'].apply(stemming_text)
data_pre_process_tokens['questoes_stemm'].head()<jupyter_output><empty_output><jupyter_text>Lemmatizing - é o processo de agrupar as diferentes formas flexionadas de uma palavra para que possam ser analisadas como um único item<jupyter_code># função para aplicar processo de 'lemmatizing' na coluna questoes
lemmatizer = WordNetLemmatizer()

def lemmatize_text(text):
    return [lemmatizer.lemmatize(w) for w in text]

data_pre_process_tokens['questoes_lemma'] = data_pre_process_tokens['questoes_tokens'].apply(lemmatize_text)
data_pre_process_tokens['questoes_lemma'].head()<jupyter_output><empty_output><jupyter_text>Deletando colunas que não utilizaremos para análises futuras<jupyter_code>data_pre_process_tokens.drop(['slug','slug.1'], axis=1, inplace=True)
data_pre_process_tokens.head()
data_preprocess_basic = data_pre_process_tokens.copy()
data_preprocess_basic.to_csv('G:/Meu Drive/DataScience/DS-Tera/ProjetoBNCC/bncc-classifier/data/curated/data_preprocess_basic.csv', index = False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10265238459576638, 'fraction_numerical': 0.0029329252741647537, 'mean_word_length': 7.812359550561798, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 63, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 1}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '479569', 'license': 'MIT', 'n_tokens_mistral': 2834, 'n_tokens_neox': 2769, 'n_words': 571, 'path': 'analysis/notebooks/brisa-25-02-pre-processing-basic.ipynb', 'repo_name': 'LucianoBatista/bncc-classifier', 'size': '7842'}