SlideShare uma empresa Scribd logo
1 de 155
Tópicos de machine learning
Classificação de textos




                                    @josevalim
               http://blog.plataformatec.com.br
Quem sou eu?
Mestrado na Itália com tese em
    classificação de textos
Desenvolvedor Ruby a mais de
 3 anos, contribuidor ativo do
           Rails Core
Motivação
Nas últimas décadas, a robótica
desbravou a visão computacional.
    O que vêm em seguida?
Em 2006, o Google indexou mais
 de 25 bilhões de documentos
95% de todos os e-mails
  enviados são spams
O que é classificação de texto?
É a assinalação de forma
automática de um documento a
   um pré-definido grupo de
    classes baseada em seu
           conteúdo
Conteúdo


• Pré-processamento
• Classificadores
• Medidas
Conteúdo


• Pré-processamento
  - Remoção de stop words
  - Representação
  - Stemming
  - Pesagem
• Classificadores
• Medidas
Remoção de stop words
Stop words são palavras em um
texto desprovidas de semântica
Assunto: Especificações do
protocolo http

Eu preciso das especificações,
ou pelo menos, uma
interpretação verbosa das
especificações do protocolo
http. Artigos técnicos ou
referência a livros também
seriam de grande ajuda.
Assunto: Especificações do
protocolo http

Eu preciso das especificações,
ou pelo menos, uma
interpretação verbosa das
especificações do protocolo
http. Artigos técnicos ou
referência a livros também
seriam de grande ajuda.
Assunto: Especificações do
protocolo http                  especificações protocolo http

Eu preciso das especificações,   preciso especificações pelo
ou pelo menos, uma              menos interpretação verbosa
interpretação verbosa das       especificações protocolo http
especificações do protocolo      artigos técnicos referência
http. Artigos técnicos ou       livros também seriam grande
referência a livros também      ajuda
seriam de grande ajuda.
Representação
A representação mais comum é
  em saco de palavras (bag of
           words)
especificações protocolo http

preciso especificações pelo
menos interpretação verbosa
especificações protocolo http
artigos técnicos referência
livros também seriam grande
ajuda
especificações protocolo http   Palavra   Peso
preciso especificações pelo
menos interpretação verbosa
especificações protocolo http
artigos técnicos referência
livros também seriam grande
ajuda
especificações protocolo http      Palavra      Peso
preciso especificações pelo     especificações    3
menos interpretação verbosa
especificações protocolo http
artigos técnicos referência
livros também seriam grande
ajuda
especificações protocolo http      Palavra      Peso
preciso especificações pelo     especificações    3
menos interpretação verbosa      protocolo      2
especificações protocolo http
artigos técnicos referência
livros também seriam grande
ajuda
especificações protocolo http      Palavra      Peso
preciso especificações pelo     especificações    3
menos interpretação verbosa      protocolo      2
especificações protocolo http   interpretação    1
artigos técnicos referência
livros também seriam grande
ajuda
especificações protocolo http      Palavra      Peso
preciso especificações pelo     especificações    3
menos interpretação verbosa      protocolo      2
especificações protocolo http   interpretação    1
artigos técnicos referência       artigos       1
livros também seriam grande
ajuda
especificações protocolo http      Palavra      Peso
preciso especificações pelo     especificações    3
menos interpretação verbosa      protocolo      2
especificações protocolo http   interpretação    1
artigos técnicos referência       artigos       1
livros também seriam grande
ajuda                              ajuda        1
Stemming
Stemming mapeia cada termo
de um documento para sua raiz
        (morfológica)
andei, andou, andamos
andei, andou, andamos => andar
Pesagem
Pesagem por frequência
Palavra      Peso
especificações    3
  protocolo      2
interpretação    1
   artigos       1
    ajuda        1
Pesagem por TF-IDF
Pesagem por TF-IDF
Pesagem por TF-IDF
Pesagem por TF-IDF

Term frequency
Pesagem por TF-IDF

Term frequency

   Palavra      Peso
especificações    3
  protocolo      2
interpretação    1
   artigos       1
    ajuda        1
Pesagem por TF-IDF

Term frequency         *

   Palavra      Peso
especificações    3
  protocolo      2
interpretação    1
   artigos       1
    ajuda        1
Pesagem por TF-IDF

Term frequency         *

   Palavra      Peso
especificações    3
  protocolo      2
interpretação    1
   artigos       1
    ajuda        1
Pesagem por TF-IDF

                           Inverse document
Term frequency         *
                               frequency
   Palavra      Peso
especificações    3
  protocolo      2
interpretação    1
   artigos       1
    ajuda        1
Pesagem por TF-IDF

                              Inverse document
Term frequency         *
                                  frequency
   Palavra      Peso
especificações    3
  protocolo      2
                           idf(tk) = log |N / df(tk)|
interpretação    1
   artigos       1
    ajuda        1
Conteúdo


• Pré-processamento
  - Remoção de stop words
  - Representação
  - Stemming
  - Pesagem
• Classificadores
• Medidas
Conteúdo


• Pré-processamento
• Classificadores
  - Naive bayes
  - k nearest neighbors
  - Rocchio classifier
  - Support vector machines
• Medidas
Naive Bayes
Modelo matématico simples
Baseado no Teorema de Bayes
P(ci|dj)
P(ci|dj) =
P(ci|dj) = P(ci)
P(ci|dj) = P(ci) *
P(ci|dj) = P(ci) * P(dj|ci)
P(ci|dj) = P(ci) * P(dj|ci) / P(dj)
Exemplo: duas classes, cinco
  documentos de exemplo
Document                    Class
Ruby is a dynamic language              Language
Ruby has color between pink and red     Gemstone
Gems is a ruby packaging system         Language
Ruby is one of the four precious gems   Gemstone
The Ruby language was born in Japan     Language
Document                    Class
Ruby is a dynamic language              Language
Ruby has color between pink and red     Gemstone
Gems is a ruby packaging system         Language
Ruby is one of the four precious gems   Gemstone
The Ruby language was born in Japan     Language
Term      Language   Gemstone
 ruby         3          2
 gems         1          1
dynamic       1          0
language      2          0
  color       0          1
   pink       0          1
   red        0          1
 package      1          0
precious      0          1
  japan       1          0
(valor inicial + ocorrencias de wk em ci)
P(wk|ci) =
               (peso do valor inicial + numero de
                      documentos em ci)
(0.5 + ocorrencias de wk em ci)
P(wk|ci) =
             (1 + numero de documentos em ci)
Term         Language       Gemstone
 ruby      (0.5+3) / (1+3) (0.5+2) / (1+2)
 gems      (0.5+1) / (1+3) (0.5+1) / (1+2)
dynamic    (0.5+1) / (1+3)   (0.5+0) / (1+2)
language   (0.5+2) / (1+3)   (0.5+0) / (1+2)
  color    (0.5+0) / (1+3)   (0.5+1) / (1+2)
   pink    (0.5+0) / (1+3)   (0.5+1) / (1+2)
   red     (0.5+0) / (1+3)   (0.5+1) / (1+2)
 package   (0.5+1) / (1+3)   (0.5+0) / (1+2)
precious   (0.5+0) / (1+3)   (0.5+1) / (1+2)
  japan    (0.5+1) / (1+3)   (0.5+0) / (1+2)
Term      Language   Gemstone
 ruby        0.88       0.83
 gems        0.38       0.5
dynamic      0.38       0.17
language     0.62       0.17
  color      0.12       0.5
   pink      0.12       0.5
   red       0.12       0.5
 package     0.38       0.17
precious     0.12       0.5
  japan      0.38       0.17
A qual classe pertence o documento:
  “My ruby gems arrived in a pink
              package”
A qual classe pertence o documento:
  “My ruby gems arrived in a pink
              package”
P(language|d) = P(ci) * P(d|ci) / P(d)
P(language|d) = P(ci) * P(d|ci) / P(d)
P(language|d) = P(ci) * P(d|ci) / P(d)

documentos em language /
  total documentos = 0.6
P(language|d) = P(ci) * P(d|ci) / P(d)

documentos em language /
  total documentos = 0.6
P(language|d) = P(ci) * P(d|ci) / P(d)

documentos em language /
  total documentos = 0.6

 P(ruby|language) * P(gems|language) *
 P(pink|language) * P(package|language)
P(language|d) = P(ci) * P(d|ci) / P(d)

documentos em language /
  total documentos = 0.6

 P(ruby|language) * P(gems|language) *
 P(pink|language) * P(package|language)
P(language|d) = P(ci) * P(d|ci) / P(d)

documentos em language /
  total documentos = 0.6

 P(ruby|language) * P(gems|language) *
 P(pink|language) * P(package|language)



                                Não importa ...
P(gemstone|d) = P(ci) * P(d|ci) / P(d)
P(gemstone|d) = P(ci) * P(d|ci) / P(d)
P(gemstone|d) = P(ci) * P(d|ci) / P(d)

documentos em gemstone /
  total documentos = 0.4
P(gemstone|d) = P(ci) * P(d|ci) / P(d)

documentos em gemstone /
  total documentos = 0.4
P(gemstone|d) = P(ci) * P(d|ci) / P(d)

documentos em gemstone /
  total documentos = 0.4

 P(ruby|gemstone) * P(gems|gemstone) *
 P(pink|gemstone) * P(package|gemstone)
P(gemstone|d) = P(ci) * P(d|ci) / P(d)

documentos em gemstone /
  total documentos = 0.4

 P(ruby|gemstone) * P(gems|gemstone) *
 P(pink|gemstone) * P(package|gemstone)
P(gemstone|d) = P(ci) * P(d|ci) / P(d)

documentos em gemstone /
  total documentos = 0.4

 P(ruby|gemstone) * P(gems|gemstone) *
 P(pink|gemstone) * P(package|gemstone)



                                Não importa ...
P(language|d) = 0.6 * 0.88 * 0.38 * 0.12 * 0.38 / P(d)
P(language|d) = 0.6 * 0.88 * 0.38 * 0.12 * 0.38 / P(d)

 P(gemstone|d) = 0.4 * 0.83 * 0.5 * 0.5 * 0.17 / P(d)
P(language|d) = 0.6 * 0.88 * 0.38 * 0.12 * 0.38 / P(d)

 P(gemstone|d) = 0.4 * 0.83 * 0.5 * 0.5 * 0.17 / P(d)


          P(language|d) = 0.009149 / P(d)
P(language|d) = 0.6 * 0.88 * 0.38 * 0.12 * 0.38 / P(d)

 P(gemstone|d) = 0.4 * 0.83 * 0.5 * 0.5 * 0.17 / P(d)


          P(language|d) = 0.009149 / P(d)

           P(gemstone|d) =0.014110 / P(d)
P(language|d) = 0.6 * 0.88 * 0.38 * 0.12 * 0.38 / P(d)

 P(gemstone|d) = 0.4 * 0.83 * 0.5 * 0.5 * 0.17 / P(d)


          P(language|d) = 0.009149 / P(d)

           P(gemstone|d) =0.014110 / P(d)

            P(gemstone|d) > P(language|d)
P(language|d) = 0.6 * 0.88 * 0.38 * 0.12 * 0.38 / P(d)

 P(gemstone|d) = 0.4 * 0.83 * 0.5 * 0.5 * 0.17 / P(d)


          P(language|d) = 0.009149 / P(d)

           P(gemstone|d) =0.014110 / P(d)

            P(gemstone|d) > P(language|d)

           d pertence à classe gemstone
Considera que as palavras em
    um documento são
      independentes
Simples e rápido
k-nearest neighbor (k-nn)
Representa documentos no espaço
como um vetor em função dos seus
             pesos
Um documento é classificado ao
analizar os k documentos mais
        próximos a ele
Document                    Class
Ruby is a dynamic language              Language
Ruby has color between pink and red     Gemstone
Gems is a ruby packaging system         Language
Ruby is one of the four precious gems   Gemstone
The Ruby language was born in Japan     Language
<ruby, language, dynamic, gems, color, pink, red, package, precious, japan>

                   <1, 1, 1, 0, 0, 0, 0, 0, 0, 0>
                   <1, 0, 0, 1, 1, 1, 1, 0, 0, 0>
                   <1, 0, 0, 1, 0, 0, 0, 1, 0, 0>
                   <1, 0, 0, 1, 0, 0, 0, 0, 1, 0>
                   <1, 1, 0, 0, 0, 0, 0, 0, 0, 1>
A qual classe pertence o documento:
  “My ruby gems arrived in a pink
              package”
<ruby, language, dynamic, gems, color, pink, red, package, precious, japan>

                   <1, 1, 1, 0, 0, 0, 0, 0, 0, 0>
                   <1, 0, 0, 1, 1, 1, 1, 0, 0, 0>
                   <1, 0, 0, 1, 0, 0, 0, 1, 0, 0>
                   <1, 0, 0, 1, 0, 0, 0, 0, 1, 0>
                   <1, 1, 0, 0, 0, 0, 0, 0, 0, 1>
                   <1, 0, 0, 1, 0, 1, 0, 1, 0, 0>
Documents               Distance     Class

<1, 1, 1, 0, 0, 0, 0, 0, 0, 0>      5       Language
<1, 0, 0, 0, 1, 1, 1, 0, 0, 0>      4       Gemstone
<1, 0, 0, 1, 0, 0, 0, 1, 0, 0>      1       Language
<1, 0, 0, 1, 0, 0, 0, 0, 1, 0>      3       Gemstone
<1, 1, 0, 0, 0, 0, 0, 0, 0, 1>      5       Language
<1, 0, 0, 1, 0, 1, 0, 1, 0, 0>
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
Para k = 1
5   4   3   2   1   ?




                        language
                        gemstone
Documento pertence a language
Para k = 3
5   4   3   2   1   ?




                        language
                        gemstone
Documento pertence a gemstone
Porém, k-nn sempre precisa de
   todos os dados de treino
Classificador pesado e lento
Rocchio classifier
Similar ao k-nn, porém
representa os documentos
     como uma média
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
5   4   3   2   1   ?




                        language
                        gemstone
Para classificar um documento,
 calculamos a sua distância às
             médias
3.5

5   4   3    2     1   ?



            3.66



                                 language
                                 gemstone
Documento pertence a gemstone
Rocchio é leve e rápido, porém
 possui um problema óbvio...
?
?
Support Vector Machines
         (SVM)
Teoria matemática complexa
Também representa os documentos
          no espaço
Acha um hiperplano que divide o
espaço dos documentos em dois
5   4   3   2   1




                    language
                    gemstone
language
gemstone
language
gemstone
Calcular este hiperplano,
geralmente exige muito
    processamento
Porém classificar um documento é
rápido, basta determinar qual lado
      do hiperplano ele está
language
gemstone
?




    language
    gemstone
?




    language
    gemstone
Conteúdo


• Pré-processamento
• Classificadores
  - Naive bayes
  - k nearest neighbors
  - Rocchio classifier
  - Support vector machines
• Medidas
Conteúdo


• Pré-processamento
• Classificadores
  - Naive bayes
  - k nearest neighbors
  - Rocchio classifier
  - Support vector machines
• Medidas
Medidas
Analisar um classificador por
   sua acurácia é errado
Classe real

                 p                 n
            Verdadeiro       Falso
          p
Classe       Positivo       Positivo
predita        Falso       Verdadeiro
          n
              Negativo      Negativo
Acurácia = (VP + VN) / (VP + VN + FP + FN)
A acurácia esconde potenciais
   falso positivos ou falso
          negativos
Use precisão e revocação
Precisão = VP / (VP + FP)
Revocação = VP / (VP + FN)
Alta precisão significa poucos
 falso positivos, alta revocação
equivale a poucos falso negativos
Alguns resultados...
Dataset da Reuters - RCV1-v2
Precisão      Revocação

100%
         94.5                                      93.4 92.2
                              92.3
87.5%                  89.9
                                            85.5
                80.3
 75%                                 75.7


62.5%

 50%
        Naive Bayes      k-NN        Rocchio         SVM
No geral, SVM possui os melhores
            resultados
Naive Bayes possui altíssima
precisão, excelente para filtros
           anti-spam
Conteúdo


• Pré-processamento
• Classificadores
• Medidas
?!
                      @josevalim
 http://blog.plataformatec.com.br

Mais conteúdo relacionado

Mais de Plataformatec

Do your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf URDo your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf URPlataformatec
 
Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011Plataformatec
 
As reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São PauloAs reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São PauloPlataformatec
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Plataformatec
 
Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Plataformatec
 
Railties - Ruby Masters Conf - 26Feb2011
Railties - Ruby Masters Conf - 26Feb2011Railties - Ruby Masters Conf - 26Feb2011
Railties - Ruby Masters Conf - 26Feb2011Plataformatec
 
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010Plataformatec
 
Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Plataformatec
 
CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010Plataformatec
 
Rails 3 - RS on Rails - 21aug2010
Rails 3 - RS on Rails - 21aug2010Rails 3 - RS on Rails - 21aug2010
Rails 3 - RS on Rails - 21aug2010Plataformatec
 
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010Plataformatec
 
Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010Plataformatec
 
The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010Plataformatec
 
DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010Plataformatec
 
Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009Plataformatec
 
Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009Plataformatec
 

Mais de Plataformatec (16)

Do your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf URDo your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf UR
 
Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011
 
As reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São PauloAs reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
 
Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011
 
Railties - Ruby Masters Conf - 26Feb2011
Railties - Ruby Masters Conf - 26Feb2011Railties - Ruby Masters Conf - 26Feb2011
Railties - Ruby Masters Conf - 26Feb2011
 
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
 
Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010
 
CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010
 
Rails 3 - RS on Rails - 21aug2010
Rails 3 - RS on Rails - 21aug2010Rails 3 - RS on Rails - 21aug2010
Rails 3 - RS on Rails - 21aug2010
 
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
 
Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010
 
The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010
 
DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010
 
Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009
 
Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009
 

Classificação de textos - Dev in Sampa - 28nov2009