Classificação de sentimentos em resenhas de filmes

Para quem está acompanhando o curso Processamento de Linguagem Natural com Deep Learning, que está sendo ministrado pelo @erickmf no ISC/TCU, o tópico de estudo nessa semana é a classificação / análise de sentimentos de textos. Os exercícios usam como base de dados as resenhas de filmes do IMDB.

Vídeos

Cadernos Jupyter

Caso queiram discutir a teoria, as técnicas, os exercícios ou tirar dúvidas por aqui, estou à disposição.

Algo que eu acho que poderia melhorar nesses cadernos, do ponto de vista da didática, é que fossem colocadas as importações próximas ao uso, para que o aluno se acostumasse e soubesse de onde vêm as classes que está utilizando. Nesses cadernos o problema é ainda pior que nos anteriores, pois, ao fazer from [biblioteca] import *, dá um certo trabalho descobrir de onde vem cada coisa.

3 Curtidas

Considerando que o fórum da fast.ai está sem seção específica para o curso de NLP, o que a turma do EdoDados acharia de hospedar uma thread específica para nosso curso de NLP? Fugiria muito à missão/objetivo do Ecodados, ou ao contrário, permitiria fusionar duas comunidades e multiplicar iniciativas conjuntas?
Gosto muito do Discourse, mas não estou disposto a montar e administrar plataforma própria.
O principal problema que vejo é que cerca de um quinto dos participantes do curso não tem afiliação governamental. Então não tenho certeza se daria um bom match.

Preciso ver isso com @nitai e @NetoFerraz?

4 Curtidas

Também pensei nisso, @erickmf, e vejo que este seria o principal obstáculo – deixar de fora boa parte dos alunos do curso. Iniciei esta thread mais para uma troca de informações isoladas na interseção entre os dois grupos, sem a pretensão de ser nada a mais que isso.

Por outro lado, concordo que seria bom ter um espaço “oficial” para discussões sobre o curso, mas não sei qual seria a solução.

@erickmf eu não estou envolvido com a administração desse espaço. Todavia, se for para dá o meu pitaco na sua sugestão, eu acho que é um ganho mútuo para ambas as partes. Aguardar o @nitai se manifestar.

@augusto.herrmann O Jeremy no curso Deep Learning for Coders deixa claro que isso é uma má prática do ponto de vista de boas práticas de desenvolvimento de software e defende ao importar todo namespace da biblioteca você ganha na dinâmica do uso. Apesar da defesa dele, eu não gosto nenhum pouco de fazer a importação global da bilbioteca.

O @erickmf comentou na última aula que isso que ele faz pode ser bom para a análise exploratória, mas não é bom para a didática de um curso. Já para colocar código em produção, como foi comentado por um outro colega, é outra história. Resumindo:

  • curso: importar próximo ao uso facilita a aprendizagem, para memorizar de onde vem a classe e entender melhor o código
  • análise exploratória: importar a biblioteca toda dá agilidade (argumento do Jeremy)
  • código em produção: colocar as importações todas no início facilita a manutenção de dependências

Destrinchei um pouco uma parte do caderno 3 que não foi explicada, ou foi pouco explicada, no vídeo.

.c2i é um objeto da CategoryList da biblioteca FastAI que facilita transformar a categoria em sua representação numérica. Semelhante ao .stoi e .itos que vimos anteriormente.

Mas, neste caso, a biblioteca não oferece a transformação inversa (.i2c).

positive = y.c2i['positive']
negative = y.c2i['negative']

type(y), positive, negative
(fastai.data_block.CategoryList, 1, 0)

As seguintes linhas estão no caderno original, mas os objetos ainda não estão definidos neste ponto do código.

# undefined
# len(p1), len(p0)
# undefined
# v.itos[0]

Sequência de '0’s (negativo) ou '1’s (positivo) para os dados de treino.

y.items
array([0, 1, 0, 1, ..., 0, 1, 0, 0])

Seleciona na matriz trn_term_doc (contendo a frequência de termos do vocabulário para cada documento), somente as resenhas negativas.

x[y.items==negative]
<417x6008 sparse matrix of type '<class 'numpy.int64'>'
	with 60554 stored elements in Compressed Sparse Row format>

Vejamos um pedaço da matriz para ficar mais fácil compreender.

x[y.items==negative].todense()[:5,:5]
matrix([[ 8,  0,  1,  0,  0],
        [ 4,  0,  1,  0,  0],
        [12,  0,  1,  0,  0],
        [ 4,  0,  1,  0,  0],
        [ 4,  0,  1,  0,  0]])

O método .sum(), sem parâmetros, soma todos os elementos da matriz, retornando um escalar.

x[y.items==negative].todense()[:5,:5].sum()

37

Pode-se passar um parâmetro, sendo 0 correspondente a primeira dimensão (soma-se as linhas) ou 1 sendo a segunda dimensão (soma-se as colunas).

x[y.items==negative].todense()[:5,:5].sum(0)

matrix([[32,  0,  5,  0,  0]])

x[y.items==negative].sum(0)

matrix([[7154,    0,  417,    0, ...,    0,    3,    3,    3]], dtype=int64)

np.squeeze(np.asarray()) é uma sequência de operações para transformar de matriz (2 dimensões) em array (1 dimensão).

np.asarray(x[y.items==negative].sum(0))

array([[7154,    0,  417,    0, ...,    0,    3,    3,    3]], dtype=int64)

np.squeeze(np.asarray(x[y.items==negative].sum(0)))

array([7154,    0,  417,    0, ...,    0,    3,    3,    3], dtype=int64)

np.squeeze(np.asarray(x[y.items==positive].sum(0)))

array([6468,    0,  383,    0, ...,    3,    0,    0,    0], dtype=int64)
1 Curtida

Alguém conseguiu rodar o caderno todo? Para mim sempre dá crash no kernel nesta parte:

p0 = np.squeeze(np.array(xx[neg].sum(0)))
p1 = np.squeeze(np.array(xx[pos].sum(0)))

Fala, @erickmf! :v:t5:

A proposta de fusionar as duas comunidades é ótima. Mas realmente esbarramos na restrição que criamos quanto à vinculação das pessoas. Essa restrição é uma forma de controle e identificação em casos extremos de mau uso da plataforma. Se algum dos outros administradores (@augusto.herrmann @vitor.bellini) achar que pode dar certo, sugiro fazermos uma conversa. Talvez eu que esteja pessimista… :grimacing:

Análise interessante do caderno da fast.ai, @augusto.herrmann. Essa é uma das razões para consolidar um fórum para o curso, de modo a que todos possam compartilhar facilmente essas observações mais ricas, inadaptadas para o WhatsApp. Caso não consigamos o match com o EcoDados, utilizaremos o fórum Discourse da fast.ai mesmo, ainda que não tenha seção própria para o curso de NLP.

1 Curtida

Prefiro me abster dessa decisão para me resguardar quanto ao conflito de interesses. Sou aluno do curso e não posso me colocar na posição de propor uma mudança de escopo ou de regra que me beneficiaria. Você chegou a conversar sobre isso com o @vitor.bellini?

1 Curtida