Você está na página 1de 78

Universidade Estadual de Maring Centro de Tecnologia Departamento de Informtica

Proposta de um Sistema Inteligente para Recomendao de News

Nathan Siegle Hartmann

Trabalho de Graduao 2012

Maring-Paran 2012

Universidade Estadual de Maring Centro de Tecnologia Departamento de Informtica

Proposta de um Sistema Inteligente para Recomendao de News

Nathan Siegle Hartmann

Trabalho de Graduao 2012

Trabalho de Graduao do Curso de Cincia da Computao, do Centro de Tecnologia, da Universidade Estadual de Maring. Orientador: Prof. Dr. Srgio Roberto Pereira da Silva

i Maring-Paran 2012

Nathan Siegle Hartmann

Proposta de um Sistema Inteligente para Recomendao de News

Este exemplar corresponde redao final da monografia aprovada como requisito parcial para obteno do grau de Bacharel em Cincia da Computao da Universidade Estadual de Maring, pela Banca Examinadora formada pelos seguintes membros:

____________________________________ Orientador: Prof. Dr. Srgio Roberto Pereira da Silva Departamento de Informtica, CTC, DIN ____________________________________ Prof. Me. Marco Aurlio Lopes Barbosa Departamento de Informtica, CTC, DIN

____________________________________ Profa. Dr. Valria Delisandra Feltrim Departamento de Informtica, CTC, DIN

ii Maring Paran 2012

Agradecimentos
Agradeo aos meus pais, por terem aceitado minha deciso em fazer este curso de graduao e tambm por terem me apoiado durante minha caminhada. Agradeo a Deus, por ter me guiado durante no s a execuo deste trabalho de concluso de curso, mas durante toda minha jornada na graduao. Agradeo por fim ao meu orientador Prof. Dr. Srgio Roberto Pereira da Silva por ter compartilhado seus conhecimentos e experincias ao longo de minha orientao, sendo fundamental para a elaborao deste trabalho.

iii

Resumo
A recomendao de notcias uma subrea da rea de recomendao de informao, sendo que a principal diferena entre elas o aspecto temporal da notcia, ou seja, sua perda de relevncia com o decorrer do tempo. Um problema destacado nessa rea a dificuldade em encontrar um equilbrio entre a qualidade dos resultados gerados e a eficincia do processamento dos dados. Para tentar obter uma boa relao entre desempenho e qualidade utilizado nesse trabalho um classificador Naive Bayes para separar as notcias em classes de interesse do usurio, bem como a tcnica de similaridade pelo cosseno para a criao de um ranking de notcias a serem apresentadas. Por fim, tambm realizada a personalizao da apresentao das notcias, por meio da criao de um modelo de interesse do usurio com o uso de feedback explicito.

Palavras-chave
Recomendao de Notcias, Modelagem do interesse do usurio, Recuperao de Informao.

iv

Abstract
News recommendation is a subarea of information recommendation. The mainly difference between them is the temporal aspect of news, i.e., its loss of relevance after some time. A highlighted problem in this area is the difficulty to find a balance between the quality of the results and the efficiency of the data processing. Trying to get a good trade-off between performance and quality, a Nave Bayes classifier was used in this paper to sort out the news in categories according to the users interest. The cosine similarity technique was used in order to create a ranking of news to be showed. Finally, a personalization of the news display is also made through the creation of the users interest model with the use of explicit feedback.

Key-words
News Recommendation, User Interesting Modeling, Information Retrieval.

Sumrio
1 2 2.1 2.2 2.2.1 2.2.2 2.3 2.3.1 2.3.2 3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.9.1 3.9.2 3.9.3 3.9.4 3.9.5 4 4.1 4.2 4.3 INTRODUO ......................................................................................................................... 1 REVISO BIBLIOGRFICA................................................................................................. 3 A Recuperao de Informao .................................................................................................... 3 Classificao de novas notcias ................................................................................................... 4 Pr-processamento do Texto .................................................................................................. 4 Tcnicas para classificao de documentos ........................................................................... 6 Personalizao ............................................................................................................................ 6 Clculo de Similaridade entre Documentos ........................................................................... 6 Relevance Feedback ............................................................................................................... 7 DESENVOLVIMENTO ........................................................................................................... 9 O Pr-Processamento .................................................................................................................. 9 O Treinamento do Classificador ............................................................................................... 11 A classificao .......................................................................................................................... 12 A apresentao .......................................................................................................................... 14 Modelagem do Interesse do Usurio ......................................................................................... 16 Relevance Feedback.................................................................................................................. 16 Recomendao .......................................................................................................................... 18 As Classes do Sistema .............................................................................................................. 20 Bibliotecas e Frameworks Utilizados ....................................................................................... 23 BeautifulSoup ....................................................................................................................... 23 CherryPy............................................................................................................................... 23 Feedparser ............................................................................................................................ 24 NLTK .................................................................................................................................... 24 Reverend ............................................................................................................................... 24 ANLISE DOS RESULTADOS............................................................................................ 25 Modelos de Representao........................................................................................................ 25 Qualidade do Ranking de Notcias ............................................................................................ 25 Custo de Processamento do Sistema ......................................................................................... 27

vi

4.4 4.5 5 6 7 7.1 7.2 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 7.2.6 7.2.7 7.2.8

Desempenho de 20% e 100% de Termos Utilizados at a Classificao .................................. 28 Representao de Notcias por meio de Ttulos e Sumrios ..................................................... 30 CONCLUSES ....................................................................................................................... 33 REFERNCIAS BIBLIOGRFICAS .................................................................................. 35 APNDICE.............................................................................................................................. 38 Websites utilizados para recuperar notcias ............................................................................... 38 Cdigo Fonte ............................................................................................................................. 40 Main...................................................................................................................................... 40 NewsSearch .......................................................................................................................... 41 ClassifierTrainer .................................................................................................................. 44 PreProcessing ....................................................................................................................... 48 Scorer ................................................................................................................................... 50 User ...................................................................................................................................... 54 News ..................................................................................................................................... 57 Web ....................................................................................................................................... 58

vii

Lista de Figuras
Figura 1. Componentes de um sistema recuperador de informao (Cardoso, 2000). 3 Figura 2. Equao para o clculo da similaridade pelo cosseno (Huang, 2008). ....... 7 Figura 3. Equao para o clculo do coeficiente de Jaccard (Huang, 2008). ............. 7 Figura 4. Viso geral do sistema. ................................................................................ 9 Figura 5. Pr-processamento das notcias. ................................................................ 11 Figura 6. Treinamento do classificador Naive Bayes. .............................................. 12 Figura 7. Classificao de novas notcias. ................................................................ 13 Figura 8. Equao de decaimento de relevncia de uma notcia. ............................. 13 Figura 9. Interface da tela inicial do prottipo. ......................................................... 14 Figura 10. Interface da tela de notcias de tecnologia. .............................................. 15 Figura 11. Feedback positivo e interesse do usurio. ............................................... 17 Figura 12. Feedback negativo e o interesse do usurio. ........................................... 17 Figura 13. Pgina de notcias recomendadas ao usurio........................................... 19 Figura 14. Diagrama de classe do sistema. ............................................................... 21 Figura 15. Ranking das notcias por categorias utilizando 100% dos termos para representao de notcias. ......................................................................................... 27 Figura 16. Custo de processamento do sistema utilizando 100% de termos do texto. .................................................................................................................................. 28 Figura 17. Ranking das notcias por categorias utilizando ttulo e sumrio para representao de documentos. .................................................................................. 31

viii

Lista de Tabelas
Tabela 1. Quantidade de websites vistoriados para a aprendizagem do classificador Naive Bayes. ............................................................................................................. 12 Tabela 2. Algumas funcionalidades da biblioteca Feedparser. ................................ 24 Tabela 3. Resultado do teste de qualidade do ranking de notcias. .......................... 26 Tabela 4. Resultado do teste de desempenho do sistema.......................................... 27 Tabela 5. Comparao de desempenho entre 20% e 100% de termos de documentos utilizados. .................................................................................................................. 29 Tabela 6. Comparao de desempenho entre a utilizao de ttulo e sumrio e de 100% de termos de documentos........................................................................... 30 Tabela 7. Resultado do teste de qualidade do ranking de notcias com a utilizao de ttulo e sumrio como forma de representao de documentos. ........................ 31

ix

Introduo
A Internet um sistema pblico mundial ao qual qualquer pessoa possui acesso por

meio de um computador. A inveno da Internet possibilitou que a informao fosse registrada em um domnio de acesso pblico (Surface Web) (Meng & Yu, 2010), facilitando a visualizao desse contedo. O incio da era da Internet foi composto por poucos websites, consequentemente pouca informao estava disponvel na rede de computadores. Atualmente a World Wide Web Size (2012), website mantido pela Tilburg University, garante que a Internet possui ao menos 8,23 bilhes de pginas indexadas na Surface Web e, segundo Meng & Yu (2010), estima-se mais de 900 bilhes de websites contidos na Deep Web (poro de websites que no so pblicos). Com essas informaes percebe-se que h uma quantidade excessiva de informao disponvel na Internet, fenmeno que torna a pesquisa do usurio, por um assunto especfico, desgastante e muitas vezes demorada. Esse problema conhecido como sobrecarga de informao (information overload) e ocorre quando o usurio possui muita informao ao seu alcance, porm, no tem condies de trat-la e encontrar o que realmente deseja ou lhe interessa (Chen, 1994). A Internet est repleta de pginas que apresentam notcias (news), na maioria das vezes dirias, divulgando acontecimentos sobre diversos temas. Um ponto que diferencia essas pginas das demais que as notcias tm um forte aspecto temporal, ou seja, depois de passado determinado tempo, elas j no apresentam o mesmo valor informativo. Outro problema importante a distino entre notcias relevantes e no relevantes. Essa distino pode ser feita obtendo notcias apenas de fontes que possuam autoridade nos assuntos publicados (Rieh, 2002), ou seja, que informem notcias de qualidade. Apesar dessa distino poder ser feita, identificar quais dessas informaes so relevantes no uma tarefa simples para o usurio. Para isso pode ser utilizada a recomendao de informao. A recomendao de notcias pode ser formulada como um problema de classificao. Conforme citado por Marmanis & Babenko (2009), Jannach, Janker, Felfernig, & Friedrich (2011), Owen, Anil, Dunning, & Friedman (2012) e Alag (2009), sobre a criao de sistemas recomendadores de informao, o uso de aprendizagem de mquina um meio de se classificar a informao, tornando mais rpido o acesso aos 1

dados. Em particular, as tcnicas de aprendizagem supervisionada baseiam-se em um contedo de treinamento existente, o qual, neste trabalho, so os documentos que definem cada uma das categorias de notcias que possam vir a ser utilizadas. O objetivo deste trabalho desenvolver um sistema recomendador de informao, focado em notcias em lngua inglesa, que considere o aspecto temporal de tal contedo. Para tanto, so acessados websites que possuam autoridade na publicao de notcias. A partir do acesso a essas pginas feita a extrao e o processamento da informao contida, a aplicao de tcnicas de aprendizagem de mquina para classificar os dados em classes que melhor os representem e, por fim, a personalizao e o armazenamento das notcias classificadas. As sees que seguem sero divididas da seguinte maneira: na Seo 2 sero apresentados os conceitos relevantes ao desenvolvimento do trabalho, que so: recuperao de informao, o pr-processamento dessa informao, a classificao de notcias e a utilizao de relevance feedback na personalizao da recuperao de informao. Na Seo 3 apresentado o corpo do trabalho, que consiste no desenvolvimento de um sistema de recomendao de notcias recuperadas da Web. Na Seo 4 apresentada a anlise dos resultados provenientes de diversos testes. Por fim, na Seo 5 so apresentadas concluses acerca deste trabalho.

Reviso Bibliogrfica
Para entender os problemas inerentes recuperao de notcias, preciso entender o

conceito de Recuperao de Informao (RI) e como ele pode ser aplicado no escopo de notcias. Tambm necessrio estudar tcnicas que possibilitem a criao de um classificador que filtre as notcias em suas devidas categorias. Alm disso, interessante estudar meios para modelar o interesse do usurio e como essa modelagem pode ser empregada na recomendao de informao. Com estas tcnicas, possvel personalizar a recomendao de notcias para apresentar as de maior relevncia ao usurio.

2.1 A Recuperao de Informao


A atividade de recuperao de informao, em geral, preocupa-se com as operaes de indexao e seleo de documentos, geralmente textos (Cardoso, 2000), que forneam uma resposta a uma demanda (necessidade por informao) de usurios (Ferneda, 2003).

Figura 1. Componentes de um sistema recuperador de informao (Cardoso, 2000).

Um sistema recuperador de informao pode ser estruturado como apresentado na Figura 1. Do lado esquerdo da figura se tem os documentos buscados e indexados pelo sistema. De outro lado, encontra-se o usurio e sua necessidade de informao, especificada no sistema na forma de uma consulta. Fazendo-se uso de tcnicas que relacionem o interesse do usurio com os documentos indexados pelo sistema, pode-se recuperar as informaes de interesse do usurio.

A diferena entre a recuperao de notcias e a recuperao de informao est no aspecto temporal da notcia. A informao, na maioria das vezes, no perde seu valor informativo com o passar do tempo, j a notcia sim. Uma notcia que poderia ser relevante h uma semana, hoje pode no ser mais. Esse aspecto temporal influencia diretamente a maneira como a relevncia de uma notcia deve ser calculada, produzindo um resultado que decaia com o passar do tempo. Aps ser feita a recuperao de notcias preciso agrupar os documentos resultantes em reas de interesse, de forma a possibilitar uma melhor visualizao deste contedo por parte do usurio. Para este trabalho foram escolhidas as reas de interesse: esporte, cincia, mundo, negcios, sade e tecnologia. A classificao das notcias nas reas de interesse escolhidas pode ser feita com o uso de tcnicas de classificao.

2.2 Classificao de novas notcias


Em alguns casos, o escopo (conjunto de trabalho) das notcias a serem trabalhadas suficientemente complexo para que o processamento destes dados seja um gargalo no sistema. Esse fenmeno influencia, entre outras atividades, o desempenho da classificao de informao, em especfico, ele mais srio na classificao de notcias devido ao seu volume e volatilidade. Uma maneira de minimizar o tempo de processamento da classificao de notcias por meio da insero de uma etapa de prprocessamento, a fim de retirar as informaes consideradas irrelevantes sua classificao. A diminuio do volume de dados presentes em um documento implica em um melhor tempo de processamento do mesmo. 2.2.1 Pr-processamento do Texto possvel otimizar o processamento de notcias na tarefa de recomendao de informao, fazendo uso de tcnicas como a aplicao de stemming, a eliminao de stop words e reduzindo a quantidade de termos dos documentos (Jannach, Janker, Felfernig, & Friedrich, 2011). Estas tcnicas so descritas a seguir. O conceito de stop words representa todas as preposies e artigos, alm de termos sem valor no domnio em questo, que podem ser removidos do documento sem alterar o resultado dos algoritmos que realizam clculos de similaridades de documentos

(Jannach, Janker, Felfernig, & Friedrich, 2011). Em geral, aplica-se a filtragem das stop words logo aps a extrao do texto de sua fonte. O termo stemming, ou conflation, consiste na substituio de palavras pelos seus radicais (root word), com o intuito de reduzir o conjunto de termos de trabalho e aumentar a frequncia das palavras que representam um mesmo termo. Essa tcnica comumente utiliza anlises morfolgicas, como por exemplo o algoritmo Porters suffix-stripping (Porter, 1980) e a busca de palavras em bases como a WordNet (Fellbaum, 1998). Um problema com o stemming que essa tcnica pode reduzir duas palavras com funes lingusticas diferentes (e.g. substantivo e verbo) ao mesmo radical, mas que na prtica no se referem ao mesmo termo (Jannach, Janker, Felfernig, & Friedrich, 2011). Uma soluo para este problema a utilizao da tcnica de lematizao, a qual difere do stemming por no perder a funo lingustica das palavras analisadas (Manning, Raghavan, & Schtze, 2008). Em geral a lematizao produz melhores resultados do que o stemming, porm com uma carga maior de processamento. Neste trabalho, foi escolhido utilizar a tcnica de stemming, visando obter um melhor desempenho do sistema. A reduo do nmero de elementos a serem trabalhados um mtodo que busca, por meio da reduo de dimensionalidade do documento, reduzir os rudos contidos nos dados e tambm melhorar o desempenho do seu processamento, utilizando apenas os termos mais relevantes do contedo (Jannach, Janker, Felfernig, & Friedrich, 2011). Segundo o princpio 80/20 de Vilfredo Pareto, 80% dos resultados so provenientes de 20% dos esforos utilizados (Koch, 2000). Esta tcnica j foi empregada por (Marchi, 2010) na tarefa de RI, produzindo uma boa relao entre ganho de desempenho e perda de qualidade dos resultados. A relao de ganhos de desempenho versus a perda na qualidade dos resultados abordada na Seo 4 deste trabalho. As tcnicas de stemming, eliminao de stop words e reduo do nmero de elementos, foram empregadas neste trabalho visando melhorar o desempenho da classificao de novas notcias recuperadas da Internet.

2.2.2 Tcnicas para classificao de documentos Existem diversas tcnicas para classificao de documentos como, por exemplo, o algoritmo probabilstico Naive Bayes (Segaran, 2007) e as tcnicas matemticas de similaridade pelo cosseno e o coeficiente de Jaccard (Marmanis & Babenko, 2009). O classificador Naive Bayes (Bayesiano Ingnuo) um classificador estatstico comumente utilizado, sendo uma de suas caractersticas a aprendizagem supervisionada de atributos classificadores, que representam conjuntos aprendidos pelo classificador. Neste trabalho, os conjuntos aprendidos pelo classificador so as reas de interesse de notcias. Para o classificador Naive Bayes, as probabilidades dos atributos classificadores so incondicionais, ou seja, no dependem umas das outras. Deste modo, o resultado de uma classificao pode ser calculado pela multiplicao das probabilidades individuais de cada atributo classificador por uma rea de interesse, ou seja, ( ) ( ). ( )

2.3 Personalizao
A recomendao de notcias uma forma de personalizao da recuperao de informao. O foco da rea de recomendao de informao a localizao e a apresentao da informao relevante a um tpico especfico. Em geral, sistemas recomendadores servem a dois propsitos: estimular o usurio h realizar uma tarefa (como comprar um livro ou assistir um filme), ou tratar a sobrecarga de informao, por meio da seleo, em um conjunto extenso de itens, do contedo mais relevante ao usurio (Jannach, Janker, Felfernig, & Friedrich, 2011). A recomendao de informao pode ser feita com o uso de tcnicas que calculam a similaridade entre documentos como, por exemplo, a similaridade pelo cosseno e o coeficiente de Jaccard (Marmanis & Babenko, 2009). Essas tcnicas j foram empregadas com sucesso por Marmanis & Babenko (2009) e Segaran (2007) na construo de sistemas recomendadores. Estas tcnicas so descritas a seguir. 2.3.1 Clculo de Similaridade entre Documentos A tcnica de similaridade pelo cosseno consiste no clculo do cosseno do ngulo entre dois vetores n-dimensionais de termos, e , que representam documentos,

conforme a equao apresentada na Figura 2. A equao calcula a diviso entre os resultados da multiplicao entre os vetores e e a multiplicao da norma desses vetores, | | e | |. A similaridade entre os dois documentos estar no intervalo [0,1] em que valores prximos a 1 indicam uma similaridade forte e valores prximos a 0, indicam uma similaridade fraca (Jannach, Janker, Felfernig, & Friedrich, 2011).

Figura 2. Equao para o clculo da similaridade pelo cosseno (Huang, 2008).

A similaridade entre documentos por meio do uso da tcnica do coeficiente de Jaccard consiste na diviso entre a interseco dos vetores e , que representam documentos, e tambm a unio destes vetores, resultando na poro similar de termos entre os dois documentos, como apresentado na Figura 3. O intervalo de valores resultantes desta tcnica est entre [0,1], em que valores prximos a 1 indicam uma similaridade forte e, valores prximos a 0, uma similaridade fraca (Huang, 2008).

Figura 3. Equao para o clculo do coeficiente de Jaccard (Huang, 2008).

Para utilizar as equaes apresentadas na Figura 2 e na Figura 3 para clculo de similaridade a fim de recomendar notcias aos usurios, necessrio modelar vetorialmente as notcias e tambm o interesse do usurio. Com a utilizao da representao vetorial dos dados possvel recomendar notcias com uso das tcnicas descritas. Para um sistema automatizado aprender sobre o interesse do usurio podem ser utilizadas as tcnicas de relevance feedback. 2.3.2 Relevance Feedback Existem duas maneiras de um sistema automatizado identificar o interesse de um usurio: requisitar a sua opinio implicitamente ou explicitamente. O feedback implcito captura o interesse do usurio de forma transparente, utilizando tcnicas como o monitoramento das aes do usurio. Essa forma de coleta de feedback muitas vezes gera dados equivocados, por causa da interpretao erronia das intenes do usurio (Jannach, Janker, Felfernig, & Friedrich, 2011). O feedback explcito, por sua vez, 7

consiste em capturar o interesse do usurio de maneira explcita, requerendo sua avaliao sobre um dado elemento. Esse provavelmente o mtodo mais preciso para se coletar o feedback do usurio, pois sua inteno explicitada de maneira espontnea, dificilmente havendo equvocos quanto ao seu interesse. O principal problema do feedback explicito , alm de requerer esforos do usurio na avaliao de um dado elemento, existir a possibilidade do usurio no estar disposto a faz-lo. Portanto, o nmero de avaliaes realizadas pode ser pequeno, tornando a recomendao pobre. Uma soluo para esse problema fazer com que o usurio pontue tantos itens quanto forem necessrios no prlogo do fluxo de execuo do recomendador. Assim o sistema passa a ter condies de iniciar sua recomendao de dados baseado no interesse do usurio (Jannach, Janker, Felfernig, & Friedrich, 2011). O feedback implcito, por sua vez, pode ser coletado constantemente sem requerer esforos do usurio, porm no se h certeza de que a ao do usurio tenha sido interpretada corretamente pelo recomendador. Por exemplo, se um usurio compra vrios livros, o recomendador deve interpretar que o usurio se interessa por esses livros. Essa avaliao pode ser equivocada, uma vez que um ou mais livros sejam destinados outra pessoa. Apesar de ambas as tcnicas terem suas vantagens, coletar feedback explicitamente resulta em uma melhor preciso do que colet-lo implicitamente (Jannach, Janker, Felfernig, & Friedrich, 2011). Portanto, neste trabalho, optou-se pelo uso do feedback explcito, por se entender que o esforo dos usurios em indicar se uma notcia lhe agrada ou no compensador em funo da filtragem de informao que isso proporciona.

Desenvolvimento
Com base na anlise dos problemas levantados, foi elaborada uma arquitetura para

um sistema recomendador de notcias. A Figura 4 representa a arquitetura de alto nvel do sistema recomendador de notcias desenvolvido.

Figura 4. Viso geral do sistema.

Esta arquitetura consiste de um processo de cinco etapas. Primeiramente feito o pr-processamento do contedo extrado da Web. Ento esse contedo classificado entre as reas de interesse escolhidas para serem abordadas no sistema. Aps a classificao, o contedo submetido ao mdulo de recomendao (o qual modela os interesses do usurio) que gera a apresentado dos resultados ao usurio, possibilitando a interao do usurio com o sistema, por meio de feedback positivo e/ou negativo.

3.1 O Pr-Processamento
Para classificar ou recomendar notcias ao usurio, primeiramente deve ser realizado o pr-processamento dessas informaes, a fim de prepar-las para serem trabalhadas. Para tanto, foi utilizado o mecanismo de RSS (Rich Site Summary), o qual um padro que consiste em arquivos com extenso XML e permite a distribuio de notcias e outros contedos Web a usurios (elikba, 2004). Fazendo uso da estrutura RSS e tendo acesso a um conjunto de websites que apresentam suas notcias nesse formato, possvel recuperar a informao da Web de forma rpida e estruturada, permitindo o processamento dessa informao e, por consequncia, sua recomendao. Para o desenvolvimento deste trabalho foi escolhida a linguagem de programao Python (Lutz, 2006), verso 2.7.3, por se entender que a mesma possui facilidades para trabalhar com o desenvolvimento Web e por esta possuir diversas bibliotecas que podem

auxiliar o desenvolvimento da ferramenta proposta, como por exemplo as bibliotecas para extrao de contedo RSS. Na fase de pr-processamento, foi utilizada uma lista de websites que trabalham com a estrutura de RSS e que apresentam notcias diariamente. As pginas desses websites foram processadas a partir de seus arquivos RSS, sendo todas suas notcias extradas, como apresentado na Figura 5. Aps a extrao do contedo RSS, foi realizado um prprocessamento dessa informao, retirando termos insignificantes sua classificao e recomendao e tambm reduzindo as palavras aos seus radicais. Nessa fase foram utilizadas as tcnicas de eliminao de stop words e o stemming. Com a aplicao dessas tcnicas, obtm-se um conjunto mais compacto de dados, o que implica em um melhor desempenho na recomendao de notcias, segundo Marchi (2010). Aps a aplicao do stemming e a eliminao de stop words calculada a frequncia de todas as palavras do documento e montado um vetor termo-frequncia que representa formalmente o documento. importante gerar uma boa estrutura de representao de um documento, pois quanto mais coerente essa estrutura for, melhores resultados so apresentados na recomendao de informao. Aps montado o vetor termo-frequncia, pode-se ainda fazer um corte no nmero de termos que representam o documento aplicando, por exemplo, o princpio 80/20 de Pareto (Jannach, Janker, Felfernig, & Friedrich, 2011). Neste trabalho, foi escolhido realizar este corte visando o desempenho do sistema, fazendo uso de somente 20% dos termos mais relevantes de um documento, ou seja, aqueles que possuem maior frequncia no vetor termo-frequncia. Este valor pode ser alterado futuramente para um processo de otimizao. Por fim, a estrutura criada foi salva em uma base de dados, para que no fosse necessrio reprocessar o contedo.

10

Figura 5. Pr-processamento das notcias.

Aps o pr-processamento do contedo, passa-se etapa de classificao das notcias recuperadas da Web dentre as reas de interesse escolhidas para este trabalho, que so: cincia, esporte, mundo, negcios, sade e tecnologia. Classificando as notcias, pode-se apresentar o contedo de maneira categorizada, facilitando ao usurio a busca por notcias de seu interesse.

3.2 O Treinamento do Classificador


Para classificar as notcias foi escolhido utilizar o classificador Naive Bayes, por sua simplicidade de implementao e qualidade dos resultados gerados. Para utilizar esse classificador foi necessrio trein-lo a identificar, dado um conjunto de notcias, a rea de interesse que cada uma melhor se enquadra. Sabendo-se de qual pgina Web cada notcia foi retirada, pode-se etiquetar cada pgina com sua respectiva rea de interesse e usar este conjunto de dados para treinar o classificador, a fim de identificar quais os termos que definem cada uma das categorias escolhidas, como apresentado na Figura 6.

11

Figura 6. Treinamento do classificador Naive Bayes.

Na Tabela 1 apresentada a quantidade de websites publicadores de notcias de uma rea de interesse vistoriados durante duas semanas, a fim de tornar o classificador Naive Bayes apto a identificar a rea de interesse de uma dada notcia. A quantidade de pginas no uniforme entre as categorias de notcias porque este detalhe no foi planejado previamente ao treinamento do classificador, porm interessante para testes futuros que sejam coletadas amostras com quantidades similares de notcias de cada rea de interesse.
Tabela 1. Quantidade de websites vistoriados para a aprendizagem do classificador Naive Bayes.

Cincia 6

Esporte 12

Mundo 22

Negcios 8

Sade 8

Tecnologia 14

Uma vez treinado, o classificador estar apto a classificar notcias entre reas de interesse. O treinamento do classificador tambm pode ser contnuo, ou seja, continuar a ocorrer durante o processo de uso do sistema.

3.3 A classificao
Conforme apresentado na Figura 7, para a classificao de uma nova notcia, primeiramente carregada a base pr-processada de notcias. Em seguida, realizada a limpeza das notcias que no so mais consideradas relevantes dentro de uma janela de tempo estabelecida. Esta janela o intervalo de tempo que uma notcia pode ter valor

12

para o usurio, pois as notcias perdem seu valor informativo ao passar do tempo. A janela considerada neste trabalho foi de sete dias. A eliminao de notcias antigas, alm de retirar da base pr-processada de notcias aqueles elementos que no so relevantes, reduz a dimenso da base de dados, melhorando o desempenho de seu processamento.

Figura 7. Classificao de novas notcias.

Aps remover as notcias consideradas antigas, inicia-se a pontuao das novas por meio do classificador Naive Bayes. Por meio de uma consulta ao classificador, uma notcia pontuada para cada rea de interesse, por meio da probabilidade desta notcia pertencer rea especfica. Vale ressaltar que neste ponto a base de dados contm notcias novas, que foram buscadas da Web e ainda no classificadas, e tambm notcias j classificadas, mas que ainda se encontram na janela de tempo estabelecida. Aps ser determinada a pontuao, o conjunto de novas notcias mesclado ao conjunto antigo e, ento, realizado um decaimento das notas para cada dia de envelhecimento da notcia, pois ao passar de cada dia, a notcia perde relevncia, at sair de sua janela de vida e no ser mais considerada relevante. Para o clculo do decaimento da nota de uma notcia utilizada a equao da Figura 8.

Figura 8. Equao de decaimento de relevncia de uma notcia.

A equao da Figura 8 decrementa 15% da nota atribuda pelo classificador a uma notcia para cada dia de envelhecimento da mesma, o que faz com que a noticia perca seu valor em torno de uma semana. Esse intervalo de tempo e o valor de decremento

13

foram considerados como valores iniciais a serem utilizados, mas devem ser otimizados em um prximo trabalho para garantir melhores resultados. Aps o decaimento das notas, as notcias podem ser ordenadas para cada rea de interesse. Desta forma, tm-se as notcias ordenadas pela significncia referente rea de interesse da qual fazem parte. Esta tarefa conhecida na literatura como ranking das notcias. Por fim, esse conjunto ordenado salvo em uma base de resultados pronto para ser apresentado ao usurio.

3.4 A apresentao
Aps a classificao, as notcias podem ser apresentadas ao usurio. A Figura 9 exibe o prottipo da tela inicial do sistema proposto.

Figura 9. Interface da tela inicial do prottipo.

No centro da tela inicial do sistema existem sete botes, os seis primeiros referentes s categorias de notcias e o ltimo ao contedo personalizado, baseado na modelagem do interesse do usurio, a ser discutida adiante. A tela inicial permite tambm que o usurio se cadastre no sistema, definindo um nome de usurio e senha, para ter acesso personalizado apresentao das notcias. A Figura 10 exemplifica a apresentao de notcias referentes rea de interesse de tecnologia.

14

Figura 10. Interface da tela de notcias de tecnologia.

A tela de apresentao de notcias, mostrada na Figura 10, contm os 10 itens considerados mais relevantes em suas categorias pelo algoritmo de ranking utilizado na fase de classificao. Esta tela no foi otimizada para aspectos de usabilidade, sendo construda somente para fins de experimentao. Desde que o usurio esteja conectado no sistema com suas credenciais, ele pode interagir com o sistema de recomendao por meio de dois botes localizados a direita de cada notcia: o primeiro possibilitando o usurio atribuir um feedback positivo e o segundo um feedback negativo em relao a notcia referida. A possibilidade de o usurio interagir com o sistema, por meio do uso de feedback, permite ao sistema

15

capturar o interesse do usurio. Por meio da modelagem deste interesse, uma recomendao personalizada de notcias pode ser apresentada ao usurio.

3.5 Modelagem do Interesse do Usurio


Uma boa recomendao para o usurio do sistema de notcias baseada em uma boa modelagem tanto do contedo (informao) trabalhado quanto do usurio ao qual a notcia ser recomendada. Para isso necessrio fazer uso de tcnicas que permitam relacionar o interesse do usurio e tambm as notcias. Uma maneira de fazer esse relacionamento por meio da utilizao do modelo termo-frequncia na modelagem do interesse do usurio, assim como utilizado na modelagem de notcias. Deste modo, o interesse do usurio composto por um vetor de palavras e suas respectivas frequncias, que correspondem s palavras e as frequncias dos termos mais significativos dos documentos que o usurio apresenta interesse.

3.6 Relevance Feedback


Para conhecer o contedo que o usurio deseja ou no ter acesso feito uso de relevance feedback por parte do usurio. O feedback de extrema importncia para um sistema recomendador de notcias, pois por meio desta ao que captado o interesse do usurio do sistema em um determinado tpico. Para este trabalho foi escolhido fazer uso apenas de feedback explcito, por se entender que esta tcnica no causa falsas interpretaes quanto ao interesse do usurio e porque seus resultados so suficientemente relevantes. Neste trabalho foi considerado que o usurio ou possui interesse em uma notcia, ou ele no possui interesse. Ou seja, no foi considerado que haja um meio termo no interesse do usurio por um determinado dado. Desta maneira, pode-se criar um mecanismo que capte esse interesse por uma notcia, sendo ele positivo ou negativo. Visto que a representao das notcias e do interesse do usurio so modelados na forma de vetores termo-frequncia, o feedback positivo age de forma incremental no modelo do usurio, somando a frequncia das palavras contidas em um documento que o usurio tenha mostrado interesse ao modelo de interesse atual do usurio, como exemplificado na Figura 11.

16

Figura 11. Feedback positivo e interesse do usurio.

O feedback negativo, por sua vez, age de forma decremental. As frequncias das palavras contidas no documento que o usurio demonstrou desinteresse so decrementadas do modelo de interesse do usurio, como exemplificado na Figura 12. O intervalo dos possveis valores das frequncias dos termos o dos nmeros inteiros, ou seja, podem-se ter valores negativos e positivos. Percebe-se assim que se for aplicado um feedback negativo e um termo do documento vinculado ao feedback ainda no estiver contido no modelo de interesse do usurio, ou ento se esse documento possuir uma frequncia maior do que a contida no modelo de interesse do usurio, a frequncia deste termo ser negativa. Isto est correto, pois caso a frequncia fosse limitada inferiormente a zero, haveria uma limitao quanto expressividade do desinteresse do usurio, no sendo perceptvel a dimenso da falta de interesse do usurio por um documento.

Figura 12. Feedback negativo e o interesse do usurio.

17

Por fim, capturando o interesse do usurio, pode-se recomendar notcias a ele, tomando como base este interesse. Assim, acessando o stimo boto da tela inicial do sistema, apresentada na Figura 9, o usurio ter acesso a uma apresentao personalizada de notcias, criada por meio da recomendao de informao.

3.7 Recomendao
A fase de recomendao consiste em, por meio da utilizao dos mecanismos de relevance feedback, obter o interesse do usurio e recomendar notcias baseado nesse interesse. Como j foi descrito, existe um modelo que representa o interesse do usurio e toda vez que o usurio do sistema realiza um feedback esse modelo sofre uma alterao, de forma a convergir ao interesse real do usurio. A recomendao de notcias no sistema proposto neste trabalho consistem em uma apresentao personalizada da informao. Aps buscar as notcias na Web e classificlas conforme sua rea de interesse, o clculo de similaridade entre o modelo de cada notcia e o modelo de interesse do usurio efetuado, com o propsito de listar as notcias em ordem de relevncia ao modelo de interesse do usurio. Desta forma, em uma pesquisa personalizada podem aparecer notcias de reas de interesse distintas, como exemplificado na Figura 13.

18

Figura 13. Pgina de notcias recomendadas ao usurio.

Para realizar a tarefa de recomendao de notcias foi utilizada, primeiramente, a tcnica do coeficiente de Jaccard para calcular a similaridade entre os modelos de uma notcia e do usurio. Nessa abordagem, o interesse do usurio foi determinado por meio de um conjunto de palavras, sem considerar suas frequncias, o que resultou em problemas ao modelar o interesse do usurio e ao calcular a similaridade entre os documentos. Primeiramente percebeu-se que o resultado obtido do clculo da similaridade entre documentos era limitado. Isto ocorreu por serem levadas em considerao apenas a unio e a interseo entre os documentos que consistiam em termos, sem considerar as suas frequencias, resultando em similaridades errneas. O segundo problema a ser destacado foi quanto ao uso de relevance feedback. Quando o usurio realizava um feedback positivo, as novas palavras eram adicionadas ao seu modelo de interesse e,

19

quando um feedback negativo era efetuado, as novas palavras eram retiradas do modelo de interesse do usurio. O problema ocorre quando um termo realmente significativo na representao do interesse do usurio retirado do seu modelo de interesse por aparecer em um documento que o usurio no se interessou. Este fenmeno torna o modelo de interesse do usurio inconsistente, o que afeta os resultados apresentados. Com essas concluses foi decidido modificar os mtodos de representao de documentos e do interesse do usurio e tambm modificar a tcnica para clculo de similaridade entre documentos. A tcnica de similaridade pelo cosseno obteve bons resultados quando utilizada juntamente com o modelo termo-frequncia para representao de documentos e dos interesses dos usurios. Nessa abordagem os documentos so representados por um vetor de tuplas termo-frequncia, o que no gerou os mesmos problemas da tcnica anterior, devido utilizao das frequncias dos termos. Agora, o clculo de similaridade leva em considerao uma equao matemtica que calcula a similaridade entre dois documentos e no apenas a semelhana de conjuntos, como feita anteriormente. Por fim, o mecanismo de relevance feedback incrementa ou decrementa as frequncias dos termos do documento, no ocorrendo o problema de descarte de termos relevantes devido a ocorrncia de um feedback negativo do usurio em um documento que contm esses termos.

3.8 As Classes do Sistema


Aps serem descritas as etapas de funcionamento do sistema, pde-se fazer uma ltima representao da arquitetura do sistema, desta vez focando nas classes escolhidas para a modelagem do sistema utilizando o paradigma de Orientao a Objetos. A Figura 14 representa as classes implementadas no sistema e a maneira com a qual elas se relacionam.

20

Figura 14. Diagrama de classe do sistema.

21

Foram criadas oito classes para modelar o sistema. A classe Web modela a parte do sistema Web com a qual o usurio interage, fazendo-se uso da biblioteca CherryPy, apresentada na Subseo 3.9. Por meio desta classe o usurio possui acesso s notcias classificadas (Figura 10) e tambm s notcias recomendadas (Figura 13). A classe NaiveBayes representa o classificador Naive Bayes, importado da biblioteca Python Reverend (Reverend B, 2012), que foi utilizada para classificar as notcias entre as categorias do sistema. A classe ClassifierTrainer utilizada para treinar o classificador Naive Bayes, a fim de torn-lo apto a classificar corretamente uma notcia em uma das reas de interesse escolhidas para este trabalho. Esta classe faz uso da classe NewsSearch para buscar notcias da Web e faz uso dos termos gerados pela classe PreProcessing, que contm mtodos para a etapa de pr-processamento, utilizada na extrao das notcias da Web. A classe NewsSearch tambm faz uso da classe Scorer, que efetua a etapa de pontuao das notcias, eliminao das notcias antigas e tambm o ranking das notcias por reas de interesse. A classe User representa o usurio, seu login e senha de acesso ao sistema, os websites que ele gosta ou no no sistema e os termos que representam seu interesse. Esta classe relaciona-se diretamente com a classe News, que modela uma notcia extrada de documentos RSS, contendo seu ttulo, descrio, data de acesso, o endereo de acesso notcia e os termos que a representam. A classe NewsSearch pode ser considerada o corao do sistema. Percebe-se por meio da Figura 14, que esta a classe com o maior nmero de relacionamentos do sistema. A classe NewsSearch varre as pginas Web escolhidas (ver Apndice) a fim de buscar notcias e classific-las. Ou seja, esta classe utiliza a classe PreProcessing, a Naive Bayes, a News e a Scorer, enfim, por meio desta classe que o sistema, em sua maior parte, funciona. Diversas bibliotecas foram utilizadas no desenvolvimento das classes do sistema. Uma das principais vantagens de se utilizar bibliotecas o reuso de cdigo. Assim se ganha tempo no desenvolvimento do sistema e tambm confiabilidade, uma vez que essas bibliotecas j foram testadas pela comunidade que as utilizam.

22

3.9 Bibliotecas e Frameworks Utilizados


Na linguagem de programao Python os conjuntos de sub-rotinas empacotados so conhecidos como bibliotecas. Isso explica as ocorrncias prvias deste termo ao longo deste trabalho. Para o desenvolvimento deste trabalho foram utilizadas algumas bibliotecas no padres da linguagem de programao Python, a fim de facilitar algumas etapas de desenvolvimento como: a extrao de contedo RSS, o processamento de linguagem natural, a criao do classificador Naive Bayes e a criao de um servidor Python para manter o sistema online. As bibliotecas utilizadas, em ordem alfabtica, foram: BeautifulSoup, CherryPy, Feedparser, NLTK e Reverend. 3.9.1 BeautifulSoup A BeautifulSoup (BeautifulSoup, 2012) uma biblioteca Python que prov suporte a screen-scraping. Suas trs principais caractersticas so: 1. Possui suporte a navegao e a busca pelo contedo na Web e tambm alterao de parse trees, ou seja, o BeautifulSoup extrai contedo de documentos, com o benefcio do programador utilizar poucas linhas de cdigo nessas operaes; 2. No necessrio se preocupar com a codificao dos documentos utilizados, o BeautifulSoup codifica e decodifica os documentos automaticamente; 3. O BeautifulSoup um dos parsers Python mais utilizados para extrao de contedo HTML e XML. A BeautifulSoup foi utilizado neste trabalho para auxiliar na extrao do contedo HTML. A verso utilizada da biblioteca foi a 4.1.3. 3.9.2 CherryPy O CherryPy (CherryPy, 2012) um framework Python que permite o desenvolvimento de aplicaes Python Web da mesma maneira que se desenvolvem aplicaes orientadas a objetos, no voltadas Web. Essa forma de desenvolvimento resulta em um cdigo mais compacto e desenvolvido em um menor tempo (CherryPy 3.2.0 Documentation). O CherryPy foi utilizado como servidor para manter o sistema online. Foi utilizada a verso 3.2.2 desse framework no desenvolvimento do trabalho.

23

3.9.3 Feedparser A biblioteca Feedparser (Feedparser B, 2012) uma biblioteca Python que fornece suporte ao tratamento do contedo RSS. Dada uma estrutura RSS possvel acessar os dados de cada item contido nessa estrutura como exemplificado na Tabela 2 (a qual contm algumas das funcionalidades disponibilizadas pela biblioteca Feedparser) segundo (RSS Libraries - PythonInfo Wiki).
Tabela 2. Algumas funcionalidades da biblioteca Feedparser.

Item[date]

"2004-02-13T22:28:23+08:00" - ISO 8601 date

item[ "date_parsed" ] (2004,02,13,14,28,23,4,44,0) item[ "title" ] item[ "summary" ] item[ "link" ] Ttulo do item RSS Sumrio do item RSS Link para o contedo original do item RSS

Neste trabalho foi utilizada a verso 5.1.2 da biblioteca Feedparser. 3.9.4 NLTK A NLTK (Natural Language Toolkit) (Natural Language Toolkit - NLTK 2.0 documentation) uma biblioteca Python para processamento de linguagem natural e tambm uma ferramenta para ensinar e trabalhar a lingustica computacional. A NLTK prov suporte classificao, tokenizao, stemming, tagging, parsing e anlise semntica para linguagem natural. Neste trabalho a biblioteca foi utilizada no prprocessamento de texto por meio da eliminao de stop words, a aplicao do stemming e a criao de tuplas termo-frequncia. A verso da biblioteca utilizada foi a 2.0. 3.9.5 Reverend O Reverend um classificador Naive Bayes, de propsito geral, desenvolvido em Python (Feedparser A, 2012). Esse classificador foi desenvolvido para ser facilmente estendido para qualquer domnio de aplicao, apenas havendo de adapt-lo aos dados de entrada (Feedparser B, 2012). Utilizado na forma de uma biblioteca, o Reverend foi escolhido para a classificao de notcias neste trabalho. A verso utilizada foi a 0.4.

24

Anlise dos Resultados


A rea de recomendao de informao preocupa-se com a coerncia dos dados

apresentados, com a eficincia no processamento dos dados e com sua apresentao. O principal problema dessa rea unir esses dois pontos: qualidade e eficincia. Quando o foco a recomendao de notcias esses problemas se agravam, pois notcias so postadas diariamente em websites, o que implica em uma busca constante pela informao e um processamento pesado desses dados.

4.1 Modelos de Representao


Neste trabalho foram escolhidas tcnicas com o intuito de conciliar a eficincia do processamento de notcias com a qualidade dos resultados gerados, fazendo-se uso de tcnicas de reduo de dimensionalidade (remoo de stop words, stemming, etc.), de um classificador Naive Bayes para classificar novas notcias e do algoritmo de similaridade pelo cosseno para a recomendao de notcias ao usurio. Alm do mais, percebeu-se que a utilizao em conjunto da tcnica coeficiente de Jaccard (para clculo de similaridade entre um usurio e documentos) e de um conjunto de termos, sem considerar suas frequncias (para representar os documentos), no se mostrou adequada, gerando resultados no satisfatrios. Portanto, essas duas ltimas tcnicas deixaram de ser utilizadas.

4.2 Qualidade do Ranking de Notcias


Com o intuito de verificar a qualidade do ranking das notcias contidas nas categorias do sistema, por meio do classificador Naive Bayes, ao longo de cinco dias foram analisadas manualmente as 10 notcias melhor classificadas em cada uma das reas de interesse, considerando apenas as notcias dirias para evitar dados duplicados ao longo da anlise. Ao todo foram inspecionadas 300 notcias, sendo 50 dessas pertencentes a cada uma das reas de interesse do sistema. Vale ressaltar que os perodos de treinamento e teste do classificador so distintos, ou seja, os conjuntos de notcias so diferentes. O resultado obtido representado na Tabela 3, com valores entre 0 e 1 que representam a corretude da classificao das notcias analisadas.

25

Tabela 3. Resultado do teste de qualidade do ranking de notcias.

Mundo 1 dia 2 dia 3 dia 4 dia 5 dia 1 1 1 1 1

Esporte 1 1 1 1 1

Tecnologia 1 1 1 0,9 1

Cincia 0,8 0,9 0,8 0,9 1

Sade 1 0,9 1 1 0,8

Negcios 1 0,8 1 0,8 0,7

A Figura 15 apresenta graficamente o desempenho do classificador durante o teste para cada uma das categorias do sistema. As notcias apresentadas na categoria Mundo e na categoria Esporte foram corretamente classificadas ao longo dos cinco dias de avaliao, obtendo 100% de corretude com suas reas de interesse. As notcias apresentadas na categoria Tecnologia obtiveram 98% de compatibilidade com esta categoria, com apenas uma notcia erroneamente classificada. As categorias Cincia e Sade obtiveram 90% e 94% de compatibilidade, respectivamente. Por fim, a categoria Negcios obteve 86% de compatibilidade com as notcias apresentadas, sendo o pior ranking entre as reas de interesse. A mdia da qualidade do ranking das notcias apresentadas nas seis reas de interesse durante os cinco dias de avaliao foi de 94.6%, sendo um resultado satisfatrio para o prottipo.

26

Ranking das notcias por categorias


100% 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% Mundo Esporte Tecnologia Cincia Sade Negcio

Figura 15. Ranking das notcias por categorias utilizando 100% dos termos para representao de notcias.

J foi dito neste trabalho, que uma boa relao entre qualidade dos resultados e eficincia de processamento buscada. A fim de verificar esta relao, foi realizado um teste quanto ao custo de processamento do sistema.

4.3 Custo de Processamento do Sistema


Durante os testes realizados na Seo 4.2 deste trabalho, foi calculado o tempo de processamento das etapas de pr-processamento de 100% das notcias de suas fontes, da remoo das notcias antigas, da pontuao das notcias por meio do classificador Naive Bayes e da ordenao delas por reas de interesse. Com esses testes, chegaram-se aos dados apresentado na Tabela 4 (em segundos).
Tabela 4. Resultado do teste de desempenho do sistema.

PrProcessamento

Remoo

Pontuao Ordenao

Tempo Total

1 dia 2 dia 3 dia 4 dia 5 dia

4.688,55 4.277,10 4.293,31 5.019,67 4.854,54

0,15 0,09 1,46E-06 9,76E-07 1,95E-06

46,48 25,24 57,16 53,06 25,88

1,72 1,76 3,67 3,36 1,75

4.736,91 4.304,20 4.354,14 5.076,10 4.882,17

Com a formulao dos dados apresentados na Tabela 4, pde-se elaborar o grfico da Figura 16, que representa a distribuio do tempo em funo das etapas de

27

processamento do sistema, percebendo-se em quais etapas gasto mais tempo de processamento.

Custo de Processamento do Sistema


Pr-Processamento Remoo Pontuao Ordenaao

0,942% 99,056% 0,001% 0,890%

0,053%

Figura 16. Custo de processamento do sistema utilizando 100% de termos do texto.

Com os dados apresentados na Figura 16, percebe-se que o gargalo do sistema est na etapa de pr-processamento das notcias, que gasta 99,056% do tempo de processamento do sistema. Como j era esperado, o processamento de linguagem natural mostrou-se uma atividade custosa, como j citado na literatura por Marchi (2010) e, para obter um melhor desempenho do sistema, necessrio atacar esta fase buscando otimiz-la. Uma alternativa para a melhoria do processamento de linguagem natural a reduo de dimensionalidade do documento a ser trabalho. Assim, pode-se utilizar o princpio 80/20 de Pareto (Koch, 2000).

4.4 Desempenho de 20% e 100% de Termos Utilizados at a Classificao


Buscando melhorar o desempenho do processamento de dados do sistema, testou-se a utilizao de um nmero menor de termos para a representao das notcias. Escolheuse utilizar o Princpio 80/20 de Vilfredo Pareto como princpio de corte, selecionando apenas 20% dos termos com maior frequncia nos documentos, considerando estes os mais relevantes. O novo teste consistiu em refazer o teste da Seo 4.2, porm aplicando o corte de 20% de termos. Aps a realizao deste teste, os dados obtidos pelo teste anterior, que contm 100% dos termos, e pelo novo teste, que contm 20% dos termos,

28

foram inseridos na Tabela 5, a qual apresenta as mdias do tempo de processamento (em segundos) de cada etapa do sistema.
Tabela 5. Comparao de desempenho entre 20% e 100% de termos de documentos utilizados.

20% 100%

PrProcessamento 4.661,05 4.661,19

Remoo 1,46E-06 1,46E-06

Pontuao 10,68 27,29

Ordenao 1,764 1,762

Tempo Total 4.673,50 4.690,24

O tempo obtido na fase de pr-processamento, apresentado na Tabela 5, foi relativamente similar entre a utilizao de 20% e 100% dos termos. Isto se d porque o corte no nmero de termos ocorre apenas ao final da fase de pr-processamento, ou seja, ambos os testes processaram 100% dos termos nessa fase. A fase de remoo obteve-se o mesmo tempo de processamento tanto na utilizao de 20% de termos quanto na utilizao de 100% de termos, uma vez que foi utilizada a mesma base de notcias durante os testes e tambm foram consideradas apenas as notcias dirias, zerando-se a base de notcias a cada dia. Desta maneira no houve remoo de notcias antigas. A fase de pontuao foi 60% mais eficiente com a utilizao de 20% dos termos para representao das notcias, pois menos termos foram testados no classificador Naive Bayes, o que lhe permite uma melhor aprendizagem. A fase de ordenao teve tempo de processamento prximo entre os dois testes realizados, pois ambos possuem a mesma complexidade de ordenao nesta fase. Por fim, concluiu-se que a diferena de tempo de processamento entre a utilizao de 20% dos termos e 100% dos termos pouca e, como ainda no foram analisadas as implicaes de um corte no nmero de termos durante a fase de recomendao de notcias, o sistema continuar a adotar 100% de termos na representao de documentos. Ainda em busca de uma soluo para o tempo de processamento do sistema, decidiu-se testar um novo mtodo de extrao das pginas Web, coletando um menor nmero de termos.

29

4.5 Representao de Notcias por meio de Ttulos e Sumrios


Como apresentado na Figura 16, o gargalo do sistema encontra-se na fase de prprocessamento de documentos. Na tentativa de contornar esse problema, decidiu-se extrair apenas o ttulo e o sumrio de cada notcia, contidos nos documentos RSS. Com essa nova abordagem, desejado que o ganho de desempenho seja satisfatrio e que a perda na qualidade dos resultados seja aceitvel. Um novo teste com durao de cinco dias foi realizado, assim como nos testes anteriores para, ento, chegar-se aos seguintes dados apresentados na Tabela 6 (em segundos).
Tabela 6. Comparao de desempenho entre a utilizao de ttulo e sumrio e de 100% de termos de documentos.

PrRemoo Pontuao Ordenao Tempo Total Processamento


Ttulo /Sumrio

162,86 4.661,19

1,86 1,46E-06

16,57 27,29

2,24 1,762

183,54 4.690,24

100%

Em termos de desempenho percebe-se uma acentuada mudana no tempo de processamento do sistema com a nova abordagem. Enquanto no teste com a utilizao de 100% dos termos das notcias obteve-se um tempo mdio de 4.690,24 segundos (78,17 minutos) de processamento, no teste atual, com a utilizao apenas do ttulo e do sumrio das notcias, chegou-se apenas 183,54 segundos (3,07 minutos) de processamento, uma melhoria de 94,9% no tempo de processamento, cujo resultado extremamente significativo. Porm, ainda se deve analisar a qualidade dos resultados obtidos com a utilizao da nova abordagem. A qualidade do ranking das notcias, obtida pelo teste realizado com a utilizao de ttulo e sumrio para representar notcias, segue apresentado na Tabela 7.

30

Tabela 7. Resultado do teste de qualidade do ranking de notcias com a utilizao de ttulo e sumrio como forma de representao de documentos.

Mundo 1 1 1 1 1

Esporte 1 1 1 1 1

Tecnologia 1 1 1 1 1

Cincia 0,7 0,5 0,7 0,5 0,5

Sade 0,6 0,6 0,8 0,7 0,7

Negcios 0,5 0,5 0,6 0,6 0,5

Com os dados apresentados na Tabela 7, pde-se elaborar um grfico comparativo entre a qualidade do ranking das notcias com a utilizao desta nova abordagem. O grfico segue apresentado na Figura 17.

Ranking das notcias por categorias


100% 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% Mundo Esporte Tecnologia Cincia Sade Negcio

Figura 17. Ranking das notcias por categorias utilizando ttulo e sumrio para representao de documentos.

Como apresentado na Figura 17, a qualidade do ranking das notcias apresentadas nas categorias Mundo, Esporte e Tecnologia foi de 100%, resultado pouco superior ao teste com a utilizao de 100% de termos. A categoria Cincia teve 58% de notcias corretamente classificadas, a categoria Sade 68% e, a categoria Negcios, teve 54% de notcias corretamente classificadas. Como nota geral, para o caso de teste com a utilizao do ttulo e do sumrio para representao de notcias, a qualidade do ranking das notcias nas seis reas de interesse do sistema foi de 80%, uma 31

perda de 14,6% na qualidade dos resultados apresentados em comparao utilizao de 100% dos termos das notcias para represent-las. Em termos gerais o resultado obtido neste ltimo teste satisfatrio, pois o ganho de desempenho muito grande e a perda na qualidade dos resultados satisfatria para o propsito do sistema. Entretanto, na Tabela 7 percebemos que enquanto as categorias Mundo, Esporte e Tecnologia tiveram suas notcias bem classificadas, as demais categorias tiveram resultados inferiores ao teste da Subseo 4.2, tendo a categoria Negcios apenas 54% de corretude nas notcias apresentadas. Pensa-se que com um melhor treinamento do classificador Naive Bayes esse problema seja corrigido, atingindo melhores resultados.

32

Concluses
A excessiva sobrecarga de informao contida na Web nos levou a desenvolver este

trabalho visando tornar mais hbil o acesso do usurio a informao de seu interesse. A notcia, sendo apenas um subconjunto da informao, foi o nicho escolhido a ser trabalhado e, dentro deste grupo, optou-se por criar um sistema recomendador de notcias pertencentes a um conjunto restrito de reas de interesse: esporte, cincia, mundo, negcios, sade e tecnologia. Os resultados obtidos ao longo deste trabalho foram satisfatrios. Chegou-se ao valor mdio de 1.227 notcias recuperas diariamente. Foi analisada a aplicao de tcnicas distintas para a modelagem das notcias e tambm para sua recomendao. Percebeu-se que o modelo composto pela utilizao em conjunto da tcnica do coeficiente de Jaccard (para clculo de similaridade entre os interesses de um usurio e documentos) e de um conjunto de termos, sem considerar suas frequncias (para representar os documentos), no se mostrou adequado, devido a uma inconsistente modelagem do interesse do usurio. Para contornar esse problema, adotou-se o modelo de representao termo-frequncia na modelagem das notcias e do interesse do usurio e, tambm, o uso da tcnica de similaridade pelo cosseno para o clculo de similaridade entre documentos e o modelo do usurio, contornando os problemas apresentados pelo modelo anterior. Por meio de testes, foi avaliado o ranking das notcias nas reas de interesse do sistema. Inicialmente utilizou-se de 100% dos termos das notcias, obtendo uma preciso de 94,6%. Porm, a eficincia do processamento do sistema foi baixa, com valor mdio de 4.690,24 segundos (78,17 minutos) de processamento. A fim de se obter uma boa relao entre ganho de desempenho e qualidade dos resultados, testou-se a utilizao do princpio 80/20 de Pareto, reduzindo a quantidade de termos aos 20% mais frequentes. Este experimento no produziu resultados melhores que o uso de 100% dos termos. Por meio de testes, percebeu-se que o gargalo do sistema encontrava-se na fase de pr-processamento das notcias e, como a reduo do nmero de termos de um documento realizada ao final desta fase, o ganho de desempenho irrisrio nas fases seguintes.

33

Ainda na tentativa de otimizar o processamento do sistema, testou-se a utilizao apenas do ttulo e do sumrio na representao das notcias. Em relao utilizao de 100% dos termos extrados das notcias, a nova modelagem obteve ganho de desempenho de 94,9% e perca de 14,6% na qualidade dos resultados. Esse resultado foi considerado satisfatrio, pois o ganho de desempenho muito grande e a perca na qualidade dos resultados aceitvel para o propsito do sistema. Como esse trabalho no est concludo, tem-se como metas futuras, a fim de otimizar os resultados gerados: o estabelecimento de um bom valor de decaimento temporal para as notcias; a definio de uma janela de tempo adequada para a relevncia das notcias; a criao de uma nova equao para o clculo da relevncia do feedback do usurio; e ainda a utilizao do modelo TF-IDF para a representao do interesse do usurio e de documentos. Entende-se, que um sistema recuperador de notcias de utilidade conhecida, haja vista que se encontram inmeros portais de notcias na Internet. Um sistema que alm de recuperar notcias ainda tem a capacidade de recomend-las ao usurio em funo de seus interesses vem agregar Web.

34

Referncias Bibliogrficas

Alag, S. (2009). Collective Intelligence in Action. Manning. Beautiful Soup, 2012. Beautiful Soup: We called him Tortoise because he taught us. Acesso em 24 de 09 de 2012, disponvel em Beautiful Soup: We called him Tortoise because he taught us:

http://www.crummy.com/software/BeautifulSoup/ Cardoso, O. N. P. (2000). Recuperao de Informaao. Infocomp, Revista de Computao da UFLA, v.1, pp. 33-38, Minas Gerais. elikba, Z. What is RSS and how can it serve libraries?, 2004. In First International Conference on Innovations in Learning for the Future: e-Learning, stanbul (Turkey), 26-27 October 2004. Istanbul University. pp. 277-292. Chen, H. (1994). The vocabulary problem in collaboration. IEEE Computer, v.27, n.5. CherryPy, 2012. Cherrypy - A Minimalist Python Web Framework. Acesso em 12 de 11 de 2012, disponvel em http://www.cherrypy.org/: http://www.cherrypy.org/ CherryPy 3.2.0 Documentation. Acesso em 20 de 09 de 2012, disponvel em CherryPy 3.2.0 Documentation: http://docs.cherrypy.org/stable/index.html Feedparser, 2012. Feedparser 5.1.2 : Python Package Index. Acesso em 12 de 11 de 2012, disponvel em http://pypi.python.org/pypi/feedparser/:

http://pypi.python.org/pypi/feedparser/ Fellbaum, C. A. (1998). WordNet: An Electronic Lexical Database. MIT Press. Ferneda, E. (2003). Recuperao de Informao: Anlise sobre a contribuio da Cincia da Computao para a Cincia da Informao. Tese de Doutorado. Huang, A. (2008). Similarity Measures for Text Document Clustering. Computer Science Research Student Conference, NZCSRSC2008, pp. 49-56, New Zealand, Department of Computer Science, The University of Waikato, Hamilton, NewZealand.. Jannach, D., Janker, M., Felfernig, A., & Friedrich, G. (2011). Recommender Systems An Introduction. Cambridge University Press.

35

Koch, R. (2000). O Princpio 80/20: o segredo de se realizar mais com menos. Traduo de Nivaldo Montingelli Jr. Rio de Janeiro: Rocco. Lutz, M. (2006). Programming Python. O'Reilly. Manning, C. D., Raghavan, P., & Schtze, H. (2008). Introduction to Information Retrieval. Cambridge: Cambridge University Press. Marchi, K. R. (2010). Uma Abordagem para Personalizao de Resultados de Busca na Web. Dissertao de Mestrado. PCC/UEM. Marmanis, H., & Babenko, D. (2009). Algorithms of the Intelligent Web. Manning. Meng, W., & Yu, C. (2010). Web Search Technology for Text Documents. In H. Bidgoli, The Handbook of Technology Management (pp. 466-481). New Jersey: Editor-in-Chief. Natural Language Toolkit - NLTK 2.0 documentation. Acesso em 09 de 24 de 2012, disponvel em Natural Language Toolkit - NLTK 2.0 documentation: http://nltk.org/ Owen, S., Anil, R., Dunning, T., & Friedman, E. (2012). Mahout in Action. Manning. Porter, M. F. (1980). An algorithm for suffix stripping, Program: electronic library and information systems, Vol. 40:3, pp.211 - 218. Reverend A, 2012. Python's Reverend Thomas library is a naive Bayes classifier library. Acesso em 24 de 09 de 2012, disponvel em Python's Reverend Thomas library is a naive Bayes classifier library.:

http://news.ycombinator.com/item?id=1363862 Reverend B, 2012. Reverend 0.4: Python Package Index. Acesso em 24 de 09 de 2012, disponvel em Reverend 0.4: Python Package Index:

http://pypi.python.org/pypi/Reverend Rieh, S. Y. (2002). Judgment of information quality and cognitive authority in the Web. In: Journal of the American Society for Information Science and Technology (pp. 145-161). Redwood City. RSS Libraries - PythonInfo Wiki. Acesso em 24 de 09 de 2012, disponvel em RSS Libraries - PythonInfo Wiki: http://wiki.python.org/moin/RssLibraries

36

Segaran, T. (2007). Programming Collective Intelligence. O'Reilly. World Wide Web Size. Acesso em 5 de outubro de 2012, disponvel em http://www.worldwidewebsize.com/

37

Apndice
Nesta seo sero apresentados os websites que foram utilizados para recuperar

notcias e tambm o cdigo fonte do sistema.

7.1 Websites utilizados para recuperar notcias


A seguir, a lista de websites dos quais foram recuperadas notcias ao longo deste trabalho.
http://feeds.nytimes.com/nyt/rss/Science http://feeds.nytimes.com/nyt/rss/PersonalTech http://feeds.nytimes.com/nyt/rss/World http://feeds.nytimes.com/nyt/rss/Space http://feeds.bbci.co.uk/news/world/middle_east/rss.xml http://feeds.nytimes.com/nyt/rss/Research http://feeds.nytimes.com/nyt/rss/MiddleEast http://news.google.com/news/section?pz=1&cf=all&ned=us&topic=tc&ict =ln&output=rss http://www.nytimes.com/services/xml/rss/nyt/GlobalBusiness.xml http://feeds.bbci.co.uk/news/world/europe/rss.xml http://feeds.nytimes.com/nyt/rss/Business http://feeds.nytimes.com/nyt/rss/Americas http://feeds.nytimes.com/nyt/rss/EnergyEnvironment http://feeds.nytimes.com/nyt/rss/Economy http://news.google.com/news/section?pz=1&cf=all&ned=us&topic=m&ict= ln&output=rss http://feeds.nytimes.com/nyt/rss/Technology http://feeds.news.com.au/public/rss/2.0/tech_computers_508.xml http://feeds.bbci.co.uk/news/world/asia/rss.xml http://feeds.news.com.au/public/rss/2.0/ndp_hlth_nlivng_317.xml http://feeds.bbci.co.uk/news/health/rss.xml http://feeds.bbci.co.uk/news/science_and_environment/rss.xml http://feeds.news.com.au/public/rss/2.0/tech_mobiles_507.xml http://feeds.nytimes.com/nyt/rss/Nutrition http://news.google.com/news/section?pz=1&cf=all&ned=us&topic=s&ict= ln&output=rss http://feeds.bbci.co.uk/news/technology/rss.xml

38

http://feeds.bbci.co.uk/news/world/latin_america/rss.xml http://feeds.news.com.au/public/rss/2.0/ndp_sci_nat_347.xml http://feeds.bbci.co.uk/news/business/rss.xml http://feeds.nytimes.com/nyt/rss/Hockey http://feeds.nytimes.com/nyt/rss/Africa http://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml http://feeds.news.com.au/public/rss/2.0/tech_cameras_509.xml http://feeds.news.com.au/public/rss/2.0/tech_gaming_511.xml http://news.google.com/news/section?pz=1&cf=all&ned=us&topic=w&ict= ln&output=rss http://feeds.gawker.com/Lifehacker/full http://feeds.nytimes.com/nyt/rss/Views http://feeds.bbci.co.uk/news/uk/rss.xml http://feeds.nytimes.com/nyt/rss/Environment http://news.google.com/news/section?pz=1&cf=all&ned=us&topic=b&ict= ln&output=rss http://feeds.nytimes.com/nyt/rss/Baseball http://feeds.nytimes.com/nyt/rss/business-computing http://news.yahoo.com/rss/sports http://feeds1.nytimes.com/nyt/rss/Sports http://feeds.nytimes.com/nyt/rss/AsiaPacific http://feeds.nytimes.com/nyt/rss/HealthCarePolicy http://feeds.bbci.co.uk/news/world/africa/rss.xml http://feeds.nytimes.com/nyt/rss/SmallBusiness http://feeds.news.com.au/public/rss/2.0/tech_reviews_812.xml http://feeds.nytimes.com/nyt/rss/companies http://feeds.nytimes.com/nyt/rss/Health http://feeds.news.com.au/public/rss/2.0/tech_homeent_510.xml http://feeds.nytimes.com/nyt/rss/Golf http://feeds.nytimes.com/nyt/rss/Europe http://feeds.nytimes.com/nyt/rss/Soccer http://feeds.feedburner.com/newscomauworldnewsndm

39

7.2 Cdigo Fonte


Nesta seo foi includo o cdigo fonte do sistema recomendador de notcias desenvolvido. O mesmo encontra-se subdividido conforme as classes implementadas, apresentadas na Figura 14. 7.2.1 Main

1 2 3 4 5 6

import cherrypy from includes.Web import *

cherrypy.config.update('conf.cfg') web = Web() cherrypy.quickstart(web)

40

7.2.2 NewsSearch

1 2 3 4 5 6 7 8 9 10

from reverend.thomas import Bayes from includes.Scorer import * import pickle import time

class NewsSearch():

def run(self): #DICIONARIO DE CATEGORIAS E WEBSITES self.news = set(['http://feeds.nytimes.com/nyt/rss/Te

chnology','http://feeds.nytimes.com/nyt/rss/companies', 'http://feeds.nytimes.com/nyt/rss/businesscomputing','http://feeds.nytimes.com/nyt/rss/PersonalTech','http://feeds.bbci .co. uk/news/technology/rss.xml','http://news.google.com/news/section?pz=1 &cf=all&ned=us&topic=tc&ict=ln&output=rss','http://feed s.gawker.com/Lifehacker/full','http://feeds.news.com.au/public/rss/2. 0/tech_cameras_509.xml','http://feeds.news.com.au/publi c/rss/2.0/tech_homeent_510.xml','http://feeds.news.com.au/public/rss/ 2.0/tech_reviews_812.xml','http://feeds.news.com.au/pub lic/rss/2.0/tech_computers_508.xml','http://feeds.news.com.au/public/ rss/2.0/tech_gaming_511.xml','http://feeds.news.com.au/ public/rss/2.0/tech_mobiles_507.xml','http://feeds1.nytimes.com/nyt/r ss/Sports','http://feeds.nytimes.com/nyt/rss/Soccer','h ttp://feeds.nytimes.com/nyt/rss/Golf','http://feeds.nytimes.com/nyt/r ss/Hockey','http://feeds.nytimes.com/nyt/rss/Baseball', 'http://news.google.com/news/section?pz=1&cf=all&ned=us&topic=s&ict=l n&output=rss','http://news.yahoo.com/rss/sports','http: //feeds.nytimes.com/nyt/rss/World','http://feeds.nytimes.com/nyt/rss/ Africa','http://feeds.nytimes.com/nyt/rss/Americas','ht tp://feeds.nytimes.com/nyt/rss/AsiaPacific','http://feeds.nytimes.com /nyt/rss/Europe','http://feeds.nytimes.com/nyt/rss/Midd leEast','http://feeds.bbci.co.uk/news/uk/rss.xml','http://feeds.bbci. co.uk/news/world/africa/rss.xml','http://feeds.bbci.co. uk/news/world/asia/rss.xml','http://feeds.bbci.co.uk/news/world/europ

41

e/rss.xml','http://feeds.bbci.co.uk/news/world/latin_am erica/rss.xml','http://feeds.bbci.co.uk/news/world/middle_east/rss.xm l','http://feeds.bbci.co.uk/news/world/us_and_canada/rs s.xml','http://news.google.com/news/section?pz=1&cf=all&ned=us&topic= w&ict=ln&output=rss','http://feeds.feedburner.com/newsc omauworldnewsndm','http://feeds.nytimes.com/nyt/rss/Science','http:// feeds.nytimes.com/nyt/rss/Space','http://feeds.nytimes. com/nyt/rss/Environment','http://feeds.bbci.co.uk/news/science_and_en vironment/rss.xml','http://feeds.news.com.au/public/rss /2.0/ndp_sci_nat_347.xml','http://feeds.nytimes.com/nyt/rss/Business' ,'http://feeds.nytimes.com/nyt/rss/EnergyEnvironment',' http://www.nytimes.com/services/xml/rss/nyt/GlobalBusiness.xml','http ://feeds.nytimes.com/nyt/rss/SmallBusiness','http://fee ds.nytimes.com/nyt/rss/Economy','http://feeds.bbci.co.uk/news/busines s/rss.xml','http://news.google.com/news/section?pz=1&cf =all&ned=us&topic=b&ict=ln&output=rss','http://feeds.nytimes.com/nyt/ rss/Health','http://feeds.nytimes.com/nyt/rss/Research' ,'http://feeds.nytimes.com/nyt/rss/Nutrition','http://feeds.nytimes.c om/nyt/rss/HealthCarePolicy','http://feeds.nytimes.com/ nyt/rss/Views','http://feeds.bbci.co.uk/news/health/rss.xml','http:// news.google.com/news/section?pz=1&cf=all&ned=us&topic=m &ict=ln&output=rss','http://feeds.news.com.au/public/rss/2.0/ndp_hlth _nlivng_317.xml']) 11 12 13 14 15 16 #PERCORRE AS NEWS DOS WEBSITES E CASO A NOTICIA SEJA #CARREGA O SCORER self.scorer = Score() self.scorer.load()

NOVA, ADICIONA AO CONJUNTO DE NEWS DO SISTEMA 17 18 19 20 21 22 23 24 #PONTUA AS NEWS PARA CADA CATEGORIA self.scorer.scoreNews() #REMOVE NEWS ANTIGAS self.scorer.cleanNews() self.scorer.searchNews(self.news)

42

25 26 27 28 29 30 31 32

#ORDENA AS NEWS POR ORDEM DE RELEVANCIA self.scorer.sortScore()

#CRIA ARQUIVO PARA CADA CATEGORIA DE NEWS self.scorer.commit()

#CRIA ARQUIVO DE NEWS self.scorer.save()

43

7.2.3 ClassifierTrainer

1 2 3 4 5 6 7 8 9 10

from reverend.thomas import Bayes from BeautifulSoup import BeautifulSoup as bs from includes.PreProcessing import * import feedparser import nltk import urllib2

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler): def http_error_302(self, req, fp, code, msg, headers): return urllib2.HTTPRedirectHandler.http_error_302(self, req,

fp, code, msg, headers) 11 12 http_error_301 = http_error_303 = http_error_307 = http_error_302

13 14 15 cookieprocessor = urllib2.HTTPCookieProcessor() opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor)

16 17 18 19 20 21 22 23 24 25 26 27 28

urllib2.install_opener(opener)

class ClassifierTrainer():

def __init__ (self,dicNews=None,guesser=None):

#CARREGA O CLASSIFICADOR NAIVE BAYES self.guesser = Bayes() self.guesser.load()

#CRIA DICIONRIO DE NOTCIAS POR CATEGORIAS self.dicNews = {} self.dicNews['technology'] = ['http://rss.cnn.com/rss/edition

_technology.rss','http://feeds.nytimes.com/nyt/rss/Technolo gy','http://feeds.nytimes.com/nyt/rss/companies','http://feeds.nytime s.com/nyt/rss/business-computing','http://feeds.nytimes .com/nyt/rss/PersonalTech','http://feeds.bbci.co.uk/news/technology/r

44

ss.xml','http://news.google.com/news/section?pz=1&cf=al l&ned=us&topic=tc&ict=ln&output=rss','http://feeds.gawker.com/Lifehac ker/full','http://feeds.news.com.au/public/rss/2.0/tech _cameras_509.xml','http://feeds.news.com.au/public/rss/2.0/tech_homee nt_510.xml','http://feeds.news.com.au/public/rss/2.0/te ch_reviews_812.xml','http://feeds.news.com.au/public/rss/2.0/tech_com puters_508.xml','http://feeds.news.com.au/public/rss/2. 0/tech_gaming_511.xml','http://feeds.news.com.au/public/rss/2.0/tech_ mobiles_507.xml'] 29 self.dicNews['sports'] = ['http://feeds1.nytimes.com/nyt/rss/

Sports','http://rss.cnn.com/rss/edition_sport.rss','http:// feeds.nytimes.com/nyt/rss/Soccer','http://feeds.nytimes.com/nyt/rss/G olf','http://feeds.nytimes.com/nyt/rss/Hockey','http:// feeds.nytimes.com/nyt/rss/Baseball','http://rss.cnn.com/rss/edition_f ootball.rss','http://rss.cnn.com/rss/edition_golf.rss', 'http://rss.cnn.com/rss/edition_motorsport.rss','http://rss.cnn.com/r ss/edition_tennis.rss','http://news.google.com/news/sec tion?pz=1&cf=all&ned=us&topic=s&ict=ln&output=rss','http://news.yahoo .com/rss/sports'] 30 self.dicNews['world'] = ['http://rss.cnn.com/rss/edition_worl

d.rss','http://feeds.nytimes.com/nyt/rss/World','http://fee ds.nytimes.com/nyt/rss/Africa','http://feeds.nytimes.com/nyt/rss/Amer icas','http://feeds.nytimes.com/nyt/rss/AsiaPacific','h ttp://feeds.nytimes.com/nyt/rss/Europe','http://feeds.nytimes.com/nyt /rss/MiddleEast','http://rss.cnn.com/rss/edition_africa .rss','http://rss.cnn.com/rss/edition_americas.rss','http://rss.cnn.c om/rss/edition_asia.rss','http://rss.cnn.com/rss/editio n_europe.rss','http://rss.cnn.com/rss/edition_meast.rss','http://rss. cnn.com/rss/edition_us.rss','http://feeds.bbci.co.uk/ne ws/uk/rss.xml','http://feeds.bbci.co.uk/news/world/africa/rss.xml','h ttp://feeds.bbci.co.uk/news/world/asia/rss.xml','http:/ /feeds.bbci.co.uk/news/world/europe/rss.xml','http://feeds.bbci.co.uk /news/world/latin_america/rss.xml','http://feeds.bbci.c o.uk/news/world/middle_east/rss.xml','http://feeds.bbci.co.uk/news/wo rld/us_and_canada/rss.xml','http://news.google.com/news /section?pz=1&cf=all&ned=us&topic=w&ict=ln&output=rss','http://feeds. feedburner.com/newscomauworldnewsndm'] 31 self.dicNews['science'] = ['http://rss.cnn.com/rss/edition_sp

45

ace.rss','http://feeds.nytimes.com/nyt/rss/Science','http:/ /feeds.nytimes.com/nyt/rss/Space','http://feeds.nytimes.com/nyt/rss/E nvironment','http://feeds.bbci.co.uk/news/science_and_e nvironment/rss.xml','http://feeds.news.com.au/public/rss/2.0/ndp_sci_ nat_347.xml'] 32 self.dicNews['business'] = ['http://feeds.nytimes.com/nyt/rss

/Business','http://feeds.nytimes.com/nyt/rss/EnergyEnvironm ent','http://www.nytimes.com/services/xml/rss/nyt/GlobalBusiness.xml' ,'http://feeds.nytimes.com/nyt/rss/SmallBusiness','http ://feeds.nytimes.com/nyt/rss/Economy','http://rss.cnn.com/rss/edition _business.rss','http://feeds.bbci.co.uk/news/business/r ss.xml','http://news.google.com/news/section?pz=1&cf=all&ned=us&topic =b&ict=ln&output=rss'] 33 self.dicNews['health'] = ['http://feeds.nytimes.com/nyt/rss/H

ealth','http://feeds.nytimes.com/nyt/rss/Research','http:// feeds.nytimes.com/nyt/rss/Nutrition','http://feeds.nytimes.com/nyt/rs s/HealthCarePolicy','http://feeds.nytimes.com/nyt/rss/V iews','http://feeds.bbci.co.uk/news/health/rss.xml','http://news.goog le.com/news/section?pz=1&cf=all&ned=us&topic=m&ict=ln&o utput=rss','http://feeds.news.com.au/public/rss/2.0/ndp_hlth_nlivng_3 17.xml'] 34 35 36 37 38 39 40 41 42 43 44 45 46 47 -8') 48 49 try: self.page = bs(urllib2.urlopen(self.item['lin #TREINA O CLASSIFICADOR for self.key,self.values in self.dicNews.items(): for self.url in self.values: self.feed = feedparser.parse(self.url) self.items = self.feed['items'] for self.item in self.items: print self.item['link'] self.item['link'] = self.item['link'].encode('utf def run(self): #CARREGA O PR-PROCESSADOR self.preProcessor = PreProcessing()

46

k']).read()) 50 self.preProcessor.extract(nltk.clean_html(" "

.join([str(self.x) for self.x in self.page.findAll("bod y")]))) 51 52 except: self.preProcessor.extract(bs(self.item['descr

iption']).getText().encode('utf-8')) 53 54 55 56 57 58 59 self.guesser.save() self.text = '' self.tuples = self.preProcessor.getTuples() for self.tuple in self.tuples: self.text += self.tuple[0] + ' ' self.guesser.train(self.key,self.text)

47

7.2.4 PreProcessing

1 2 3 4 5 6 7 8 9

# -*- coding: utf-8 -* class PreProcessing():

def __init__ (self):

self.__tuples = None

def filter(self,tokensList): '''Filtra o texto: Eliminao de stop words e aplicao de st

emming''' 10 11 12 13 14 15 16 17 18 return [self.wnl.lemmatize(self.tk.lower()) for self.tk in to self.filterList = nltk.corpus.stopwords.words('english') self.wnl = nltk.WordNetLemmatizer() self.minLenght = 2 self.ASC2=["lt","gt","amp","quot"] import re import nltk

kensList if self.tk.lower() not in self.filterList and len(self.tk) > self.minLenght and self.tk not in self.ASC2 and not se lf.tk.isdigit() and not re.match(r"&(\#?\w+);",self.tk) ] 19 20 21 ermo-frequncia''' 22 23 24 25 26 27 28 29 ## normaliza tokens do corpo self.bodyTokens = self.filter(self.bodyRawTokens) # Tokeniza corpo e titulo self.bodyRawTokens = nltk.word_tokenize(bodyRaw) import nltk def extract(self,bodyRaw): '''Extrai um texto html e retorna um conjunto de tuplas t

48

30 31 Tokens) 32 33 34 35 36

# Pontua Tokens por frequencia self.bodyTokensDist = nltk.probability.FreqDist(self.body

self.__tuples = self.bodyTokensDist.items()

def getTuples(self,valor=100): return self.__tuples[:len(self.__tuples)*valor//100]

49

7.2.5 Scorer

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

from datetime import datetime from PreProcessing import PreProcessing from News import News from reverend.thomas import Bayes import urllib2, httplib import feedparser from BeautifulSoup import BeautifulSoup as bs import nltk

httplib.HTTPConnection.debuglevel = 1 opener = urllib2.build_opener()

class Score():

def __init__ (self): self.news = [] self.score = None self.result = None

def load(self,base="base_news"): import pickle try: self.news = pickle.load(open(base,"r")) except: self.news = []

def save(self,base="base_news"): import pickle pickle.dump(self.news,open(base,'w'))

def commit(self,base="preprocessed"): import pickle pickle.dump(self.result,open(base,'w'))

def sortNews(self,valor):

50

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

valor2 = valor[:] news2 = self.news[:] for i in range(len(valor2)-1, 0, -1): for j in range(i): if valor2[j] < valor2[j+1]: valor2[j],valor2[j+1] = valor2[j+1],valor2[j] news2[j],news2[j+1] = news2[j+1],news2[j] return news2

def searchNews(self,news): PreProcessor = PreProcessing() time = datetime.now() for url in news: feed = feedparser.parse(url) items = feed['items'] for item in items: print item['link'] item['link'] = item['link'].encode('utf-8') try: page = bs(opener.open(item['link']).read()) PreProcessor.extract(nltk.clean_html(" ".join([st

r(x) for x in page.findAll("body")]))) 57 58 ext().encode('utf-8')) 59 60 61 62 63 64 65 66 67 68 69 text = PreProcessor.getTuples() novo = News() tuples = {} for key,value in text: tuples[key] = value novo.setTitle(item['title']) novo.setDescription(item['description']) novo.setLink(item['link']) novo.setDate(item['published_parsed']) novo.setTokens(tuples) if novo not in self.news and novo.getTitle() not in [ except: PreProcessor.extract(bs(item['description']).getT

i.getTitle() for i in self.news]: 70 self.news.append(novo)

51

71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 def scoreNews(self): time = datetime.now() guesser = Bayes() guesser.load() self.score = [[],[],[],[],[],[]] for i in self.news: string = '' for j in i.getTokens().keys(): string += j + ' ' nota = guesser.guess(string) ano = abs(time.year - i.getDate().tm_year)*365 mes = abs(time.month - i.getDate().tm_mon)*30 dia = abs(time.day - i.getDate().tm_mday) result = ano+mes+dia for j in nota: j = list(j) j[1] = j[1] - (j[1]*result*15/100) if j[0] == 'world': world = j[1] elif j[0] == 'sports': sports = j[1] elif j[0] == 'technology': technology = j[1] elif j[0] == 'science': science = j[1] def cleanNews(self): time = datetime.now() blacklist = [] for i in self.news: ano = abs(time.year - i.getDate().tm_year)*365 mes = abs(time.month - i.getDate().tm_mon)*30 dia = abs(time.day - i.getDate().tm_mday) if ano+mes+dia > 7: blacklist+=[i] for i in blacklist: self.news.remove(i)

52

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

elif j[0] == 'business': business = j[1] elif j[0] == 'health': health = j[1] self.score[0].append(world) self.score[1].append(sports) self.score[2].append(technology) self.score[3].append(science) self.score[4].append(business) self.score[5].append(health)

def sortScore(self): self.result = {} self.result['world'] = self.sortNews(self.score[0]) self.result['sports'] = self.sortNews(self.score[1]) self.result['technology'] = self.sortNews(self.score[2]) self.result['science'] = self.sortNews(self.score[3]) self.result['business'] = self.sortNews(self.score[4]) self.result['health'] = self.sortNews(self.score[5])

53

7.2.6 User
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 from reverend.thomas import Bayes from datetime import datetime from math import sqrt class User(): def __init__(self,login=None,password=None): self.login = login self.password = password self.tokens = dict() self.like = [] self.dislike = [] self.preprocessed = [] def setTokens(self,tokens): for key,value in tokens.items(): if key in self.tokens.keys(): self.tokens[key] += value else: self.tokens[key] = value if self.tokens[key] == 0: self.tokens.pop(key) def removeTokens(self,tokens): for key,value in tokens.items(): if key in self.tokens.keys(): self.tokens[key] -= value else: self.tokens[key] = 0 - value if self.tokens[key] == 0: self.tokens.pop(key) def setLike(self,link): self.like.append(link)

def setDislike(self,link): self.dislike.append(link) def treatLike(self,tokens,link): if link in self.dislike: self.dislike.remove(link) else: if link not in self.like: self.setLike(link) self.setTokens(tokens)

54

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 s)

def treatDislike(self,tokens,link): if link in self.like: self.like.remove(link) else: if link not in self.dislike: self.setDislike(link) self.removeTokens(tokens) def scalar(self,collection): total = 0 for coin, count in collection.items(): total += count * count return sqrt(total) def similarity(self,A,B): # A and B are coin collections total = 0 for kind in A: # kind of coin if kind in B: total += A[kind] * B[kind] try: result = float(total) / (self.scalar(A) * self.scalar(B)) except: result = 0 return result def cosineDistance(self,news): try: if len(self.like) == 0 and len(self.dislike) == 0: self.preprocessed = [] else: time = datetime.now() similarity = [] news2 = news[:] for i in range(len(news2)): nota = self.similarity(self.tokens,news2[i].token

83 ano = abs(time.year news2[i].date_parsed.tm_year)*365 84 mes = abs(time.month news2[i].date_parsed.tm_mon)*30 85 dia = abs(time.day news2[i].date_parsed.tm_mday) 86 result = ano+mes+dia 87 nota = nota - (nota*result*15/100) 88 if news2[i].link in self.like or news2[i].link in self.dislike: 89 nota = -999 90 similarity.append(nota)

55

91 92 93 94 y[j+1],similarity[j] 95 96 97 98

for i in range(len(similarity)-1, 0, -1): for j in range(i): if similarity[j] < similarity[j+1]: similarity[j],similarity[j+1] = similarit news2[j],news2[j+1] = news2[j+1],news2[j]

self.preprocessed = news2 except: self.preprocessed = []

56

7.2.7 News

1 2 3 4 5 6 7

class News(): def __init__(self): self.title = None self.description = None self.date_parsed = None self.link = None self.tokens = None

57

7.2.8 Web

1 2 3 4 5 6 7 8 9 10 11 12 13 14

# -*- coding: utf-8 -*import os.path import time import cherrypy import pickle from cherrypy.lib.static import serve_file from includes.User import * import ast #converter string para dict

class Web():

def account(self): user = cherrypy.session.get('user') webText = ['<html><head><title>TCC Nathan</title><sty

le>body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,for m,fieldset,input,textarea,p,blockquote,th,td {margin:0;padding:0;}tab le {border-collapse:collapse;border-spacing:0;}fieldset ,img {border:0;}address,caption,cite,code,dfn,em,strong,th,var {fontstyle:normal;font-weight:normal;}ol,ul {list-style:none ;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6 {fontsize:100%;font-weight:normal;}q:before,q:after {content:'';}abbr,acro nym {border:0;}.clearfix:after { content: ".";display: block;c

lear: both;visibility: hidden;line-height: 20px;height: 0;}.clearfix {display: inlineblock;}html[xmlns] .clearfix {display: block;fontfamily: Verdana, Arial, Helvetica, sans-ser if;}* html .clearfix {height: 1%;}#limit{width:1000px;margin:0 auto;d isplay:block;}#news{width:1000px;margin:0 auto;display: block;border:1px solid gray;border-radius:1em;}#footer{textalign:center;padding:50px 0 0 0;}#title{text-align:center;displa y:block;font:bold 60px Helvetica, Arial, sansserif;margin: 0 0 20px 0;}#listaTitulo{textalign:center;display:block;font:bo ld 30px Helvetica, Arial, sansserif;margin: 0 0 20px 0;}.item{width:800px;margin: 0 auto;borderbottom:solid 1px #EFEFEF;}.

58

item a{marginbottom: 10px;display: block;}.item form input{position:relative;left:800px;pa dding:5px;margin:3px;}#botao{posi tion:relative;left:800px;width:200px;top:-70px;}form input{fontsize:15px;}#botao input{font-size:15px;}#gsii{position:relat ive;}#header{height:200px;}#flagLink{position:absolute;width:50px;hei ght:50px;top:100px}#flagImg{position:absolute;width:50p x;height:50px;}.bloco{border:1px solid gray;margin:10px;padding:10px; border-radius:1em; }</style></head><body><div id="limit "><div id="header"><a id="flagLink" href="/"><img id="flagImg"src="ht tp://www.veryicon.com/icon/png/System/Fresh%20Addon/Arr ow%20left.png" alt="arrow"/></a><img id="gsii" src="http://din.uem.br /gsii/logo.gif" alt="gsii"/><div id="botao"><label>Welc ome '+cherrypy.session.get('user').login+'</label><br/><button onclic k="javascript:location.href = \'logout\'">Log out</butt on><button onclick="javascript:location.href = \'account\'">Account</ button></div></div>'] 15 16 o">Likes</label>'] 17 18 '+i+'</a></div>'] 19 20 21 if len(user.like) == 0: webText += ['You dont have likes yet!'] webText += ['</div><div class="bloco"><label id="list for i in user.like: webText += ['<div class="item"><a href='+i+'> webText += ['<label id="title">Account</label>'] webText += ['<div class="bloco"><label id="listaTitul

aTitulo">Dislikes</label>'] 22 23 '+i+'</a></div>'] 24 25 26 27 28 29 30 31 def dislike(self,link=None,tokens=None,page=None): news = cherrypy.session.get('news') user = cherrypy.session.get('user') if len(user.dislike) == 0: webText += ['You dont have likes yet!'] webText += ['</div>'] return webText for i in user.dislike: webText += ['<div class="item"><a href='+i+'>

59

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 y.go(-1);</script>" 54 55 56

user.treatDislike(ast.literal_eval(tokens),link) user.cosineDistance(news) file = open("users/"+user.login,'w') pickle.dump(user,file) file.close() cherrypy.session['user'] = user return "<script>location.href = '"+page+"'</script>"

def like(self,link=None,tokens=None,page=None): news = cherrypy.session.get('news') user = cherrypy.session.get('user') user.treatLike(ast.literal_eval(tokens),link) user.cosineDistance(news) file = open("users/"+user.login,'w') pickle.dump(user,file) file.close() cherrypy.session['user'] = user return "<script>location.href = '"+page+"'</script>"

def signin(self,login=None,senha=None): if login == None or senha == None: return "<script>alert('Invalid Data!');histor

try: user = pickle.load('users/'+login,'r') return "<script>alert('This user already exis

ts!');history.go(-1);</script>" 57 58 59 60 61 62 except: user = User(login,senha) file = open('users/'+login,'w') pickle.dump(user,file) file.close() cherrypy.session['user'] = user

63

return "<script>alert('Congratulations! You a

re now registered!');location.href = '/';</script>" 64 65 def signinForm(self):

60

66

webText = ["<html><head><meta http-equiv='Content-

Type' content='text/html; charset=utf-8'/><style>body,div, dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea, p,blockquote,th,td {margin:0;padding:0;}table {border-c ollapse:collapse;borderspacing:0;}fieldset,img {border:0;}address,caption,cite,code,dfn,em,strong,th ,var {font-style:normal ;font-weight:normal;}ol,ul {list-style:none;}caption,th {textalign:left;}h1,h2,h3,h4,h5,h6 {font-size:100%;font-weight:norm al;}q:before,q:after {content:'';}abbr,acronym {border:0;}.clearfix:a fter { content: '.';display: block;clear: both;visi bility: hidden;lineheight: 20px;height: 0;}.clearfix {display: inlineblock;}html[xmlns] .clearfix {display: block;font-fam ily: Verdana, Arial, Helvetica, sansserif;}* html .clearfix {height: 1%;}#title{textalign:center;position:relative;font-si ze:60px;border-bottom: 1px solid black;left:250px;}#footer{textalign:center;padding:50px 0 0 0;}#limit{width:1000px;margin: 0 auto;display:block;}#header{height:200px;}#botao button{fontsize:15px;}form{display:block;margin:0 auto;width:470;}#gsii{ position:relative;display:block;}#flagLink{position:absolute;width:50 px;height:50px;top:100px}#flagImg{position:absolute;wid th:50px;height:50px;}</style><title>TCC Nathan</title></head><body><d iv id='limit'><div id='header'><img id='gsii' src='http ://din.uem.br/gsii/logo.gif' alt='gsii'/><a id='flagLink' href='/'><i mg id='flagImg'src='http://www.veryicon.com/icon/png/Sy stem/Fresh%20Addon/Arrow%20left.png' alt='arrow'/></a></div>"] 67 webText += ["<form method='post' id='signinForm' acti

on='signin'>User:<input name='login' type='text'/>Passw ord:<input name='senha' type='password'/> <input type='submit' value= 'Sign in'/></form>"] 68 webText += ["<div id='footer'><label>Developed by Nat

han Siegle Hartmann, 2012</label></div></body></html>"]

69 70 71

return webText

def login(self,login=None,senha=None,page=None):

61

72 73 74 75 76 77 78 79 80 81 82 83 ge+"'</script>" 84 85

try: user = pickle.load(open('users/'+login,'r')) if user.password == senha: cherrypy.session['user'] = user news = cherrypy.session.get('news') user = cherrypy.session.get('user') user.cosineDistance(news) file = open("users/"+user.login,'w') pickle.dump(user,file) file.close() cherrypy.session['user'] = user return "<script>location.href = '"+pa

else: return "<script>alert('Invalid passwo

rd!');history.go(-1);</script>" 86 87 istory.go(-1);</script>" 88 89 90 91 92 93 94 def result(self,category=None): webText = ['<html><head><title>TCC Nathan</title><sty def logout(self): cherrypy.session['user'] = None return '<script>location.href = "/"</script>' except: return "<script>alert('User doesnt exist!');h

le>body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,for m,fieldset,input,textarea,p,blockquote,th,td {margin:0;padding:0;}tab le {border-collapse:collapse;border-spacing:0;}fieldset ,img {border:0;}address,caption,cite,code,dfn,em,strong,th,var {fontstyle:normal;font-weight:normal;}ol,ul {list-style:none ;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6 {fontsize:100%;font-weight:normal;}q:before,q:after {content:'';}abbr,acro nym {border:0;}.clearfix:after { content: ".";display: block;c

lear: both;visibility: hidden;line-height: 20px;height: 0;}.clearfix {display: inlineblock;}html[xmlns] .clearfix {display: block;fontfamily: Verdana, Arial, Helvetica, sans-ser

62

if;}* html .clearfix {height: 1%;}#limit{width:1000px;margin:0 auto;d isplay:block;}#news{width:1000px;margin:0 auto;display: block;border:1px solid gray;border-radius:1em;}#footer{textalign:center;padding:50px 0 0 0;}#title{text-align:center;displa y:block;font:bold 60px Helvetica, Arial, sansserif;margin: 0 0 20px 0;}.item{width:800px;padding:10px 30px;borderbottom:so lid 1px #EFEFEF;}.item .date{color:gray;display:block;padding:0 5px 5 px 5px;}.item .title{font-size:24px}.item .description{ display: block; width:500px;padding:5px 20px;}.item form input{positi on:relative;left:800px;padding:5px;margin:3px;}#botao{p osition:relative;left:800px;width:200px;top:-70px;}form input{fontsize:15px;}#botao input{font-size:15px;}#gsii{position:re lative;}#header{height:200px;}#flagLink{position:absolute;width:50px; height:50px;top:100px}#flagImg{position:absolute;width: 50px;height:50px;}</style></head><body><div id="limit"><div id="heade r"><a id="flagLink" href="/"><img id="flagImg"src="http ://www.veryicon.com/icon/png/System/Fresh%20Addon/Arrow%20left.png" a lt="arrow"/></a><img id="gsii" src="http://din.uem.br/g sii/logo.gif" alt="gsii"/>'] 95 96 if cherrypy.session.get('user') == None: webText+=['<div id="botao"><form method="post

" id="login" action="login"><input name="page" type="hi dden" value="result?category='+category+'"/>User:<input name="login" type="text"/>Password:<input name="senha" type="passwor d"/><input type="submit" value="Log in"/></form><button onclick = "ja vascript:location.href = \'signinForm\';">Sign in</butt on></div>'] 97 98 else: webText+=['<div id="botao"><label>Welcome '+c

herrypy.session.get('user').login+'</label><br/><button onclick="javascript:location.href = \'logout\'">Log out</button><but ton onclick="javascript:location.href = \'account\'">Ac count</button></div>'] 99 100 ed 101 else: if category == 'user': dic = cherrypy.session.get('user').preprocess

63

102 tegory] 103

dic = cherrypy.session.get('preprocessed')[ca

webText+=['</div><label id="title">'+category.capital

ize()+'</label><div id="news">'] 104 105 106 107 try: for i in range(10): webText+=['<div class="item">'] webText+=['<label class="title"><a hr

ef="'+dic[i].link+'">'+dic[i].title.encode('utf-8')+'</ a></label>'] 108 webText+=['<label class="date">'+str(

dic[i].date_parsed.tm_mon)+','+str(dic[i].date_parsed.t m_mday)+','+str(dic[i].date_parsed.tm_year)+'</label>'] 109 ne: 110 webText+=['<form name="like" if cherrypy.session.get('user') != No

method="post" action="like"><input name="page" type="hi dden" value="result?category='+category+'"/><input name="tokens" type ="hidden" value="'+str(dic[i].tokens)+'"/><input name=" link" type="hidden" value="'+dic[i].link+'"/><input type="submit" '] 111 ssion.get('user').like: 112 ackground: #b4e391;"'] 113 form>'] 114 webText+=['<form name="dislik webText += ['value="Like"/></ webText += ['style="b if dic[i].link in cherrypy.se

e" method="post" action="dislike"><input name="page" ty pe="hidden" value="result?category='+category+'"/><input name="tokens " type="hidden" value="'+str(dic[i].tokens)+'"/><input name="link" type="hidden" value="'+dic[i].link+'"/><input type="submi t"'] 115 ssion.get('user').dislike: 116 ackground: #ff3019;"'] 117 ></form>'] webText += ['value="Dislike"/ webText += ['style="b if dic[i].link in cherrypy.se

64

118

webText+=['<label class="description"

>'+dic[i].description.encode('utf-8')+'</label>'] 119 120 121 essed!'] 122 webText+=["</div></div><div id='footer'><label>Develo except: webText+=['You dont have a model already proc webText+=['</div>']

ped by Nathan Siegle Hartmann, 2012</label></div></body ></html>"] 123 124 125 126 127 128 129 130 131 132 133 134 135 136 t>' 137 webText = ["<html><head><meta http-equiv='Contentdef index(self): if cherrypy.session.get('preprocessed') == None: return '<script>location.href = "loading"</scrip def loading(self): file = open('preprocessed','r') preprocessed = pickle.load(file) cherrypy.session['preprocessed'] = preprocessed file = open('base_news','r') news = pickle.load(file) cherrypy.session['news'] = news return '<script>location.href = "/"</script>' return webText

Type' content='text/html; charset=utf-8'/><style>body,div, dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea, p,blockquote,th,td {margin:0;padding:0;}table {border-c ollapse:collapse;borderspacing:0;}fieldset,img {border:0;}address,caption,cite,code,dfn,em,strong,th ,var {font-style:normal ;font-weight:normal;}ol,ul {list-style:none;}caption,th {textalign:left;}h1,h2,h3,h4,h5,h6 {font-size:100%;font-weight:norm al;}q:before,q:after {content:'';}abbr,acronym {border:0;}.clearfix:a fter { content: '.';display: block;clear: both;visi bility: hidden;lineheight: 20px;height: 0;}.clearfix {display: inlineblock;}html[xmlns] .clearfix {display: block;font-fam

65

ily: Verdana, Arial, Helvetica, sansserif;}* html .clearfix {height: 1%;}#title{textalign:center;position:relative;font-si ze:60px;border-bottom: 1px solid black;left:250px;}#footer{textalign:center;padding:50px 0 0 0;}#limit{width:1000px;margin: 0 auto;display:block;}#botao{position:relative;left:800px;width:200px ;top:-70px;}#header{height:200px;}#botao input{font-siz e:15px;}#options{display:block;margin:0 auto;width:520;}#gsii{positio n:relative;}</style><title>TCC Nathan</title></head><bo dy><div id='limit'><div id='header'><img id='gsii' src='http://din.ue m.br/gsii/logo.gif' alt='gsii'/>"] 138 139 if cherrypy.session.get('user') == None: webText+=['<div id="botao"><form method="post

" id="login" action="login"><input name="page" type="hi dden" value="index"/>User:<input name="login" type="text"/>Password:< input name="senha" type="password"/><input type="submit " value="Log in"/></form><button onclick = "javascript:location.href = \'signinForm\';">Sign in</button></div>'] 140 141 else: webText+=['<div id="botao"><label>Welcome '+c

herrypy.session.get('user').login+'</label><br/><button onclick="javascript:location.href = \'logout\'">Log out</button><but ton onclick="javascript:location.href = \'account\'">Ac count</button></div>'] 142 webText += ["</div><label id='title'>News Search Engi

ne</label><div id='options'><button onclick=\"javascrip t:location.href = 'result?category=world'\";>World</button><button on click=\"javascript:location.href = 'result?category=spo rts'\";>Sports</button><button onclick=\"javascript:location.href = ' result?category=technology'\";>Technology</button><butt on onclick=\"javascript:location.href = 'result?category=science'\";> Science</button><button onclick=\"javascript:location.h ref = 'result?category=health'\";>Health</button><button onclick=\"ja vascript:location.href = 'result?category=business'\";> Business</button>"] 143 144 if cherrypy.session.get('user') == None: webText += ["<button disabled onclick=\"javas

cript:location.href = 'result?category="+str(cherrypy.s

66

ession.get('user'))+"'\";>Personal</button>"] 145 146 else: webText += ["<button onclick=\"javascript:loc

ation.href = 'result?category=user'\";>Personal</button >"] 147 webText += ["</div><div id='footer'><label>Developed

by Nathan Siegle Hartmann, 2012</label></div></body></h tml>"] 148 149 150 151 152 153 154 155 156 157 158 159 index.exposed = True loading.exposed = True result.exposed = True signinForm.exposed = True signin.exposed = True login.exposed = True logout.exposed = True like.exposed = True dislike.exposed = True account.exposed = True return webText

67

Universidade Estadual de Maring Departamento de Informtica Av. Colombo 5790, Maring-PR, CEP 87020-900 Tel: (44) 3011-4324 Fax: (44) 3263-5874 www.din.uem.br 68