Dados Não Estruturados#

Importante

Para execução dos códigos, é necessário instalar as seguintes bibliotecas:

  • !pip install -U scikit-learn

  • !pip install biopython

  • !pip install -U scikit-image

  • !pip install –no-binary :all: opencv-python

  • !pip install spaCy

  • !pip install -U spacy-lookups-data

  • !python -m spacy download pt_core_news_lg

  • !pip install nltk

Análise de Sequências Biológicas#

# Importando Bibliotecas necessárias
import numpy as np
import pandas as pd
import collections
from Bio import SeqIO
from itertools import product


def janela_deslizante(seq, janela):
    seqlen = len(seq)
    for i in range(seqlen):
        j = seqlen if i+janela>seqlen else i+janela
        yield seq[i:j]
        if j==seqlen: break
    return


def k_possiveis(tamanho_k, tipo_seq):
    k_possiveis = [''.join(str(i) for i in x) for x in product(tipo_seq, repeat=tamanho_k)]
    dados_estruturados = pd.DataFrame(columns=range(len(k_possiveis)))
    dados_estruturados.columns = k_possiveis

    kmer = {}
    for k in k_possiveis:
        kmer[k] = 0
    kmer = collections.OrderedDict(sorted(kmer.items()))
    return dados_estruturados, kmer


def kmers(entrada, tamanho_k, tipo_seq):
    
    dados_estruturados, kmer = k_possiveis(tamanho_k, tipo_seq)
   
    for seq_record in SeqIO.parse(entrada, "fasta"):
        seq = seq_record.seq
        seq = seq.upper()   

        for subseq in janela_deslizante(seq, tamanho_k):
            try:
              kmer[subseq] = kmer[subseq] + 1
            except:
              pass 

        dados_estruturados = dados_estruturados.append(kmer, ignore_index=True)
        kmer = dict.fromkeys(kmer, 0)
    return dados_estruturados
    
    
dna = ['A', 'C', 'G', 'T']
rna = ['A', 'C', 'G', 'U']
protein = ['A', 'C', 'D', 'E', 'F', 
           'G', 'H', 'I', 'K', 'L', 
           'M', 'N', 'P', 'Q', 'R', 
           'S', 'T', 'V', 'W', 'Y']

pos_estruturado = kmers('positivo.fasta', 1, protein)
print(pos_estruturado)

neg_estruturado = kmers('negativo.fasta', 1, protein)
print(neg_estruturado)

Análise de Imagens#

# Importando bibliotecas para carregar e manipular os dados
import os
from PIL import Image
import cv2
import numpy as np
import matplotlib.pyplot as plt

# Diretorio base onde as imagens foram carregadas
base_dir = "./yalefaces"

# Leitura dos arquivos das imagens
image_files = [os.path.join(base_dir, file) for file in os.listdir(base_dir)]
images = [np.array(Image.open(img)) for img in image_files]

# Inicialização do detector de faces Haar Cascades através do arquivo obtido no repositório do OpenCV
faceDetectClassifier = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")
faces_cropped = []

# Aplicação do detector de face e segmentando a imagem original para um tamanho de 150x150 contendo somente as faces
for img in images:
    facePoints = faceDetectClassifier.detectMultiScale(img)
    x, y = facePoints[0][:2]
    cropped = img[y: y + 150, x: x + 150]
    faces_cropped.append(cropped)

faces_cropped = np.array(faces_cropped)

fig, ax = plt.subplots(1, 2, figsize=(12,4))

ax[0].imshow(images[0], cmap='gray')
ax[1].imshow(faces_cropped[0], cmap='gray')
from skimage.feature import local_binary_pattern

# Para evitar a divisão por um número próximo a zero
eps = 1e-7

feature_vector = []

for face in faces_cropped:

  # Obtenção da imagem com os padrões locais binários
  lbp = local_binary_pattern(image=face, 
                             P=8, R=1, 
                             method='uniform')

  # Representando e concatenando os padrões com um histograma
  n_bins = int(lbp.max() + 1)
  (hist, _) = np.histogram(lbp.ravel(),
                           bins=n_bins,
                           range=(0, n_bins))

  # Normalizando o histograma obtido
  hist = hist.astype("float")
  hist /= (hist.sum() + eps)

  feature_vector.append(hist)

feature_vector = np.array(feature_vector)

Análise de Textos#

import pandas as pd
import spacy 
import nltk
import re
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
nltk.download('punkt')
pln = spacy.load('pt_core_news_lg')

def remove_acentos(df):
    df = df.str.replace('[àáâãäå]', 'a')
    df = df.str.replace('[èéêë]', 'e')
    df = df.str.replace('[ìíîï]', 'i')
    df = df.str.replace('[òóôõö]', 'o')
    df = df.str.replace('[ùúûü]', 'u')
    df = df.str.replace('[ç]', 'c')
    return df

def conversao_letras_minusculas(df):
    df = df.str.lower()
    return df

def remove_pontuacao(df):
    df = df.str.replace('[^\w\s]', '')
    return df

def remove_numeros(df):
    df = df.apply(lambda x: ' '.join([word for word in x.split() if not word.isdigit()]))
    return df

def remove_url(df):
    df = df.str.replace('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', '')
    return df

def remove_tag(df):
    df = df.str.replace(r'<[^<>]*>', '', regex=True)
    return df

def remove_palavras_frequentes(df, n_palavras):
    palavras = []
    textos = df.apply(nltk.word_tokenize)
    for texto in textos:
        for palavra in texto:
            palavras.append(palavra)
    freq = [x for x in nltk.FreqDist(palavras)]
    frequentes = freq[0:n_palavras]
    df = df.apply(lambda x: ' '.join([word for word in x.split() if word not in (frequentes)]))
    return df

def remove_palavras_raras(df, n_palavras):
    palavras = []
    textos = df.apply(nltk.word_tokenize)
    for texto in textos:
        for palavra in texto:
            palavras.append(palavra)
    freq = [x for x in nltk.FreqDist(palavras)]
    raras = freq[-n_palavras:]
    df = df.apply(lambda x: ' '.join([word for word in x.split() if word not in (raras)]))
    return df

def palavras_vazias(df):
    stopwords = pln.Defaults.stop_words
    df = df.apply(lambda x: ' '.join([word for word in x.split() if word not in (stopwords)]))
    return df

def lematizacao(df):
    df = df.apply(lambda x: ' '.join([word.lemma_ for word in pln(x)]))
    return df

def saco_de_palavras(df):
    metodo = CountVectorizer(ngram_range=(1,1), stop_words=pln.Defaults.stop_words)
    X = metodo.fit_transform(df)
    df = pd.DataFrame(X.toarray(), columns=metodo.get_feature_names())
    return df

def tf_idf(df):
    metodo = TfidfVectorizer()
    X = metodo.fit_transform(df)
    df = pd.DataFrame(X.toarray(), columns=metodo.get_feature_names())
    return df


df = pd.read_csv('FACTCKBR.tsv', sep='\t')
df = df.rename(columns={'title': 'titulo'})

df['titulo'] = remove_acentos(df['titulo'])
df['titulo'] = conversao_letras_minusculas(df['titulo'])
df['titulo'] = remove_pontuacao(df['titulo'])
df['titulo'] = remove_numeros(df['titulo'])
df['titulo'] = remove_url(df['titulo'])
df['titulo'] = remove_tag(df['titulo'])
df['titulo'] = palavras_vazias(df['titulo'])
df['titulo'] = lematizacao(df['titulo'])
df['titulo'] = remove_palavras_frequentes(df['titulo'], 20)
df['titulo'] = remove_palavras_raras(df['titulo'], 20)
conjunto_final = tf_idf(df['titulo'])