6 Discussion
6.3 Recommendations for improvements
A principal funcionalidade disponibilizada pelo sistema ´e a pesquisa por N-Gramas e a obtenc¸˜ao das suas respectivas ocorrˆencias ao longo do per´ıodo de tempo presente no ficheiro corpus definido. Para tal, foi constru´ıdo um algoritmo MapReduce que vai trans- formar os conte´udos jornal´ısticos presentes no corpus num ficheiro que cont´em as es- tat´ısticas necess´arias para a construc¸˜ao da estrutura de pesquisa.
Map
Para a implementac¸˜ao do algoritmo MapReduce programaticamente usando a linguagem Java v˜ao ser criadas duas classes que representam as duas fases do algoritmo. A classe Map [24, p. 37] contˆem o c´odigo referente `a primeira fase do algoritmo e vai extender a classe Mapper ([17]) que cont´em quatro parˆametros de tipo (type parameters) que repre- sentam as chaves e os valores associados `a func¸˜ao Map, com os dois primeiros parˆametros a corresponderem ao input da func¸˜ao e os dois ´ultimos a corresponderem ao seu output. O primeiro parˆametro (LongWritter) representa os identificadores dos documentos recebi- dos como input da func¸˜ao presentes no HDFS e o segundo parˆametro (Text) corresponde aos conte´udos desses documentos, consistindo no primeiro par key/value do algoritmo MapReduce. O segundo par vai corresponder aos valores interm´edios produzidos pela func¸˜ao Map, em que o terceiro parˆametro da classe (Text) vai representar o agregado do ano e do mˆes da data de cada artigo e o quarto e ´ultimo parˆametro (Text) representa os conte´udos textuais das not´ıcias (t´ıtulo ou conte´udo).
Tendo definido a classe, ´e necess´ario definir a func¸˜ao Map dentro da classe que vai ser respons´avel pelo actual funcionamento da fase de mapeamento. Tendo em conta a forma como a classe est´a definida ao n´ıvel de parˆametros de tipo, os dois primeiros argumentos da func¸˜ao v˜ao ser do tipo LongWritable e Text respectivamente, tendo os seus prop´ositos
Cap´ıtulo 4. Implementac¸˜ao 24
sido discutidos acima. Em relac¸˜ao ao segundo argumento, este consiste em linhas indi- viduais desses ficheiros, e n˜ao todo o seu conte´udo de uma vez. O terceiro argumento ´e do tipo Context e representa o contexto do funcionamento do algoritmo, permitindo a interac¸˜ao com o HDFS e consequentemente a escrita das chaves e dos valores interm´edios desta fase neste.
Para o bom funcionamento do algoritmo, a informac¸˜ao presente no corpus fornecido tem que ter o seguinte formato para cada linha do ficheiro: Categoria \tab Data \tab URL \tab T´ıtulo \tab Conte´udo. Dado este facto, o primeiro passo na func¸˜ao vai consistir numa simples verificac¸˜ao de que o conte´udo fornecido obedece ao formato descrito acima no sentido de terem de existir cinco elementos para cada linha, evitando assim o processa- mento de not´ıcias incompletas. Caso a linha recebida n˜ao falhe a verificac¸˜ao, o campo que cont´em a data vai ser transformado numa vers˜ao simplificada que cont´em apenas o mˆes e o ano que vai ser usada como a chave dos pares interm´edios (e.x.: 2006 08). Ao separar os conte´udos jornal´ısticos desta maneira vai ser poss´ıvel fazer a contagem dos N-Gramas para cada mˆes do per´ıodo de tempo dado e mais dificilmente ocorrem erros de excesso de mem´oria quando se acede aos pares interm´edios na fase de reduc¸˜ao. Tendo transformado a data, o passo seguinte consiste na obtenc¸˜ao dos conte´udos jornal´ısticos a transformar em N-Gramas, o t´ıtulo e o conte´udo da not´ıcia, presentes na linha do docu- mento lida. Ap´os a sua obtenc¸˜ao, v˜ao ser escritos dois pares chave/valor interm´edios no HDFS, as chaves sendo a vers˜ao simplificada da data descrita anteriormente e os valores sendo o t´ıtulo e o conte´udo da not´ıcia.
Em conclus˜ao, a fase de mapeamento serve como uma forma de organizar a informac¸˜ao a processar atrav´es do mˆes e ano associados aos conte´udos jornal´ısticos de forma a facilitar o processo de contagem dos N-Gramas produzidos na fase de reduc¸˜ao.
A implementac¸˜ao da func¸˜ao Map encontra-se em anexo.
Reduce
Ap´os a distribuic¸˜ao categorizada dos dados na fase de mapeamento, vai ser necess´ario transformar a informac¸˜ao em N-Gramas e fazer a respectiva contagem destes na fase de reduc¸˜ao. Semelhante `a implementac¸˜ao da fase de mapeamento, foi criada uma classe denominada Reduce [24, p. 37] que extende a classe Reducer ([18]) e que cont´em a implementac¸˜ao da func¸˜ao reduce. Tal como a classe Mapper, a classe Reducer cont´em quatro tipos gen´ericos em que os dois primeiros representam os tipos das chaves e dos valores interm´edios emitidos na fase de mapeamento e os dois ´ultimos representam os tipos das chaves e dos valores finais produzidos pela fase de reduc¸˜ao. Dado que os dois primeiros tipos s˜ao correspondem aos tipos das chaves e dos valores emitidos pela func¸˜ao map, estes tˆem que ser iguais aos definidos na classe Map definida acima, o que significa que ambos s˜ao do tipo Text. Os dois ´ultimos tipos v˜ao igualmente ser do tipo Text, em que a chave produzida vai corresponder aos N-Gramas produzidos e o valor vai consistir
Cap´ıtulo 4. Implementac¸˜ao 25
na combinac¸˜ao da data simplificada produzida como chave na fase de mapeamento e o n´umero de ocorrˆencias do respectivo N-Grama. Um exemplo do output produzido ´e: Ca- vaco Silva \tab 2006 12 \tab 47.
Tendo definido a classe, ´e necess´ario definir a func¸˜ao Reduce. Tal como na classe Map, os dois primeiros argumentos da func¸˜ao v˜ao corresponder aos dois primeiros tipos gen´ericos da classe, o primeiro sendo do tipo Text e correspondendo `a vers˜ao simplificada da data usada como chave interm´edia. O segundo argumento consiste numa estrutura iter´avel que cont´em os dados jornal´ısticos das not´ıcias que foram emitidos na fase de mapeamento (t´ıtulos e conte´udos). O terceiro argumento ´e do tipo Context e representa o contexto do funcionamento do algoritmo, permitindo a interac¸˜ao com o HDFS e consequentemente a escrita do output do algoritmo MapReduce neste.
Para a realizac¸˜ao da contagem do n´umero de ocorrˆencias vai-se recorrer a uma estrutura HashMap que vai armazenar pares chave/valor, em que a chave consiste no N-Grama e o valor consiste no n´umero de ocorrˆencias deste na data definida. Comec¸ando pela iterac¸˜ao dos conte´udos jornal´ısticos, o tokenizador vai ser aplicado a cada um destes de maneira a criar os N-Gramas, que podem depois ser acedidos atrav´es do iterador do tokenizador. Cada elemento no iterador vai ser sujeito a dois tratamentos, de maneira a evitar a inclus˜ao de N-Gramas que n˜ao sejam v´alidos.
O primeiro tratamento consiste na remoc¸˜ao de N-Gramas que n˜ao fazem sentido lexi- cal, mais concretamente N-Gramas que consistam em sequˆencias de palavras que con- tenham algum tipo de pontuac¸˜ao que indique o final de um per´ıodo (ponto final, ponto de interrogac¸˜ao, ponto de exclamac¸˜ao e ponto-e-v´ırgula) ou a indicac¸˜ao de um pren´uncio (dois pontos). Um exemplo deste tipo de N-Grama seria ”e pronto. No entanto”. Este tipo de N-Grama ´e exclu´ıdo, pois n˜ao faz sentido lexicalmente, o que significa que muito dificilmente ser´a pesquisado por um utilizador e logo n˜ao se justifica a sua inclus˜ao. O segundo tratamento consiste na removec¸˜ao de toda a pontuac¸˜ao presente nos N-Gramas, de maneira a evitar o caso em que h´a N-Gramas que seriam iguais com a excepc¸˜ao de al- guma pontuac¸˜ao, como por exemplo os seguintes N-Gramas: ”no entanto ´e”e ”no entanto, ´e”.
Ap´os o tratamento dos N-Gramas, estes v˜ao ser inseridos na estrutura HashMap de ma- neira a se fazer a contagem das ocorrˆencias destes. Caso o N-Grama j´a esteja presente no HashMap, o valor associado a este ´e incrementado num valor; caso contr´ario, o N-Grama ´e inserido na estrutura com o valor um associado. Finalmente, assim que j´a n˜ao houver mais N-Gramas a acrescentar, obtem-se um iterador com as entradas na estrutura de da- dos que vai ser percorrido de maneira a produzir os resultados finais que v˜ao depois ser usados para a construc¸˜ao das estruras de dados para a pesquisa. Neste ficheiro v˜ao estar os seguintes valores, separados por tabs: N-Grama, data (s´o o ano e o mˆes, ligados com um ) e n´umero de ocorrˆencias.
Cap´ıtulo 4. Implementac¸˜ao 26