Comparação dos algoritmos sequencial e paralelo para contagem de palavras e contexto Eduardo Delazeri Ferreira, Francieli Zanon Boito, Aline Villavicencio 1. Introdução 1 Instituto de Informática - Universidade Federal do Rio Grande do Sul Porto Alegre, Brasil -{edferreira, fzboito, avillavicencio}@inf.ufrgs.br A criação de tesauros distribucionais [Lin 1998, Baroni and Lenci 2010] é de fundamental importância para uma série de aplicações de Processamento de Linguagem Natural (PLN). No entanto, existe uma grande dificuldade na obtenção desses tesauros: para que o tesauro tenha uma boa qualidade, é necessário um volume muito grande de dados, resultando em uma grande demora para que esses dados sejam processados. Assim, este trabalho propõe uma paralelização desse processamento. A paralelização tem como objetivo apenas a redução do tempo de execução, devendo produzir o mesmo resultado obtido pelo processamento sequencial. Este artigo faz uma comparação entre a versão paralela e sequencial da parte de contagem de palavras e contextos na criação de tesauros distribucionais. A comparação foi feita com base nos tempos de duas implementações: uma sequencial, do pacote de construção de tesauros distribucionais Minimantics [Padró et al. 2014] 1, e outra paralela, desenvolvida para este trabalho com Spark 2, que realiza operações em paralelo utilizando um cluster de computadores. O restante deste artigo está organizado da seguinte forma: a próxima Seção apresenta trabalhos relacionados, a Seção 3 apresenta a abordagem que foi utilizada na paralelização do algoritmo, a Seção 4 apresenta os resultados obtidos, e a Seção 5 apresenta as conclusões e os trabalhos futuros. 2. Trabalhos Relacionados Um tesauro é uma lista de palavras associadas por uma característica específica, como a similaridade entre elas (sinonímia). Sua construção é, tradicionalmente, manual e resulta em um recurso de alta qualidade, mas de baixa cobertura e de alto custo. Para solucionar esse problema, a criação de tesauros pode ser feita automaticamente, a partir de textos, com base na hipótese distribucional de Harris [Harris 1954], a qual propõe que se pode conhecer uma palavra pela sua companhia. Uma das principais abordagens na criação dos tesauros é o método de contagem [Lin 1998, Baroni and Lenci 2010]. Para criar esses tesauros utilizando o método de contagem, inicialmente são extraídas ocorrências de todas as palavras do texto com as palavras que as acompanham dentro de uma janela de tamanho fixo. Em seguida, é feita a contagem total da coocorrência de cada par de palavras. Com essas contagens, é criada uma matriz que possui o número de vezes que cada palavra ocorreu com cada uma das outras palavras do texto (Tabela 1). 1 https://github.com/ceramisch/minimantics 2 https://spark.apache.org/
Posteriormente, para cada palavra-alvo (linha), é calculada a força de associação entre ela e cada um dos seus contextos (colunas) [Lin 1998, Baroni and Lenci 2010]. A Tabela 1 apresenta um exemplo de matriz de coocorrências. Tabela 1. Frequência de ocorrência de cada palavra chocolate comer bom chocolate 3 2 1 comer 2 4 3 3. Materiais e Métodos A parte paralelizada do algoritmo foi a de contagem de cada palavra com seus contextos. A entrada para a fase de contagem de associações é um arquivo contendo uma série de pares de palavras (alvo e contexto) exemplificados na Tabela 2 e a saída é a contagem de todos os pares no corpus exemplificados na Tabela 3. Tabela 2. Exemplo de entrada Alvo Contexto chocolate comer chocolate delicioso chocolate caro chocolate delicioso Tabela 3. Exemplo de saída Alvo Contexto Contagem chocolate comer 1 chocolate delicioso 2 chocolate caro 1 Esse tipo de processamento se encaixa no paradigma MapReduce[Lämmel 2008] de programação, pois cada parte do texto pode ser considerada separadamente para contagem de pares, e depois todos os resultados obtidos podem ser agrupados. Ou seja, o texto pode ser dividido entre múltiplas tarefas (Map), em que cada tarefa fará a contagem na sua porção de forma independente, e,por fim, as contagens dos mesmos pares podem ser somadas (Reduce). Optou-se pelo uso de Spark por ser uma ferramenta adequada à manipulação de grandes quantidades de dados, oferecendo um ambiente para desenvolvimento em MapReduce. Para a escrita do algoritmo, foi usada a linguagem Scala, suportada pelo ambiente Spark. Foram utilizados dois subconjuntos do corpus UKWaC [Ferraresi et al. 2008]: um com 68KB e outro com 11GB. Os arquivos foram copiados para todos os nós antes da execução do código paralelo. 4. Experimentos e Resultados Para a realização do trabalho, foi utilizado o framework Spark 1.3.1 com Scala 2.11.6 no cluster Sagittaire do Grid 5000 3. Foram usados até 40 nós desse cluster, cada um equipado com 2 AMD Opteron 250 2.4GHz, 2GB de memória RAM e um disco rígido de 73GB (SCSI). Os nós estão ligados através de uma rede Gigabit Ethernet. O sistema operacional utilizado foi Linux, com a distribuição Debian 6 ( Squeeze ). Um dos nós atua como mestre, e os demais como escravos. 3 http://www.grid5000.fr/
(a) Tempo (segundos) (b) Speedup Figura 1. Resultados com o corpus de 11GB Os resultados obtidos são apresentados nas Tabelas 4 e 5 para 68KB e 11 GB, respectivamente. Os tempos apresentados são a média aritmética de até 8 execuções. Foram observados ganhos de desempenho apenas para o corpus maior (Tabela 5): de 14000 para 180 segundos, um ganho de 77.57% com 40 nós. Os resultados para esse corpus também estão representados na Figura 1. Tabela 4. Resultados com o corpus de 68KB Sequencial Paralelo (40 nós) Tempo (s) 0,09 45,31 Desvio-Padrão 0,00 0,95 Speedup - 0,002 Eficiência 1 0,00 Tabela 5. Resultados com o corpus de 11GB Sequencial Paralelo (10 nós) Paralelo (20 nós) Paralelo (40 nós) Tempo (s) 14029,8 536,74 289,85 180,87 Desvio-Padrão 0 1,056 1,46 3,3 Speedup - 26,13 48,4 77,56 Eficiência 1 1,3 1,21 0,96 Para o corpus menor (Tabela 4), foi observado um aumento no tempo de execução com a paralelização do algoritmo. Isso acontece devido ao custo do tempo de inicialização do próprio Spark, que é diluído quando o corpus de entrada passa a ser maior. Além disso, de acordo com o tamanho da entrada e as configurações utilizadas, o mestre dispara apenas duas tarefas para processar esse corpus, independente do número de escravos disponíveis (por esse motivo, são apresentados resultados com apenas um número de nós). Comparando os tempos obtidos para as implementações paralela e sequencial, foram calculados speedup e eficiência. Esses valores representam, respectivamente, a melhoria de desempenho obtida pela versão paralela e o quão eficiente é essa melhoria em relação ao número de processadores e núcleos de processamento utilizados. Pode-se observar que a implementação paralela obtém speedup maior do que o número de cores utilizado e eficiência acima de 1 (com 10 e 20 nós). Isso acontece
porque, apesar de implementarem a mesma contagem, a versão sequencial faz a ordenação dos pares antes de gerar o arquivo de saída, enquanto a versão paralela não precisa dessa ordenação por causa da representação dada pelo Spark aos dados. Na versão sequencial, o arquivo de saída dessa fase precisa estar ordenado para processamento pela próxima fase da criação do tesauro. No entanto, na versão paralela os dados podem ser diretamente manipulados pela próxima fase através de novas fases de Map e Reduce. O speedup e a eficiência caem conforme aumenta o número de nós envolvidos na execução. Uma possível explicação para isso é que a proporção entre o número de tarefas geradas e o número de cores disponíveis torna-se subótima para esse ambiente, considerando o custo de manutenção de um grande número de escravos. Nesse caso, maior eficiência seria obtida para 40 nós de processamento com um corpus de entrada maior. 5. Conclusões e Trabalhos Futuros Nesse artigo, apresentamos a paralelização (usando Spark) do algoritmo de geração de contagens de palavras e contextos para a criação de tesauros distribucionais. Foi avaliado o desempenho dessa paralelização em um cluster com até 40 nós. Os resultados obtidos mostram ganhos de desempenho de até 77% para o maior tamanho de entrada. Trabalhos futuros incluem a paralelização e avaliação das outras fases da criação de tesauros (cálculo de associação entre palavras e contextos e cálculo de similaridade entre as palavras). 6. Agradecimentos Os experimentos apresentados neste artigo foram realizados na plataforma experimental Grid 5000, em desenvolvimento pela ação INRIA ALADDIN com apoio de CNRS, RENATER e diversas universidades e órgãos de fomento (ver www.grid5000.fr). Agradecemos a Carlos Ramisch, que disponibilizou o Minimantics, ao grupo de Processamento Paralelo da UFRGS e ao Instituto de Informática da UFRGS pelo apoio à pesquisa. Parte dos resultados apresentados neste trabalho foram obtidos no projeto Simplificação Textual de Expressões Complexas patrocinado pela Samsung Eletrônica da Amazônia Ltda., através da lei 8.248/91, e também contou com apoio do CNPq (113700/2015-6 ). Referências Baroni, M. and Lenci, A. (2010). Distributional memory: A general framework for corpus-based semantics. Computational Linguistics, 36(4):673 721. Ferraresi, A., Zanchetta, E., Baroni, M., and Bernardini, S. (2008). Introducing and evaluating ukwac, a very large web-derived corpus of english. In Proceedings of the 4th Web as Corpus Workshop (WAC-4) Can we beat Google, pages 47 54. Harris, Z. S. (1954). Distributional structure. Word. Lämmel, R. (2008). Google s mapreduce programming model revisited. Science of computer programming, 70(1):1 30. Lin, D. (1998). Automatic retrieval and clustering of similar words. In Proceedings of the 36th Annual Meeting of the Association for Computational Linguistics and 17th
International Conference on Computational Linguistics - Volume 2, ACL 98, pages 768 774. Association for Computational Linguistics. Padró, M., Idiart, M., Villavicencio, A., and Ramisch, C. (2014). Nothing like good old frequency: Studying context filters for distributional thesauri. In Proceedings of the Conference on Empirical Methods in Natural Language Processing (EMNLP 2014) - short papers, Doha, Qatar.