Monografia Luciana Paulo
Monografia Luciana Paulo
Monografia Luciana Paulo
Nos últimos tempos, com o crescimento das redes sociais e a quantidade massiva de dados
produzida diariamente pelos usuários dessas redes, houve também um aumento de interesse
em obter informações úteis a partir desses dados. Nesse contexto surgiu o termo análise de
sentimentos referindo-se à aplicação de algoritmos capazes de extrair conteúdo subjetivo de
amostras de dados. O tipo mais comum de análise de sentimentos é a classificação de textos
pela sua polaridade, separando os textos que expressam opiniões positivas dos que expres-
sam opiniões negativas. Essa separação é feita por uma função chamada classificador. Este
trabalho se propõe a resolver o problema de classificação de textos, mais especificamente
de resenha de filmes, proposto pelo site Kaggle na competição Bag of Words Meets Bags of
Popcorn. A solução proposta envolve a criação de um string kernel customizado capaz de
fazer análise de sentimentos com SVM e linguagem Python.
i
Abstract
Recently with the social network’s growth and the massive amount of data produced daily
by those network’s users, there was also a rise of interest on obtaining useful information
from this data. In this context, the term sentiment analysis has appeared, referring to the
application of algorithms capable of extracting subjective content from data samples. The
most common type of sentiment analysis is the classification of texts by their polarity,
separating the texts that express positive opinions from the ones that express negative
opinions. This separation is done by a function called classifier. This work is about solving
the text classification problem specifically involving movie reviews, proposed by Kaggle’s
website in the Bag of Words Meets Bags Of Popcorn contest. The proposed solution consists
of a new custom string kernel capable of doing sentiment analysis with SVM and Python
programming language.
Keywords: classifier, SVM, custom kernel, sentiment analysis, python, movie review.
ii
Sumário
1 Introdução 1
1.1 Os problemas da classificação de textos . . . . . . . . . . . . . . . . . . . . . 1
1.2 Motivação e objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Organização do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Conceitos 4
2.1 Aprendizado Supervisionado . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Etapas do Aprendizado Supervisionado . . . . . . . . . . . . . . . . . . . . . 5
2.3 Pré-processamento de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.1 Tokenização e POS Tagging . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.2 Stemização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.3 Bag of Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.4 Tf-idf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Máquinas de Vetores de Suporte . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 Kernel 11
3.1 Definição de Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Kernel Proposto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Gap-Weighted Subsequences Kernel . . . . . . . . . . . . . . . . . . . . . . . 14
3.3.1 Gap-Weighted Subsequences Kernel versão com Programação Dinâmica 16
3.3.2 Corretude da Recursão e Complexidade . . . . . . . . . . . . . . . . . 17
3.4 Adaptação para o Kernel Customizado . . . . . . . . . . . . . . . . . . . . . 17
3.5 Kernel Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
iii
SUMÁRIO iv
5 Conclusões 30
5.1 Considerações Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 Sugestões de Melhoria na Implementação . . . . . . . . . . . . . . . . . . . . 33
5.2.1 Pré-processamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.2.2 Cálculo da Matriz de Gramian . . . . . . . . . . . . . . . . . . . . . . 33
5.2.3 Algoritmo do SVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6 Subjetivo 35
Referências Bibliográficas 37
Capítulo 1
Introdução
1
1.2 MOTIVAÇÃO E OBJETIVOS 2
Conceitos
Este capítulo apresenta um resumo de toda a teoria que foi estudada para a imple-
mentação do kernel. É importante salientar que existem diferentes métodos e abordagens
para a resolução do problema estudado, porém apenas as metodologias e técnicas que foram
incorporadas à solução proposta serão descritas.
4
2.2 ETAPAS DO APRENDIZADO SUPERVISIONADO 5
podendo ser separada em algumas categorias, sendo uma delas o aprendizado supervisionado.
Nessa categoria, os algoritmos de aprendizado supervisionado usam como base um con-
junto de dados ou instâncias, em que cada instância é representada por uma série de carac-
terísticas (features) com um atributo importante em particular que pode ser definido como
o atributo-alvo. Os algoritmos tentam construir um modelo com esse conjunto de dados
iniciais e, a partir daí, usá-lo para prever o atributo-alvo de novas instâncias na amostra,
conhecendo apenas as suas features Garreta e Moncecchi (2013).
Quando o atributo-alvo é um conjunto de valores discretos, como uma lista de espécies
de flores, diz-se que o problema tratado pelo aprendizado supervisionado é um problema
de classificação. Quando é um conjunto contínuo, como os números reais, trata-se de um
problema de regressão.
Um conhecido exemplo, geralmente utilizado no ensino de aprendizado supervisionado,
é a classificação de flores da espécie Íris. A ideia é encontrar o atributo-alvo que define cada
flor, que no caso é a sua subespécie, tendo em mãos apenas a largura e o comprimento de
suas pétalas e sépalas1 .
Uma forma de aplicar a tokenização é por meio do método de POS Tagging (Part-of-
Speech Tagging). A técnica consiste em determinar se um termo é um adjetivo, verbo, subs-
tantivo, advérbio etc, considerando a gramática e o contexto da palavra no texto, analisando
também as palavras adjacentes e outros termos a ela relacionados.
As versões mais simples de POS Tagging apenas separam as palavras segundo sua clas-
sificação gramatical. Versões aprimoradas consideram a semântica. Vale ressaltar que uma
mesma palavra pode ser gramaticalmente classificada em um ou outro tipo, de acordo com
a função dela na frase como um todo. Por exemplo, na frase "O jantar está pronto", a pala-
vra "jantar" é gramaticalmente definida como substantivo, enquanto que na frase "Eu vou
jantar em casa hoje", a mesma palavra assume a função de verbo.
Aplicando-se o método de POS-Tagging à segunda frase usada como exemplo no pará-
grafo anterior, obteria-se uma classificação que pode ser demonstrada na forma de um vetor
chave: valor, onde cada palavra da sentença seria uma chave e cada classe gramatical seria
seu respectivo valor. A classificação seria como no exemplo a seguir:
["Eu": pronome, "vou": verbo, "jantar": verbo, "em": preposição, "casa": subs-
tantivo, "hoje": advérbio]
2.3.2 Stemização
A stemização consiste na redução de palavras que sofreram derivação, ou que foram
flexionadas, à suas respectivas raízes (do inglês, stem, ou tronco).
A base da palavra não necessariamente corresponde à sua raiz morfológica, e pode até
não ser uma palavra válida quando olhada fora do contexto da stemização, porém basta que
ela seja uma raiz comum à várias palavras que a ela podem ser mapeadas.
Por exemplo, se forem consideradas as palavras "natural", "naturalização" e "natureza",
durante o processo de stemização, elas seriam reduzidas à raiz comum "natur", que não é
uma raiz gramatical válida.
Ao longo do capítulo de implementação serão mostrados exemplos da aplicação das téc-
nicas descritas acima fazendo uso das próprias resenhas que foram utilizadas como base de
dados para o trabalho, especificando também quais bibliotecas e funções dentre as tecnolo-
gias adotadas permitiram a aplicação dessas técnicas aos textos.
Com base nas frases, monta-se o vetor de características, que é basicamente uma lista de
todas as palavras contidas em ambos os textos, sem repetição:
Usando os índices da lista, cada frase é reescrita como um vetor de dez posições:
1. [1, 2, 1, 1, 2, 0, 0, 0, 1, 1]
2. [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
Cada entrada do vetor refere-se à quantidade de vezes que aquela palavra, da lista de
características, aparece na frase em questão, formando um histograma. Por exemplo, no
primeiro vetor, que corresponde ao primeiro texto, a palavra "likes" aparece duas vezes,
portanto sua entrada tem o valor 2, enquanto que no segundo vetor ela aparece apenas uma
vez, e sua entrada guarda o valor 1.
2.3.4 Tf-idf
Tf-idf, do inglês Term frequency-inverse document frequency, é uma medida para calcular
a importância de uma palavra, também chamada de termo, em um documento, baseada na
frequência em que ela aparece em todos os documentos do conjunto.
Se uma palavra aparece várias vezes no documento, ela é considerada importante, ga-
nhando uma nota alta. Porém, se ela aparece em muitos documentos, ela não deve ser usada
como identificador, recebendo uma nota baixa.
O cálculo do Tf-idf é feito em duas fases: a primeira define a frequência do termo (Tf )
e a segunda, o inverso da frequência nos documentos (idf ). A frequência do termo é dada
pela quantidade de vezes que o termo se repete no texto, dividido pelo tamanho do texto,
normalizando o valor, de forma a considerar que alguns documentos são mais longos que
outros.
T otal de textos
IDF (t) = ln
Quantidade de textos em que o termo t aparece
Kernel
Neste capítulo será apresentada uma proposta de solução para o problema de classifi-
cação subjetiva de resenhas de filmes na forma de um string kernel customizado. O kernel
desenvolvido foi idealizado pelo professor Marco Dimas Gubitoso durante uma das reuniões
realizadas ao longo do ano.
2. Em condições especifícas, toda função de kernel pode ser expressa como um produto
interno de algum espaço2
Funções de kernel são particularmente úteis quando os dados não estão no formato
aceito pelo classificador, geralmente numérico. Nesses casos existem duas possibilidades:
Representar os dados no formato numérico (nem sempre é trivial); Utilizar uma matriz de
kernel, também chamada de matriz de Gramian, para que ela sirva de produto interno para
o algoritmo de classificação.
Além disso, funções de kernel permitem que os algoritmos de classificação trabalhem
com um espaço de features de dimensão muito alta de forma implícita, sem a necessidade
de calcular as coordenadas de cada registro nesse espaço.
A figura abaixo ilustra o uso de kernels em SVM. A função de kernel, dada por K(x, z) =
< ϕ(x), ϕ(z) >, calcula produtos internos para cada par de instâncias (x, z) do espaço de
1
http://www.quora.com/What-are-Kernels-in-Machine-Learning-and-SVM
2
http://en.wikipedia.org/wiki/Mercer’s_theorem
11
3.2 KERNEL PROPOSTO 12
Figura 3.1: Estágios na Aplicação de Métodos de Kernel; fonte: Shawe-Taylor e Cristianini (2004)
servem como intensificadores dos adjetivos. Assim, considerando o exemplo do seguinte par
de reviews:
1. "The movie is interesting and the plot is very good. The characters are
funny and very adorable."
2. "The story is different and the movie is very good and funny. There are
great and adorable characters acting."
Seriam filtrados adjetivos e advérbios, sempre mantendo a ordem em que eles apare-
cem nas frases, preservando expressões como "very good" e a intensificação que o advérbio
proporciona ao adjetivo:
Kij (x1 (i), x2 (j)) interesting very good funny very adorable
different 0 0 0 0 0 0
very 0 8 8 0 0 0
good 0 8 10 8 0 0
funny 0 0 8 8 0 0
great 0 0 0 0 0 0
adorable 0 0 0 0 0 1
A tabela acima é preenchida de forma que cada posição da matriz K(x1 , x2 ) representa
o peso de uma palavra dentro das duas resenhas. Cada posição (i, j) da matriz, quando não
zerada, indica que a palavra pertence a uma das duas classes:
O peso de cada posição (i, j) aumenta cada vez que uma palavra vizinha é descoberta,
criando um cluster em volta da palavra observada.
Para ilustrar melhor a ideia do cluster pode-se observar a palavra "good". A entrada
Kij (”good”, ”good”) tem um peso maior do que a entrada Kij (”very”, ”good”) e que a en-
trada Kij (”good”, ”f unny”). Esse fato se justifica por "good" estar entre os termos "very"
3.3 GAP-WEIGHTED SUBSEQUENCES KERNEL 14
e "funny" em ambos os reviews, enquanto os outros dois termos tem apenas um vizinho co-
mum ("good"). Os valores usados para mostrar qual palavra tem maior peso dentro de cada
expressão encontrada são apenas ilustrativos, o conceito importante é apenas que 10 > 8 > 1.
A partir daí, o peso da matriz seria totalizado (uma ideia era somar todas as entradas
da matriz) e depois o valor seria normalizado. O peso da similaridade seria calculado para
todos os pares de instâncias da amostra e seus valores finais seriam armazenados em uma
matriz de kernel, onde cada entrada representaria o grau de similaridade normalizado de um
par de reviews.
É importante salientar que o modelo descrito acima é apenas um rascunho de como um
kernel poderia ser construído tendo como base a presença de expressões comuns. Uma vez
definida a idéia do kernel, pesquisou-se sobre estudos relacionados a string kernels.
String kernels, como o nome diz, são kernels especializados em calcular a similaridade a
partir de entradas textuais. Um dos kernels já existentes que foi encontrado apresentou um
princípio muito semelhante ao resultado final buscado pelo kernel customizado. Esse modelo
foi usado como base da implementação do kernel idealizado.
1. O kernel considera como subsequências as chamadas substrings. Ele trabalha com sub-
sequências de caracteres dentro de palavras ou frases completas e não com sequências
3.3 GAP-WEIGHTED SUBSEQUENCES KERNEL 15
Para lidar com os espaços entre as letras de uma subsequência, define-se um fator
λ ∈ (0, 1) (fator de decaimento), usado para balancear o peso da feature na sequência
avaliada. Assim, considerando-se uma subsequência u de uma string s, e sendo i o índice
da subsequência na string com u = s(i), denota-se l(i) como o tamanho da string em s que
contém u. O peso da ocorrência de u é calculado por λl(i) .
O vetor de features associado ao kernel para subsequências de tamanho p é I = Σp , onde
Σ é o alfabeto, e a função que calcula o peso de cada subsequência u em uma palavra s é
dada por:
X
φpu (s) = λl(i) , u ∈ Σp
i:u=s(i)
X
Kp (s, t) = hφp (s), φp (t)i = φpu (s)φpu (t)
u∈Σp
O exemplo a seguir mostra como ficaria um kernel não normalizado para as palavras
"cat", "car", "bat" e "bar", fixando o tamanho das subsequências em 2.
φ ca ct at ba bt cr ar br
cat λ2 λ3 λ2 0 0 0 0 0
car λ2 0 0 0 0 λ3 λ2 0
bat 0 0 λ2 λ2 λ3 0 0 0
bar 0 0 0 λ2 0 0 λ2 λ3
Assim, o valor do kernel não normalizado para "cat" e "car" é K(”cat”, ”car”) = λ4 .
4
O valor normalizado é K̂(”cat”, ”car”) = (2λ4λ+λ6 ) = (2 + λ2 )−1 , onde K(”cat”, ”cat”) =
K(”car”, ”car”) = 2λ4 + λ6 .
3.3 GAP-WEIGHTED SUBSEQUENCES KERNEL 16
X
KpS (sa, tb) = λl(i)+l(j)
|s|+1 |t|+1
(i,j)∈Ip ×Ip :sa(i)=tb(j)
|s| |t|
X X X
= [a = b] λ2+|s|−i+|t|−j λl(i)+l(j)
i=1 j=1 i
(i,j)∈Ip−1 j
×Ip−1 :s(i)=t(j)
|s| |t|
X X
= [a = b] λ2+|s|−i+|t|−j Kp−1
S
(s(1 : i), t(1 : j))
i=1 j=1
A partir dessa recorrência é calculada uma matriz auxiliar DPp onde os valores são dados
por:
k X
X l
DPp (k, l) = λk−i+l−j kp−1
S
(s(1 : i), t(1 : j))
i=1 j=1
Por essa matriz auxiliar o kernel pode então ser definido como:
λ2 DP (|s|, |t|) se a = b
p
KpS (sa, tb) =
0 caso contrário
O valor de DPp (k, l) pode então ser calculado recursivamente em termos de DPp (k −1, l),
DPp (k, l − 1) e DPp (k − 1, l − 1):
3.4 ADAPTAÇÃO PARA O KERNEL CUSTOMIZADO 17
k X
X l
DPp (k, l) = λk−i+l−j kp−1
S
(s(1 : i), t(1 : j))
i=1 j=1
S
= kp−1 (s(1 : i)t(1 : j) + λDPp (k, l − 1)
+ λDPp (k − 1, l) − λ2 DPp (k − 1, l − 1)
• Quando i < k e j < l, grupo 4 (segundo, terceiro e quarto termo com o peso invertido)
1. Cada subsequência pesquisada pelo algoritmo seria formada por um conjunto de pala-
vras, mantendo sua ordem de aparição no texto original, e não apenas por um conjunto
de caracteres;
K(x, y) = xT y + c
Assim, quando aplicado ao SVM, o kernel linear cria um hiperplano de separação dos
dados que é basicamente uma linha reta, como na figura a seguir.
O modelo linear foi escolhido como comparativo por dois principais motivos:
• Por ter apresentado os melhores resultados, quando comparados com outros kernels
como o polinomial;
• Por ser um modelo mais simples de kernel, não especificamente direcionado a strings
ou análise de sentimentos. Era interessante, do ponto de vista experimental, comparar
um string kernel complexo, como o criado, com o modelo linear para determinar qual
deles tinha o melhor custo-benefício computacional.
Capítulo 4
4.1.2 Pandas
Pandas2 é uma biblioteca, escrita em linguagem Python, para análise de dados em alta
performance. Utiliza NumPy, um pacote padrão do Python para computar cálculos científi-
1
http://www.python.org
2
http://pandas.pydata.org
20
4.1 TECNOLOGIAS UTILIZADAS 21
cos.
A biblioteca Pandas fornece estrutura de dados novas e ferramentas para sua manipula-
ção, provendo maior facilidade na execução das análises desejadas.
Aqui, utilizou-se uma dessas estruturas, chamada de data-frame. Um data-frame é, uma
estrutura tabular com indexação integrada, ou seja, basicamente é uma estrutura com linhas
e colunas onde cada coluna tem um índice, associado a um conjunto de valores. Cada linha,
portanto, tem vários valores, um deles referente a cada coluna indexada do data-frame.
Abaixo segue um exemplo Reda (2013) ilustrativo da estrutura de um data-frame.
1 data = { ’ y e a r ’ : [ 2 0 1 0 , 2 0 1 1 , 2 0 1 2 , 2 0 1 1 , 2 0 1 2 , 2 0 1 0 , 2 0 1 1 , 2 0 1 2 ] ,
2 ’ team ’ : [ ’ Bears ’ , ’ Bears ’ , ’ Bears ’ , ’ P a c k e r s ’ , ’ P a c k e r s ’ , ’ L i o n s ’ ,
3 ’ Lions ’ , ’ Lions ’ ] ,
4 ’ wins ’ : [ 1 1 , 8 , 1 0 , 1 5 , 1 1 , 6 , 1 0 , 4 ] ,
5 ’ l o s s e s ’ : [ 5 , 8 , 6 , 1 , 5 , 10 , 6 , 12]}
6 f o o t b a l l = pd . DataFrame ( data , columns =[ ’ y e a r ’ , ’ team ’ , ’ wins ’ , ’ l o s s e s ’ ] )
7 football
A biblioteca Pandas foi importante para a leitura e organização dos dados brutos da
resenha, indexando cada uma delas pelo seu rótulo, e transformando o conjunto inicial em
algo mais fácil de ser manipulado por outras funções.
4.1.5 Scikit-Learn
O Scikit-Learn 5 é um conjunto de ferramentas para mineração e análise de dados, cons-
tituindo uma mistura de pacotes como NumPy, SciPy e matplotlib.
Os principais recursos do Scikit-Learn são algoritmos para:
• Regressão: para predição de atributos de valores contínuos para objetos a eles asso-
ciados
• review: texto da resenha, uma ou mais orações contendo a opinião do usuário sobre
determinado filme não identificado.
A linha abaixo foi retirada do conjunto de dados como exemplo de visualização da es-
trutura inicial de uma resenha.
"2951_8" 1 "Yeah, it\’s a chick flick and it moves kinda slow, but it\’s
actually pretty good - and I consider myself a manly man. You
gotta love Judy Davis, no matter what she\’s in, and the girl who
plays her daughter gives a natural, convincing performance.<br
/><br />The scenery of the small, coastal summer spot is be-
autiful and plays well with the major theme of the movie. The
unknown (at least unknown to me) actors and actresses lend a
realism to the movie that draws you in and keeps your attention.
Overall, I give it an 8/10. Go see it."
"Yeah, it\’s a chick flick and it moves kinda slow, but it \’s actually pretty good
- and I consider myself a manly man. You gotta love Judy Davis, no matter what
she \’s in, and the girl who plays her daughter gives a natural, convincing per-
formance.The scenery of the small, coastal summer spot is beautiful and plays
4.3 PRÉ-PROCESSAMENTO - LIMPEZA 24
well with the major theme of the movie. The unknown (at least unknown to me)
actors and actresses lend a realism to the movie that draws you in and keeps
your attention. Overall, I give it an 8/10. Go see it."
"Yeah it’s a chick flick and it moves kinda slow but it’s actually pretty good and
I consider myself a manly man You gotta love Judy Davis no matter what she’s
in and the girl who plays her daughter gives a natural convincing performance
The scenery of the small coastal summer spot is beautiful and plays well with
the major theme of the movie The unknown at least unknown to me actors and
actresses lend a realism to the movie that draws you in and keeps your attention
Overall I give it an 8 10 Go see it"
[(Yeah, UH), (it’s, VB), (a, DT), (chick, NN), (flick, NN), (and, CC), (it,
PRP), (moves, VBZ), (kinda, JJ), (slow, JJ), (but, CC), (it’s, JJ), (actu-
ally, RB), (pretty, RB), (good, JJ), (and, CC), (I, PRP), (consider, VBP),
(myself, PRP), (a, DT), (manly, RB), (man, NN), (Yo, PRP), (gotta, VBP),
(love, VB), (Judy, NNP), (Davis, NNP), (no, DT), (matter, NN), (what, WP),
(she’s, VBZ), (in, IN), (and, CC), (the, DT), (girl, NN), (who, WP), (plays,
VBZ), (her, PRP$), (daughter, NN), (gives, VBZ), (a, DT), (natural, JJ),
(convincing, NN), (performance, NN), (The, DT), (scenery, NN), (of, IN),
(the, DT), (small, JJ), (coastal, JJ), (summer, NN), (spot, NN), (is, VBZ),
(beautiful, JJ), (and, CC), (plays, VBZ), (well, RB), (with, IN), (the, DT),
(major, JJ), (theme, NN), (of, IN), (the, DT), (movie, NN), (The, DT), (unk-
nown, JJ), (at, IN), (least, JJS), (unknown, JJ), (to, TO), (me, PRP), (ac-
tors, NNS), (and, CC), (actresses, NNS), (lend, VBP), (a, DT), (realism, NN),
(to, TO), (the, DT), (movie, NN), (that, IN), (draws, VBZ), (yo, PRP), (in,
IN), (and, CC), (keeps, VB), (your, PRP$), (attention, NN), (Overall, IN), (I,
PRP), (give, VBP), (it, PRP), (an, DT), (8, CD), (10, CD), (Go, NNP), (see,
VBP), (it, PRP)]
• RB: adverb;
[kinda, slow, it’s, actually, pretty, good, manly, natural, small, coastal, beauti-
ful, well, major, unknown, least, unknown]
[kinda, slow, it, actual, pretti, good, man, natur, small, coastal, beauti, well,
major, unknown, least, unknown]
• SVM linear com seleção de características pelo valor tf-idf (TF-IDF Bag)
Tabela 4.1: SVM Linear x SVM Polinomial de grau 2 para 25 mil registros
Mas em poucos testes era visível que a separação era melhor representada em um es-
paço linear, assim foram dispensados os testes com SVM polinomial de grau 3, 4, e 5, e a
comparação do kernel proposto com os outros modelos além do SVM linear.
4.9 Resultados
Como dito anteriormente, na primeira versão do pré-processamento a limpeza era muito
mais branda em relação a quantas palavras eram removidas da resenha, gerando resultados
muito bons. Mas essa forma de limpeza tornava o kernel customizado totalmente inviável,
pois era extremamente demorado para construir a matriz de Gramian.
Por isso foi necessário utilizar uma seleção de características mais focada, mas que ainda
garantisse um bom resultado.
4.9 RESULTADOS 28
Assim, foi necessário diminuir o tamanho da amostra a fim de conseguir colher resultados
comparativos entre as diferentes implementações. Ao final, infelizmente o resultado do kernel
customizado foi o de menor acurária média dentre os experimentos.
4.9 RESULTADOS 29
Conclusões
A análise dos testes mostrou que o método desenvolvido, com o kernel customizado, é
muito custoso computacionalmente, o que forçou o experimento a ser executado com uma
amostra menor do que se desejava a princípio.
Pelos resultados obtidos com os modelos lineares de SVM, pode-ser perceber que a redu-
ção drástica do tamanho da amostra afeta significativamente a taxa de acerto do classificador.
Seguindo por esse caminho, é possível concluir que um dos motivos que levou o kernel cus-
tomizado a obter resultados aquém do esperado foi o tamanho dos conjuntos de dados que
a ele foram submetidos para o treinamento.
Uma observação geral dos resultados aponta para o fato de que o aumento, mesmo
que gradativo da amostra, tende a aumentar a acurácia da classificação. Seguindo por esse
caminho, e tendo como base as pequenas melhorias que o kernel customizado teve quando
houve aumento da amostra de mil para dois mil, e depois para três mil resenhas, concluiu-se
que, num ambiente de maior poder computacional e algumas otimizações no algoritimo, os
valores finais obtidos pelo algoritmo tenderiam a ser melhores com amostras de tamanho
mais significativo.
Porém, observa-se também que, quando comparado às implementações lineares, elas ob-
tiveram porcentagens de acerto que superaram, em média, em 20% a taxa alcançada pelo
kernel customizado. Assim, é provável que, ainda que o kernel customizado fosse aplicado a
conjuntos maiores de entradas, seu resultado não alcançasse o nível de acerto da implemen-
tação linear.
Também concluiu-se que o melhor custo-benefício, em termos de tempo de execução e
porcentagem de acertos, foi obtido pelo algoritmo de SVM linear com aplicação da técnica
de extração de caracteristicas Tf-idf. O percentual obtido por essa versão, apesar de ser
minimamente inferior à taxa da versão que conta apenas com o Bag of Words simples (menor
que 5%), é compensado com o ganho de tempo de processamento pois, para as aplicações
nos vetores de características nos quais foi utilizado o método do POS Tagging, ele foi, em
média, 50% inferior.
Por fim, a implementação do kernel customizado, que de início pareceu promissora,
30
5.1 CONSIDERAÇÕES FINAIS 31
mostrou-se custosa e menos precisa na classificação. Os resultados atingidos não foram tão
bons quanto os esperados e o método de classifição pelo SVM linear com Tf-idf manteve-se
como a melhor opção para o estudo realizado.
Observou-se que, conforme era esperado, palavra como good, great e best tem relevância
na nuvem positiva. Notou-se também a forte presença de advérbios, como much e really
(stemizado como realli ), que não tem necessariamente conotação positiva nem negativa.
Esse fato apoia o uso do método Tf-idf como mediador do peso da frequência das palavras
no texto, pois sem ele, observa-se uma grande relevância para palavras mais genéricas.
1
http://wordle.net
5.2 CONSIDERAÇÕES FINAIS 32
1. Pré-Processamento
3. Algoritmo do SVM
5.2.1 Pré-processamento
Entre os três pontos citados, esse com certeza é o mais fácil de identificar e resolver. E
foi exatamente essa tarefa que, como um trabalho bônus pelo tempo extra, o grupo resolveu
implementar.
Com o intuito também de explorar novas ferramentas e frameworks que são voltadas
para o contexo de Big Data, foi feita a implementação de um pequeno cluster com apenas
2 nós no serviço de virtualização EC2 2 (Elastic Compute Cloud) da AWS (Amazon Web
Services).
O gerenciador de cluster utilizado foi o YARN (Yet Another Resource Negotiator), parte
do framework para computação distribuída Apache Hadoop 3 .
Para disparar a aplicação no YARN e prover paralelismo foi utilizado o framework Apache
Spark 4 , que apesar de se mostrar super simples de programar em Python, infelizmente se
mostrou ainda muito imaturo com relação as funcionalidades das bibliotecas auxiliares, em
especial MLlib (biblioteca de aprendizado computacional).
Rodando sequencialmente em um notebook a limpeza durou 10h 01m 03s (i7-3537U),
enquanto que no cluster com 30 cores virtuais (em /proc/cpuinfo aparece E5-2680) durou
37m 19s. Speedup de 16.24, porém Eficiência de 0.54, o que indica um overhead considerável
devido ao gasto em comunicação.
Mas é possível preencher a matriz de Gramian de forma paralela. E além disso, a matriz
construída para o treinamento possui algumas propriedades que podem reduzir o custo de
processamento.
Como visto no capítulo 4, para o treinamento, a matriz é construida usando como domí-
nio o subconjunto de treino × subconjunto de treino. Devido a isso a matriz é simétrica e
possui apenas 1 na sua diagonal principal.
5
http://www.h20.ai
Capítulo 6
Subjetivo
Paulo
Experiências Comecei a trabalhar com dados (BI) durante o primeiro estágio em 2010,
e no começo desse ano um segundo estágio em análise de dados de fato.
Nesse trabalho houve diversas falhas, e fico feliz por elas terem ocorrido,
várias dessas falhas passariam despercebidas em um ambiente corpora-
tivo, já que normalmente eu não sou o responsável pelo projeto.
Esse trabalho foi desafiador mesmo com a experiência. Decidimos tra-
balhar com textos, o que está muito fora da minha zona de conforto e
decidimos implementar em Python, uma linguagem que não me considero
completamente fluente.
Um ponto importante foram os direcionamentos que o professor Gubi
proporcionou. Em vários momentos nos sentíamos perdidos no que fazer
e qual rumo o projeto deveria caminhar. E as dicas e sugestões sempre
foram muito precisas.
35
36
Luciana
Experiências Começando pelas partes boas, o primeiro fato que posso citar foi o grande
aprendizado que tive fazendo este trabalho, cujo assunto não era algo ao
qual eu estava familiarizada até então. Por meio do trabalho pude apren-
der não só sobre temas atuais e interessantes, diferentes dos que estou
acostumada a ver, mas também a mexer com ferramentas diferentes.
Outro fator positivo foi a decisão de fazer o trabalho em dupla. Foi real-
mente muito bom poder contar com a ajuda de um amigo em todas as
situações que surgiram, pra ajudar a resolver os problemas e pra come-
morar junto quando algo legal era concluído.
Por fim, um ponto muito positivo do nosso TCC deve-se ao professor
Gubi. Seu apoio e direcionamento foi muito importante, ao mesmo tempo
que a liberdade que ele nos deu para tomarmos nossas decisões. Também
não posso deixar de citar sua compreensão com nossos horários e as
divertidas reuniões que ele nos proporcionou. Nós até apelidamos nosso
kernel customizado de Gubi’s kernel.
Quanto aos problema, o tempo, é claro, foi um deles. Cada um de nós
tinha suas próprias atividades, e nem sempre dispúnhamos de todo o
tempo de que gostaríamos.
Além disso, nossa ideia inicial era trabalhar com textos literários e, bem,
ela acabou sendo apenas uma ideia mesmo e tivemos que buscar outro
tema pelo qual ambos se interessavam.
No entanto, a parte mais frustrante foi não ter conseguido lidar com tan-
tos dados quanto gostaríamos, e ter que limitar nossas amostras, fazendo
com que os resultados não saíssem tão bons quanto gostaríamos.
Baccarini et al. (2011) Lane Maria Rabelo Baccarini, Valceres Vieira Rocha e Silva, Benja-
mim Rodrigues De Menezes e Walmir Matos Caminhas. Svm practical industrial applica-
tion for mechanical faults diagnostic. Expert Systems with Applications, 38(6):6980–6984.
Citado na pág. 10
Benamara et al. (2007) Farah Benamara, Carmine Cesarano, Antonio Picariello, Diego Re-
forgiato Recupero e Venkatramana S Subrahmanian. Sentiment analysis: Adjectives and
adverbs are better than adjectives alone. Em ICWSM. Citado na pág. 12
Byun e Lee (2002) Hyeran Byun e Seong-Whan Lee. Applications of support vector
machines for pattern recognition: A survey. Em Pattern recognition with support vector
machines, páginas 213–236. Springer. Citado na pág. 18
Cai et al. (2004) Yu-Dong Cai, Pong-Wong Ricardo, Chih-Hung Jen e Kuo-Chen Chou.
Application of svm to predict membrane protein types. Journal of Theoretical Biology,
226(4):373–376. Citado na pág. 10
Chu et al. (2005) Feng Chu, Guosheng Jin e Lipo Wang. Cancer diagnosis and protein
secondary structure prediction using support vector machines. Em Support Vector Ma-
chines: Theory and Applications, páginas 343–363. Springer. Citado na pág. 10
Garreta e Moncecchi (2013) Raul Garreta e Guillermo Moncecchi. Learning scikit-learn:
Machine Learning in Python. Packt Publishing Ltd. Citado na pág. 4, 5, 9
Gonçalves et al. (2013) Pollyanna Gonçalves, Matheus Araújo, Fabrício Benevenuto e
Meeyoung Cha. Comparing and combining sentiment analysis methods. Em Proceedings
of the first ACM conference on Online social networks, páginas 27–38. ACM. Citado na pág.
1
Kecman (2005) Vojislav Kecman. Support vector machines–an introduction. Em Support
vector machines: theory and applications, páginas 1–47. Springer. Citado na pág. 9
Lodhi et al. (2002) Huma Lodhi, Craig Saunders, John Shawe-Taylor, Nello Cristianini e
Chris Watkins. Text classification using string kernels. The Journal of Machine Learning
Research, 2:419–444. Citado na pág. 14
Ng (2015) Andrew Ng. Aprendizado de máquina - universidade de stanford | coursera.
https://pt.coursera.org/learn/machine-learning, 2015. Último acesso em 05/11/2015. Ci-
tado na pág. 4
Osuna et al. (1997) Edgar Osuna, Robert Freund e Federico Girosi. Training support vector
machines: an application to face detection. Em Computer Vision and Pattern Recognition,
1997. Proceedings., 1997 IEEE Computer Society Conference on, páginas 130–136. IEEE.
Citado na pág. 10
37
REFERÊNCIAS BIBLIOGRÁFICAS 38
Sharma et al. (2014) Richa Sharma, Shweta Nigam e Rekha Jain. Opinion mining of
movie reviews at document level. IJIT International Journal on Information Theory, 3.
Citado na pág. 1