Anda di halaman 1dari 8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK


Portugus (Brasil) Conecte-se (ou Registrar)

Itens Tcnicos

Downloads e Trials

Comunidade

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK


Desenvolva um aplicativo para categorizar feeds RSS usando Python, NLTK e aprendizado por mquina Chris Joakim, Senior Software Engineer, Primedia Inc Resumo: O aprendizado por mquina, que est na interseco entre TI, matemtica e idioma natural, geralmente usado em aplicativos de big data. Este artigo aborda a linguagem de programao Python e sua biblioteca NLTK e aplica-os a um projeto de aprendizado por mquina. Data: 30/Out/2012 Nvel: Intermedirio Tambm disponvel em : Ingls Atividade: 2173 visualizaes Comentrios: 0 (Visualizar | Incluir comentrio - Conectar) Mdia de classificao (6 votos) Classificar este artigo

Iniciante no Python
Este artigo para desenvolvedores de software especialmente aqueles com histrico em Ruby ou Java que esto diante de sua primeira implementao de aprendizado por mquina. O desafio: Usar aprendizado por mquina para categorizar feeds RSS Recentemente, fui encarregado de criar um subsistema de categorizao de feeds RSS para um cliente. O objetivo era ler dezenas ou mesmo centenas de feeds RSS e automaticamente categorizar os vrios artigos em uma das dezenas de reas de assunto predefinidas. O contedo, a navegao e a funcionalidade de procura do website do cliente seriam baseados nos resultados da recuperao e categorizao diria e automatizada de feeds. A cliente sugeriu usar aprendizado por mquina, talvez com Apache Mahout e Hadoop, pois ela havia lido recentemente artigos sobre essas tecnologias. No entanto, a sua equipe de desenvolvimento e a nossa so fluentes em Ruby em vez de tecnologia Java. Este artigo descreve a jornada tcnica, processo de aprendizado e implementao final de uma soluo. O que aprendizado por mquina? Minha primeira pergunta foi: "O que exatamente aprendizado por mquina?". Eu j havia ouvido o termo e sabia vagamente que o supercomputador IBM Watson o usou para derrotar concorrentes humanos em uma partida de Jeopardy. Como comprador e participante de redes sociais, eu tambm sabia que Amazon.com e Facebook fazem timas recomendaes (de produtos e de pessoas) com base em dados sobre os compradores. Em resumo, o aprendizado por mquina est na interseco entre TI, matemtica e linguagem natural. Tem relao principalmente com esses trs tpicos, mas a soluo do cliente acabaria por envolver os dois primeiros: Classificao. Atribuir itens a categorias predefinidas arbitrrias com base em um conjunto de dados de treinamento de itens semelhantes Recomendao. Recomendar itens com base na observao de itens semelhantes Armazenamento em cluster. Identificar subgrupos em uma populao de dados Os desvios com Mahout e Ruby Entendendo o que aprendizado por mquina, a prxima etapa era determinar como implementar. Como a cliente sugeriu, Mahout era um bom ponto de partida. Eu fiz o download do cdigo da Apache e comecei a aprender sobre aprendizado por mquina com Mahout e seu irmo, Hadoop. Infelizmente, descobri que Mahout tem uma curva de aprendizado ngreme, mesmo para um desenvolvedor Java experiente, e que no havia cdigo de amostra funcional. Tambm no havia estruturas ou gems baseados em Ruby para aprendizado por mquina. Encontrando Python e a NLTK Eu continuei procurando uma soluo e sempre encontrava "Python" no conjunto de resultados. Como programador de Ruby, eu sabia que Python era uma linguagem de programao semelhante (orientada a objeto, baseada em texto, interpretada e dinmica), mas eu no havia aprendido a linguagem. Apesar dessas semelhanas, eu no me preocupei em aprender Python ao longo dos anos, pois considerava uma qualificao redundante. Python estava no meu "ponto cego", como acho que deve ser para muitos colegas de Ruby. Procurando por livros sobre aprendizado por mquina e aprofundando-me em seu contedo, descobri que uma grande porcentagem desses sistemas usa Python como linguagem de implementao, juntamente com uma biblioteca chamada Natural Language Toolkit (NLTK). Outras pesquisas relevaram que Python era mais popular do que eu imaginava como, por exemplo, no Google App Engine, YouTube e websites criados com a estrutura Django. At est pr-instalado nas estaes de trabalho Mac OS X que eu uso diariamente! Alm disso, Python oferece bibliotecas padro interessantes (por exemplo, NumPy e SciPy) para matemtica, cincias e engenharia. Quem diria? Decidi buscar uma soluo em Python depois de encontrar exemplos elegantes de cdigo. A linha a seguir, por exemplo, todo o cdigo necessrio para ler um feed RSS atravs de HTTP e imprimir o contedo:
p r i n tf e e d p a r s e r . p a r s e ( " h t t p : / / f e e d s . n y t i m e s . c o m / n y t / r s s / T e c h n o l o g y " )

Conhecendo Python
www.ibm.com/developerworks/br/library/os-pythonnltk/ 1/8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK

Ao aprender uma nova linguagem de programao, a parte fcil geralmente aprender a linguagem em si. A parte difcil aprender seu ecossistema como instalar, incluir bibliotecas, escrever cdigo, estruturar os arquivos de cdigo, executar, depurar, e escrever testes de unidade. Esta seo contm uma breve introduo a esses tpicos. Confira Recursos para obter links para mais informaes. pip O Python Package Index (p i p ) o gerente de pacote padro do Python. o programa usado para incluir bibliotecas no sistema. anlogo aos gems das bibliotecas Ruby. Para incluir a biblioteca NLTK no sistema, o usurio insere o seguinte comando:
$p i pi n s t a l ln l t k

Para exibir uma lista de bibliotecas Python instaladas no sistema, execute este comando:
$p i pf r e e z e

Executando programas Executar um programa Python igualmente simples. Dado um programa chamado locomotive_main.py e trs argumentos, ns compilamos e executamos com o programa p y t h o n :
$p y t h o nl o c o m o t i v e _ m a i n . p ya r g 1a r g 2a r g 3

Python usa a sintaxe i f_ _ n a m e _ _= =" _ _ m a i n _ _ " :na Listagem 1 para determinar se o arquivo est sendo executado na linha de comando ou sendo importado por outro cdigo. Para tornar um arquivo executvel, inclua a deteco de " _ _ m a i n _ _ " . Listagem 1. Deteco de main
i m p o r ts y s i m p o r tt i m e i m p o r tl o c o m o t i v e i f_ _ n a m e _ _= =" _ _ m a i n _ _ " : s t a r t _ t i m e=t i m e . t i m e ( ) i fl e n ( s y s . a r g v )>1 : a p p=l o c o m o t i v e . a p p . A p p l i c a t i o n ( ) . . .a d d i t i o n a ll o g i c. . .

virtualenv A maioria dos programadores de Ruby conhece a questo das bibliotecas de sistema, ou gems. Um conjunto de bibliotecas para todo o sistema no o ideal, pois um dos projetos pode depender da verso 1.0.0 de uma certa biblioteca, enquanto outro projeto depende da verso 1.2.7. Da mesma forma, os desenvolvedores Java conhecem esse problema com CLASSPATH do sistema. Assim como a comunidade Ruby com a ferramenta r v m , a comunidade Python usa a ferramenta v i r t u a l e n v(consulte Recursos para obter o link) para criar ambientes de execuo separados, incluindo verses especficas de Python e um conjunto de bibliotecas. Os comandos na Listagem 2 mostram como criar um ambiente virtual chamado p1_env para o projeto p1, que contm as bibliotecas f e e d p a r s e r ,n u m p y ,s c i p ye n l t k . Listagem 2. Comandos para criar um ambiente virtual com virtualenv
$s u d op i pi n s t a l lv i r t u a l e n v $c d~ $m k d i rp 1 $c dp 1 $v i r t u a l e n vp 1 _ e n vd i s t r i b u t e $s o u r c ep 1 _ e n v / b i n / a c t i v a t e ( p 1 _ e n v ) [ ~ / p 1 ] $p i pi n s t a l lf e e d p a r s e r ( p 1 _ e n v ) [ ~ / p 1 ] $p i pi n s t a l ln u m p y ( p 1 _ e n v ) [ ~ / p 1 ] $p i pi n s t a l ls c i p y ( p 1 _ e n v ) [ ~ / p 1 ] $p i pi n s t a l ln l t k ( p 1 _ e n v ) [ ~ / p 1 ] $p i pf r e e z e

necessrio recuperar o script de ativao do ambiente virtual via "source" cada vez que voc trabalhar com o projeto em uma janela shell. Observe que a linha de comando do shell muda quando o script de ativao recuperado. Ao criar e usar janelas shell no sistema, para navegar mais facilmente para o diretrio de projeto e ativar o ambiente virtual, pode ser til incluir uma entrada como a seguinte no arquivo ~/.bash_profile file:
$a l i a sp 1 = " c d~ / p 1;s o u r c ep 1 _ e n v / b i n / a c t i v a t e "

A estrutura da base de cdigo Aps passar pelos simples programas "Hello World" de uma linha, os desenvolvedores de Python precisam entender como estruturar corretamente sua base de cdigo em relao a diretrios e nomes de arquivo. Java e Ruby tm seus prprios requisitos nesse aspecto, e Python no diferente. Em resumo, Python usa o conceito de pacotes para agrupar cdigo relacionado e criar namespaces inequvocos. Para fins de demonstrao neste artigo, o cdigo est no diretrio-raiz de um certo projeto, como ~/p1. Nesse diretrio, h um diretrio locomotive para o pacote Python do mesmo nome. A Listagem 3 mostra essa estrutura de diretrio.
www.ibm.com/developerworks/br/library/os-pythonnltk/ 2/8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK

Listagem 3. Estrutura de diretrio de exemplo


l o c o m o t i v e _ m a i n . p y l o c o m o t i v e _ t e s t s . p y l o c o m o t i v e / _ _ i n i t _ _ . p y a p p . p y c a p t u r e . p y c a t e g o r y _ a s s o c i a t i o n s . p y c l a s s i f y . p y n e w s . p y r e c o m m e n d . p y r s s . p y l o c o m o t i v e _ t e s t s / _ _ i n i t _ _ . p y a p p _ t e s t . p y c a t e g o r y _ a s s o c i a t i o n s _ t e s t . p y f e e d _ i t e m _ t e s t . p y c r s s _ i t e m _ t e s t . p y

Observe os arquivos com o nome estranho de __init__.py. Esses arquivos dizem ao Python para carregar as bibliotecas necessrias para o pacote e os arquivos de cdigo de aplicativo especficos que esto no mesmo diretrio. A Listagem 4 mostra o contedo do arquivo locomotive/__init__.py. Listagem 4. locomotive/__init__.py
#s y s t e mi m p o r t s ;l o a d si n s t a l l e dp a c k a g e s i m p o r tc o d e c s i m p o r tl o c a l e i m p o r ts y s #a p p l i c a t i o ni m p o r t s ;t h e s el o a dy o u rs p e c i f i c* . p yf i l e s i m p o r ta p p i m p o r tc a p t u r e i m p o r tc a t e g o r y _ a s s o c i a t i o n s i m p o r tc l a s s i f y i m p o r tr s s i m p o r tn e w s i m p o r tr e c o m m e n d

Com o pacote locomotive estruturado como na Listagem 4, os programas principais no diretrio-raiz do projeto podem import-lo e us-lo. Por exemplo, o arquivo locomotive_main.py contm as seguintes importaes:
i m p o r ts y s #> -s y s t e ml i b r a r y i m p o r tt i m e #> -s y s t e ml i b r a r y i m p o r tl o c o m o t i v e #> -c u s t o ma p p l i c a t i o nc o d el i b r a r yi nt h e" l o c o m o t i v e "d i r e c t o r y

Teste A biblioteca padro u n i t t e s tdo Python uma boa soluo para teste. Para desenvolvedores Java familiarizados com JUnit e programadores Ruby familiarizados com a estrutura Test::Unit, o cdigo u n i t t e s tde Python na Listagem 5 ser fcil de ler. Listagem 5. unittest de Python
c l a s sA p p T e s t ( u n i t t e s t . T e s t C a s e ) : d e fs e t U p ( s e l f ) : s e l f . a p p=l o c o m o t i v e . a p p . A p p l i c a t i o n ( ) d e ft e a r D o w n ( s e l f ) : p a s s d e ft e s t _ d e v e l o p m e n t _ f e e d s _ l i s t ( s e l f ) : f e e d s _ l i s t=s e l f . a p p . d e v e l o p m e n t _ f e e d s _ l i s t ( ) s e l f . a s s e r t T r u e ( l e n ( f e e d s _ l i s t )= =1 5 ) s e l f . a s s e r t T r u e ( ' f e e d : / / n e w s . y a h o o . c o m / r s s / s t o c k m a r k e t s 'i nf e e d s _ l i s t )

O cdigo na Listagem 5 tambm demonstra um recurso diferenciador do Python: todo o cdigo deve ser indentado consistentemente, ou no ser compilado com xito. O mtodo t e a r D o w n ( s e l f )pode parecer um pouco estranho primeira vista. Voc deve estar se perguntando por que o teste foi definido para sempre passar. Na verdade, no foi. assim que se cria um mtodo vazio em Python. Conjunto de ferramentas O que eu realmente precisava era um ambiente de desenvolvimento integrado (IDE) com destaque da sintaxe, concluso de cdigo e funcionalidade de depurao de ponto de interrupo, para ajudar no aprendizado de Python. Como usurio do IDE Eclipse para desenvolvimento em Java, o plug-in p y e c l i p s efoi a primeira ferramenta que examinei. Funciona bem, apesar de ser lento s vezes. Eu acabei por investir no IDE PyCharm, que tem tudo que eu preciso.
www.ibm.com/developerworks/br/library/os-pythonnltk/ 3/8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK

Com um conhecimento bsico de Python e do seu ecossistema, era hora de comear a implementar a soluo de aprendizado por mquina. Implementando categorizao com Python e NLTK Para implementar a soluo, era necessrio capturar feeds RSS simulados, limpar o texto, usar N a i v e B a y e s C l a s s i f i e re classificar categorias com o algoritmo kNN. Cada uma dessas aes descrita aqui. Capturando e analisando os feeds O projeto tinha um desafio especial: a cliente ainda no havia definido a lista de feeds RSS que seriam alvos. Por isso, no havia "dados de treinamento". Por isso, o feed e os dados de treinamento tiveram que ser simulados durante o desenvolvimento inicial. A primeira abordagem que usei para obter dados de amostra foi simplesmente buscar uma lista de feeds RSS especificados em um arquivo de texto. Python oferece uma boa biblioteca de anlise de feed RSS, chamada f e e d p a r s e r , que abstrai as diferenas entre os vrios formatos RSS e Atom. Outra biblioteca til para serializao de objeto baseado em texto tem o bem-humorado nome de p i c k l e . Ambas as bibliotecas so usadas no cdigo na Listagem 6, que captura cada feed RSS como arquivos de objeto do pickle para uso posterior. Como possvel ver, o cdigo Python conciso e eficiente. Listagem 6. A classe CaptureFeeds
i m p o r tf e e d p a r s e r i m p o r tp i c k l e c l a s sC a p t u r e F e e d s : d e f_ _ i n i t _ _ ( s e l f ) : f o r( i ,u r l )i ne n u m e r a t e ( s e l f . r s s _ f e e d s _ l i s t ( ) ) : s e l f . c a p t u r e _ a s _ p i c k l e d _ f e e d ( u r l . s t r i p ( ) ,i ) d e fr s s _ f e e d s _ l i s t ( s e l f ) : f=o p e n ( ' f e e d s _ l i s t . t x t ' ,' r ' ) l i s t=f . r e a d l i n e s ( ) f . c l o s e r e t u r nl i s t d e fc a p t u r e _ a s _ p i c k l e d _ f e e d ( s e l f ,u r l ,f e e d _ i n d e x ) : f e e d=f e e d p a r s e r . p a r s e ( u r l ) f=o p e n ( ' d a t a / f e e d _ '+s t r ( f e e d _ i n d e x )+' . p k l ' ,' w ' ) p i c k l e . d u m p ( f e e d ,f ) f . c l o s e ( ) i f_ _ n a m e _ _= =" _ _ m a i n _ _ " : c f=C a p t u r e F e e d s ( )

A etapa seguinte foi surpreendentemente desafiadora. Agora que eu tinha dados de feed de amostra, era necessrio categoriz-los para uso como dados de treinamento. Dados de treinamento o conjunto de dados dado ao algoritmo de categorizao para que ele possa aprender. Por exemplo, os feeds de amostra que eu usei incluam ESPN, a Sports Network. Um dos itens do feed falava sobre a transferncia de Tim Tebow, do time de futebol americano Denver Broncos, para o New York Jets ao mesmo tempo que os Broncos tinham contratado Peyton Manning para ser seu novo atacante. Outro item nos resultados do feed era sobre a empresa Boeing e seu novo jato. A pergunta : qual valor de categoria especfico deveria ser atribudo ao primeiro artigo? Os valores t e b o w ,b r o n c o s , m a n n i n g ,j e t s ,q u a r t e r b a c k ,t r a d ee n f lso todos apropriados. Mas apenas um valor pode ser especificado nos dados de treinamento como sua categoria. Da mesma forma, no segundo artigo, a categoria b o e i n gou j e t ? O problema est nesses detalhes. A categorizao manual precisa de um grande conjunto de dados de treinamento essencial para que o algoritmo produza resultados precisos. O tempo necessrio para fazer isso no deve ser subestimado. Logo ficou claro que eu precisava de mais dados para trabalhar, e eles tinham que j estar categorizados e com preciso. Onde eu encontraria esses dados? Aqui entra a Python NLTK. Alm de ser uma excelente biblioteca para processamento de texto, ela ainda vem com conjuntos de dados de amostra para download, ou corpus na sua terminologia, alm de uma interface de programao de aplicativo para acessar facilmente os dados transferidos por download. Para instalar o corpus Reuters, execute os comandos abaixo. Mais de 10.000 artigos da imprensa sero transferidos para o diretrio ~/nltk_data/corpora/reuters/. Assim como itens do feed RSS, cada artigo da Reuters contm um ttulo e um corpo, portanto esses dados pr-categorizados de NLTK so excelentes para simular campos RSS.
$p y t h o n > > >i m p o r tn l t k > > >n l t k . d o w n l o a d ( ) I d e n t i f i e r >r e u t e r s #e n t e ra ni n t e r a c t i v eP y t h o ns h e l l #i m p o r tt h en l t kl i b r a r y #r u nt h eN L T KD o w n l o a d e r ,t h e ne n t e r' d 'D o w n l o a d #s p e c i f yt h e' r e u t e r s 'c o r p u s

De particular interesse o arquivo ~/nltk_data/corpora/reuters/cats.txt. Ele contm uma lista de nomes de arquivos de artigo e a categoria designada a cada um deles. O arquivo tem o seguinte formato, portanto, o artigo no arquivo 14828 no subdiretrio test pertence ao tpico g r a i n .
t e s t / 1 4 8 2 6t r a d e t e s t / 1 4 8 2 8g r a i n

Idiomas naturais so confusos A entrada bruta do algoritmo de categorizao de feeds RSS , obviamente, texto escrito em ingls. realmente bruto. Ingls, ou qualquer outro idioma natural (ou seja, idiomas falados ou comuns) altamente irregular e impreciso do ponto de vista do processamento por computador. Primeiro, h a questo da distino entre maisculas e minsculas. A palavra Bronco equivale a bronco? A resposta talvez. Em seguida, h o problema da pontuao e espaos em branco. O termo bronco. igual a bronco ou bronco,? Mais ou menos. Alm disso, h plurais e palavras semelhantes. run, running, e ran so equivalentes? Bem, depende. As trs palavras tm uma raiz em comum. E se os temos do idioma natural estiverem integrados em uma linguagem de marcao, como HTML? Nesse caso, seria necessrio
www.ibm.com/developerworks/br/library/os-pythonnltk/ 4/8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK

lidar com texto como < s t r o n g > b r o n c o < / s t r o n g > . Por fim, h o problema das palavras essencialmente sem sentido, mas frequentemente usadas, como um, e e o. Essas "stopwords" apenas atrapalham. Idiomas naturais so confusos. necessrio limpar antes de processar. Felizmente, Python e NLTK permitem limpar essa baguna. O mtodo n o r m a l i z e d _ w o r d sda classe R s s I t e m , na Listagem 7, cuida dessas questes. Observe, em particular, como NLTK remove a marcao HTML integrada do texto bruto do artigo em apenas uma linha de cdigo! Uma expresso regular usada para remover a pontuao, e em seguida as palavras individuais so divididas e normalizadas para minsculas. Listagem 7. A classe RssItem
c l a s sR s s I t e m : . . . r e g e x=r e . c o m p i l e ( ' [ % s ] '%r e . e s c a p e ( s t r i n g . p u n c t u a t i o n ) ) . . . d e fn o r m a l i z e d _ w o r d s ( s e l f ,a r t i c l e _ t e x t ) : w o r d s =[ ] o n e l i n e=a r t i c l e _ t e x t . r e p l a c e ( ' \ n ' ,'' ) c l e a n e d=n l t k . c l e a n _ h t m l ( o n e l i n e . s t r i p ( ) ) t o k s 1 =c l e a n e d . s p l i t ( ) f o rt 1i nt o k s 1 : t r a n s l a t e d=s e l f . r e g e x . s u b ( ' ' ,t 1 ) t o k s 2=t r a n s l a t e d . s p l i t ( ) f o rt 2i nt o k s 2 : t 2 s=t 2 . s t r i p ( ) . l o w e r ( ) i fs e l f . s t o p _ w o r d s . h a s _ k e y ( t 2 s ) : p a s s e l s e : w o r d s . a p p e n d ( t 2 s ) r e t u r nw o r d s

A lista de stopwords veio da NLTK com essa linha de cdigo. H suporte para outros idiomas naturais:
n l t k . c o r p u s . s t o p w o r d s . w o r d s ( ' e n g l i s h ' )

NLTK tambm oferece vrias classes "lematizadoras" para normalizar ainda mais as palavras. Consulte a documentao da NLTK sobre lematizao, estrutura de sentena e gramtica para mais informaes. Classificao com algoritmo de Bayes Ingnuo O algoritmo de Bayes Ingnuo muito usado e implementado na NLTK com a classe n l t k . N a i v e B a y e s C l a s s i f i e r . O algoritmo de Bayes classifica itens segundo a presena ou ausncia de caractersticas nos conjuntos de dados. No caso de itens de feeds RSS cada caracterstica uma dada palavra (limpa) de idioma natural. O algoritmo "ingnuo", pois supe que no h relacionamento entre as caractersticas (nesse caso, palavras). No entanto, o ingls contm mais de 250.000 palavras. Certamente eu no quero precisar criar um objeto contendo 250.000 booleanos para cada item de feed RSS para passar ao algoritmo. Ento quais palavras eu uso? Em resumo, a resposta as palavras mais comuns na populao dos dados de treinamento que no so stopwords. NLTK oferece uma classe excepciona, n l t k . p r o b a b i l i t y . F r e q D i s t , que pode ser usada para identificar essas palavras mais usadas. Na Listagem 8 , o mtodo c o l l e c t _ a l l _ w o r d sretorna um array de todas as palavras de todos os artigos de treinamento. Esse array passado para o mtodo i d e n t i f y _ t o p _ w o r d spara identificar as palavras mais frequentes. Um recurso til da classe n l t k . F r e q D i s t que essencialmente um hash, mas as suas chaves so armazenadas de acordo com os valores correspondentes, ou contagens. Portanto, fcil obter as 1.000 palavras mais usadas com a sintaxe [ : 1 0 0 0 ]do Python. Listagem 8. Usando a classe nltk.FreqDist
d e fc o l l e c t _ a l l _ w o r d s ( s e l f ,i t e m s ) : a l l _ w o r d s=[ ] f o ri t e mi ni t e m s : f o rwi ni t e m . a l l _ w o r d s : w o r d s . a p p e n d ( w ) r e t u r na l l _ w o r d s d e fi d e n t i f y _ t o p _ w o r d s ( s e l f ,a l l _ w o r d s ) : f r e q _ d i s t=n l t k . F r e q D i s t ( w . l o w e r ( )f o rwi na l l _ w o r d s ) r e t u r nf r e q _ d i s t . k e y s ( ) [ : 1 0 0 0 ]

Para os itens do feed RSS simulado com os dados de artigos da Reuters da NLTK, eu preciso identificar as categorias de cada item. Para isso, eu leio o arquivo ~/nltk_data/corpora/reuters/cats.txt mencionado anteriormente. Ler um arquivo com Python simples:
d e fr e a d _ r e u t e r s _ m e t a d a t a ( s e l f ,c a t s _ f i l e ) : f=o p e n ( c a t s _ f i l e ,' r ' ) l i n e s=f . r e a d l i n e s ( ) f . c l o s e ( ) r e t u r nl i n e s

A prxima etapa obter os recursos para cada item dos feeds RSS. O mtodo f e a t u r e sda classe R s s I t e m , mostrada abaixo, faz isso. Nesse mtodo, o array a l l _ w o r d s no artigo primeiro reduzido para um objeto s e tmenor para eliminar as palavras duplicadas. Em seguida, t o p _ w o r d sso iteradas e comparadas com esse conjunto, para verificar sua presena ou ausncia. Um hash de 1.000 booleanos retornado, com a chave w _seguido da prpria palavra. Esse Python mesmo muito conciso.
www.ibm.com/developerworks/br/library/os-pythonnltk/ 5/8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK

d e ff e a t u r e s ( s e l f ,t o p _ w o r d s ) : w o r d _ s e t=s e t ( s e l f . a l l _ w o r d s ) f e a t u r e s={ } f o rwi nt o p _ w o r d s : f e a t u r e s [ " w _ % s "%w ]=( wi nw o r d _ s e t ) r e t u r nf e a t u r e s

Em seguida, eu coleto um conjunto de treinamento dos itens de feeds RSS e suas caractersticas individuais e passo para o algoritmo. O cdigo na Listagem 9 demonstra essa tarefa. Observe que o classificar treinado em exatamente uma linha de cdigo. Listagem 9. Treinando nltk.NaiveBayesClassifier
d e fc l a s s i f y _ r e u t e r s ( s e l f ) : . . . t r a i n i n g _ s e t=[ ] f o ri t e mi nr s s _ i t e m s : f e a t u r e s=i t e m . f e a t u r e s ( t o p _ w o r d s ) t u p=( f e a t u r e s ,i t e m . c a t e g o r y ) #t u pi sa2 e l e m e n tt u p l e f e a t u r e s e t s . a p p e n d ( t u p ) c l a s s i f i e r=n l t k . N a i v e B a y e s C l a s s i f i e r . t r a i n ( t r a i n i n g _ s e t )

AN a i v e B a y e s C l a s s i f i e r , na memria do programa Python, est treinada. Agora, basta iterar o conjunto de itens de feeds RSS que precisam ser classificados e pedir ao classificador para adivinhar a categoria de cada um. Simples.
f o ri t e mi nr s s _ i t e m s _ t o _ c l a s s i f y : f e a t u r e s=i t e m . f e a t u r e s ( t o p _ w o r d s ) c a t e g o r y=c l a s s i f i e r . c l a s s i f y ( f e a t )

Ficando menos ingnuo Como dito anteriormente, o algoritmo supe que no h relacionamento entre os recursos individuais. Por isso, frases como "machine learning" e "learning machine", ou "New York Jet" e "jet to New York", so equivalentes (to uma stopword). No contexto do idioma natural, h um relacionamento bvio entre essas palavras. Ento como posso ensinar o algoritmo a ser "menos ingnuo" e reconhecer esses relacionamentos entre palavras? Uma tcnica incluir os bigramas comuns (grupos de duas palavras) e trigramas (grupos de trs palavras) no conjunto de caractersticas. No surpresa que a NLTK tenha suporte para isso na forma das funes n l t k . b i g r a m s ( . . . )e n l t k . t r i g r a m s ( . . . ) . Assim como as primeiras n palavras foram coletadas na populao de palavras dos dados de treinamento, os bigramas e trigramas mais usados podem ser identificados e usados como caractersticas. Os resultados variam Refinar os dados e o algoritmo uma arte. Devemos normalizar ainda mais o conjunto de palavras, talvez com lematizao? Ou incluir mais que as principais 1.000 palavras? Menos? Ou usar um conjunto de dados de treinamento maior? Incluir mais stopwords ou "stop-grams"? Essas perguntas so todas vlidas. Experimente com elas e, por meio de tentativa e erro, voc chegar ao melhor algoritmo para seus dados. Eu constatei que 85% um bom ndice de categorizao bem-sucedida. Recomendao com o algoritmo k-Nearest Neighbors A cliente queria exibir itens de feeds RSS em uma categoria selecionada ou categorias semelhantes. Agora que os itens foram categorizados com o algoritmo Bayes Ingnuo, a primeira parte do requisito foi atendida. A parte mais difcil era implementar o requisito de "ou categorias semelhantes". aqui que entram os sistemas de recomendaes de aprendizado por mquina. Sistemas de recomendaes recomendam um item com base na semelhana entre os outros itens. As recomendaes de produtos da Amazon.com e as de amigos no Facebook so bons exemplos dessa funcionalidade. k-Nearest Neighbors (kNN) o algoritmo de recomendao mais comum. A ideia fornecer um conjunto de rtulos (ou seja, categorias) e um conjunto de dados correspondente para cada um deles. Em seguida, o algoritmo compara os conjuntos de dados para identificar itens semelhantes. O conjunto de dados composto de arrays de valores numricos, geralmente em uma faixa normalizada de 0 a 1. Ele pode assim identificar os rtulos semelhantes nos conjuntos. Ao contrrio do Bayes Ingnuo, que produz apenas um resultado, kNN pode produzir uma lista classificada de vrias recomendaes (ou seja, o valor de k ). Eu achei os algoritmos de recomendao mais simples de entender e implementar que os algoritmos de classificao, embora o cdigo e sua complexidade matemtica sejam grandes demais para incluir aqui. Consulte o excelente novo livro da Manning, Machine Learning in Action, para ver exemplos de cdigo de kNN (consulte Recursos para obter um link). No caso da implementao dos itens de feeds RSS, os valores de rtulo eram categorias de item e o conjunto de dados era um array com os valores de cada uma das 1.000 principais palavras. Novamente, criar esse array envolve cincia, matemtica e arte. Os valores de cada palavra no array podem ser simples booleanos zero ou um, porcentagens de ocorrncias de palavras no artigo, um valor exponencial dessa porcentagem ou algum outro valor. Concluso Descobrir Python, NLTK e aprendizado por mquina foi uma experincia interessante e prazerosa. A linguagem Python eficiente e concisa e faz parte do meu kit de ferramentas de desenvolvedor agora. Ela adequada para aplicaes de aprendizado por mquina, idioma natural matemtica/cincias. Embora no seja mencionado neste artigo, tambm a considero til para grficos e plotagem. Se Python tambm estava no seu ponto cego, sugiro a voc que d uma olhada nessa linguagem.

Recursos Aprender Saiba mais sobre aprendizado por mquina na Wikipdia. Confira o website oficial do Python.
www.ibm.com/developerworks/br/library/os-pythonnltk/ 6/8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK

Leia Machine Learning in Action de Peter Harrington (Manning, 2012). Confira Natural Language Processing with Python de Steven Bird, Ewan Klein e Edward Loper (O'Reilly, 2009). Confira Implement Bayesian inference using PHP (Paul Meagher, developerWorks, maro a maio de 2009). Essa srie em trs partes discute aplicativos interessantes para ajudar a entender a eficincia e o potencial dos conceitos de inferncia bayesiana. No assistente Software Livre, no developerWorks, encontre amplas informaes instrutivas, ferramentas e atualizaes de projeto para ajud-lo a desenvolver com tecnologias de software livre e us-las com produtos IBM. Fique atualizado com os eventos tcnicos e webcasts do eventos tcnicos e webcasts do developerWorks voltados para uma variedade de produtos IBM e assuntos do mercado de TI. Participe de um resumo de instrues gratuito no briefing ao vivo e gratuito do developerWorks Live! para atualizar-se rapidamente sobre produtos e ferramentas IBM e tendncias do segmento de mercado de TI. Escute os Podcasts do developerWorks para obter entrevistas interessantes e discusses para os desenvolvedores de software. Siga os tweets do developerWorks no Twitter. Acompanhe as Demos do developerWorks que variam de instalao e configurao de produtos para iniciantes a funcionalidades avanadas para desenvolvedores experientes. Obter produtos e tecnologias Explore o site da NLTK e a criao de programas Python para trabalhar com dados de idioma humano. Faa o download do pip e saiba mais sobre essa ferramenta para instalar e gerenciar pacotes Python. Saiba mais sobre v i r t u a l e n v , uma ferramenta para criar ambientes Python isolados. Confira a biblioteca padro u n i t t e s t , uma verso Python de JUnit. Confira o plug-in p y e c l i p s epara Eclipse. Confira o IDE PyCharm para um conjunto completo de ferramentas de desenvolvimento para programar com Python e recursos da estrutura Django. Utilize o software de teste IBM (disponvel para download ou em DVD) e inove em seu prximo projeto de desenvolvimento de software livre prprio usando o software especialmente para desenvolvedores. Discutir Conecte-se com outros usurios do developerWorks enquanto explora os blogs, fruns, grupos e wikis voltados para desenvolvedores. Ajude a desenvolver o grupo de software livre do na comunidade do developerWorks. Sobre o autor

Chris Joakim Senior Software Engineer na Primedia Inc. Chris desenvolve software h mais de 25 anos em vrias linguagens, incluindo Clojure, Ruby, Java, Objective-C, JavaScript, CoffeeScript, Flex, Smalltalk, COBOL e agora Python. Ele mora em Davidson, Carolina do Norte, EUA. Em suas horas de lazer, ele corre em maratonas e escreve cdigo. O email de Chris cjoakim@bellsouth.net. Fechar [x]

developerWorks: Registre-se
IBM ID: Precisa de um ID IBM? Esqueceu seu ID IBM? Senha: Esqueceu sua senha? Alterar sua senha Mantenha-me conectado. Ao clicar em Enviar, voc concorda com os termos de uso do developerWorks.
Enviar Cancelar

www.ibm.com/developerworks/br/library/os-pythonnltk/

7/8

05/05/13

Explore o Python, o Aprendizado por Mquina e a Biblioteca NLTK

Na primeira vez que voc efetua sign in no developerWorks, um perfil criado para voc. Informaes selecionadas do seu perfil developerWorks so exibidas ao pblico, mas voc pode edit-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocult-los), e seu nome de exibio acompanharo o contedo que postar. Todas as informaes enviadas so seguras. Fechar [x]

Selecione seu nome de exibio


Ao se conectar ao developerWorks pela primeira vez, criado um perfil para voc e necessrio selecionar um nome de exibio. O nome de exibio acompanhar o contedo que voc postar no developerWorks. Escolha um nome de exibio de 3 - 31 caracteres. Seu nome de exibio deve ser exclusivo na comunidade do developerWorks e no deve ser o seu endereo de email por motivo de privacidade. Nome de exibio: (Deve possuir de 3 a 31 caracteres.)

Ao clicar em Enviar, voc concorda com os termos de uso do developerWorks.


Enviar Cancelar

Todas as informaes enviadas so seguras. Mdia de classificao (6 votos) 1 estrela 1 estrela 2 estrelas 2 estrelas 3 estrelas 3 estrelas 4 estrelas 4 estrelas 5 estrelas 5 estrelas
Enviar

Incluir comentrio: Conectar or registre-se para deixar um comentrio. Observao: elementos HTML no so suportados nos comentrios.

Notificar-me quando um comentrio for adicionado1000 caracteres restantes

Postar

Nenhum comentrio postado para esse artigo


Imprimir esta pgina Compartilhe esta pgina Siga o developerWorks

Sobre Ajuda Entre em contato conosco

Feeds

Relatar abuso Termos de uso Privacidade

Acessibilidade (Ingls) IBM Academic Initiative IBM PartnerWorld Industry Network

www.ibm.com/developerworks/br/library/os-pythonnltk/

8/8