4. Clustering
4.4. Clustering de Datos Reales
4.4.1. Limpieza de Datos
Para la prueba de clustering realizada en Mahout y CLUTO se utilizaron mensajes de Twitter enviados los días 23 y 24 de enero de 2011, con un total de 1.791.264 datos. Se eliminaron los que poseían etiqueta de lenguaje nula, además de los lenguajes con caracteres especiales tales como Japonés, Árabe, Ruso, entre otros. Por lo tanto, la cantidad a utilizar finalmente es de 1.064.417 datos.
Se normalizaron las palabras para quitar los acentos y mayúsculas, además de usar “stop- words” para los principales lenguajes como Inglés, Portugués y Español a través de la creación de un script en lenguaje Perl3(www.dropbox.com/s/ksh1k03nul5450u/Normalizar).
Un ejemplo del formato de los datos se presenta en la Tabla 4.1.
Tabla 4.1: Ejemplo de formato de datos
Usuario Mensaje Lenguaje
01_baylee
music videos are being made in 3d you know what's better than artists looking like they're in front of you concerts rip
music industry
EN
04gs
eu consegui superar a tristeza dela ter morrido o foda e que e dificil aceitar que um ser t o meigo bobo alegre como
minha cachorra era
PO
nataliagbr hay cosas que te conectan a la vida aunque la lealtad te
aparte muchas veces de lo que mas deseas ES
Se utilizó el algoritmo k-means, con un valor de k = 25. Se escogió dicho número al poseer como referencia la etiqueta del lenguaje de los mensajes. Es decir, en el caso ideal los clústeres formados presentarían la cantidad de elementos correspondiente al total de mensajes en cada idioma.
A continuación se presenta la Tabla 4.2 con los distintos idiomas utilizados. Tabla 4.2: Idiomas utilizados
Africano Español Indonesio Portugués Sueco Checo Finlandés Italiano Rumano Suajili Danés Francés Holandés Eslovaco Tagalo Alemán Croata Noruego Somalí Turco
Inglés Húngaro Polaco Albanés Vietnamita
Por otro lado, el sistema sobre el cual se realizaron los experimentos fue el servidor HP ProLiant con el sistema operativo Debian GNU/Linux 7.0 y Hadoop single-node, disponible en la Universidad.
4.4.2. CLUTO
En primer lugar se convirtió el archivo con los mensajes originales al formato de vectores, considerando un mínimo de 3 letras y las “stopwords”. Para ello se modificó el archivo original de doc2mat y se reemplazó en la carpeta del programa.
www.dropbox.com/s/i04604u8zptrs4g/doc2mat-mod
./doc2mat twitter twitter.mat
A continuación se ejecuta el programa que muestra las 5 palabras más representativas de cada clúster.
./vcluster -showsummaries=itemsets -showfeatures -nfeatures=5 -colmodel=none - clmethod=direct twitter.mat 25
4.4.3. Mahout
El primer paso realizado durante el experimento fue convertir el archivo con los mensajes a formato secuencial. Para ello fue necesaria la modificación del código publicado por Anagha Khanolkar4.
Se creó el proyecto en el directorio de Mahout llamado “formatConverter”.
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DartifactId= formatConverter
Se accede al directorio creado y se compila.
cd formatConverter mvn compile
A continuación se edita el archivo pom.xml y se agregan las líneas presentadas a continua- ción donde corresponda:
<parent>
<relativePath>../pom.xml</relativePath>
</parent> <properties>
<mahout.version>0.7</mahout.version>
<mahout.groupid>org.apache.mahout</mahout.groupid> </properties>
Además se debe agregar lo que contiene el archivo “agregar-pom.txt” (www.dropbox.com/ s/01xtrxdtzktavzp/agregar-pom.txt).
Se añaden los archivos FormatConverterMapper y FormatConverterTextToSequenceDriver a la carpeta /src/main/java/.
www.dropbox.com/s/q2yyz0p3a0y6dn6/FormatConverterMapper.java
www.dropbox.com/s/1k5kkue7iy6gk11/FormatConverterTextToSequenceDriver.java
Se crea la carpeta assembly en /scr/main/ y se agrega el archivo job.xml (www.dropbox. com/s/cc2nls6hpzrslyg/job.xml).
Se crea el directorio “clustering” en hadoop.
hadoop dfs –mkdir /user/root/clustering
En el directorio principal del proyecto se ejecuta el siguiente comando, el cual crea los .jar necesarios.
mvn package
Se ejecuta sobre hadoop:
time hadoop jar /mahout-distribution-0.7/formatConverter/target/formatConverter-1.0- SNAPSHOT-job.jar FormatConverterTextToSequenceDriver /user/root/clustering/twitter /user/ root/clustering/Seq
A continuación se crean los vectores a partir del archivo secuencial. Para ello fue necesaria la creación de un analizador para considerar un mínimo de 3 letras y las “stopwords” principales. Se descarga, compila y se crea el .jar correspondiente.
www.dropbox.com/s/b4fjzg5683cjbwo/MyAnalyzer.java
javac -classpath /mahout-distribution-0.7/integration/target/dependency/lucene-core-3.6. 0.jar MyAnalyzer.java -d myanalyzer_classes
jar -cvf myanalyzer.jar -C myanalyzer_classes/ .
Luego se copian los archivos necesarios según corresponda.
myanalyzer.jar en /examples/target/dependency/ MyAnalyzer.class en /examples/target/classes/ MyAnalyzer.java en /examples/src/main/java/
En el directorio /mahout-distribution-0.7/examples se ejecuta el comando: mvn package
Se corre sobre hadoop y se obtienen los vectores.
time mahout seq2sparse -i /user/root/clustering/Seq/ -o /user /root/clustering/seqSpar/ -a MyAnalyzer -s 5
Se ejecuta k-means.
time hadoop jar /mahout-distribution-0.7/core/target/mahout-core-0.7-job.jar org.apache .mahout.clustering.kmeans.KMeansDriver -i /user/root/ clustering/seqSpar /tfidf-vectors/ -o /user/root/clustering/resultado/ -dm org.apache.mahout.common. distance.CosineDis tanceMeasure --clusters /user/root/ clustering/clustrs/ --numClusters 25 --maxIter 10 -- overwrite --clustering -xm mapreduce
export HADOOP_CLASSPATH=/mahout-distribution-0.7/core/target/mahout-core-0.7-j ob.jar:/mahout-distribution-0.7/integration/target/mahout-integration-0.7. jar
time hadoop jar /mahout-distribution-0.7/core/target/mahout-core-0.7-job. jar org.apache. mahout.utils.clustering.ClusterDumper -i /user/root/clustering/resultado/clusters-3-final/ -o /user/root/clustering/resultado/analisis.txt -of TEXT -p /user/root/clustering/resultado/ clusteredPoints/ -n 5 -d /user/root/clustering/seqSpar/dictionary.file-0 -dt sequencefile - dm org.apache.mahout.common.distance.CosineDistanceMeasure
4.4.4. Comparación de Resultados
La clase de Mahout, ClusterDumper, para la transformación de los resultados de k-means a datos legibles está diseñada para mantener con toda la información en memoria principal. Debido a ello no fue posible obtener el análisis de los datos totales, ya que se generó un error de Java Heap Space imposible de solucionar. Por lo tanto, el análisis se separó en dos partes: el primero tomando en consideración el “speed-up” de las operaciones de creación de vectores y algoritmos de clustering; y el segundo, utilizando un conjunto de datos más pequeño para contrastar los resultados obtenidos y comprobar el funcionamiento del código.
En la Tabla 4.3 se pueden observar los tiempos obtenidos durante el primer análisis de “speed-up” con el archivo completo.
Tabla 4.3: Comparación tiempos de ejecución.
CLUTO Tiempo [s] Mahout Tiempo [s]
Creación archivo .mat 30,443 Creación archivo secuencial 12 Creación de vectores 192,298 Clustering 138,244 Clustering 149,429 TOTAL 168,687 TOTAL 353,727
Al comparar ambas herramientas se logró observar que Mahout demora alrededor de 2,5 [min] más al realizar la operación previa de transformación del input, es decir, la creación del archivo secuencial y vectores. Una de las posibles razones es que la herramienta doc2mat, utili- zada para la creación del archivo .mat de CLUTO, está escrita en lenguaje Perl siendo superior a Java en operaciones de procesamiento de texto y trabajo con expresiones regulares.
que CLUTO.
En cuanto al tamaño del archivo utilizado se considera que no fue el indicado, ya que sólo contaba con 74 MB con un total de 1.064.417 mensajes. A pesar de no ser una cantidad tan pe- queña, no es el óptimo esperado para trabajar sobre Hadoop el cual posee un mejor rendimiento con archivos del orden de GB.
Ahora bien, con respecto al segundo análisis de un archivo de tamaño menor al original (de sólo 10 [MB]5) cabe destacar que la idea radica en encontrar similitudes entre los clústeres obtenidos de forma general, es decir, el enfoque no va a un estudio detallado de text-mining y calidad final de éstos.
El archivo utilizado fue un extracto del original con 150.000 mensajes. Se utilizó un valor de
k = 25 clústeres, al poseer como referencia el campo de etiqueta de lenguaje de los mensajes.
En el caso ideal los clústeres formados presentarían la cantidad de elementos correspondiente al total de mensajes en cada idioma, siempre y cuando éste fuera lo suficientemente representativo. CLUTO logró agrupar 141.902 filas, es decir, alrededor de un 95 % del total. A su vez, Mahout agrupó aproximadamente un 93 % del total de mensajes con un valor de 139.105. A continuación se presenta la Figura 4.3 con los clústeres encontrados por ambas herramientas junto a sus términos descriptivos principales.
Figura 4.3: Resultados obtenidos por CLUTO (izquierda) y Mahout (derecha)
Se puede notar que existen 10 clústeres que poseen los mismos términos descriptivos dentro de sus primeros cinco “top-terms”, además la cantidad de objetos pertenecientes a cada uno de éstos son bastante similares, a excepción de dos casos puntuales:
Idioma indonesio (aja apa aku). En CLUTO con una cantidad de 16.123 y en Mahout, 8.656.
La página web (tumblr photo). En CLUTO con una cantidad de 2.162 y en Mahout, 53.985.
En cuanto al idioma indonesio, si se observa con detención existen 2 clústeres en Mahout que poseen palabras en este lenguaje (udah, jam, lagi con 3.643 objetos y kamu, kita, mentionke con 4.499). Si se suma el total se obtiene un valor de 16.798 lo cual es muy cercano al producido por CLUTO.
Los demás clústeres consideran palabras más “universales” como términos descriptivos, por ejemplo, menciones a páginas web (tumblr, twitcam, 4ms), cantantes adolescentes (harry_styles), equipos deportivos (packers, bears), entre otros. Asimismo sucede con los clústeres restantes que no coinciden con palabras en común entre las herramientas, pero que agrupan por característi- cas tales como estados de ánimo y canciones. Dentro de los idiomas que destacan se pueden observar clústeres correspondientes a holandés, español y portugués.
Tal como se menciona en un párrafo anterior, el caso ideal pensado fue que los clústeres formados presentaran la cantidad de elementos correspondiente al total de mensajes en cada uno de los idiomas considerados, siempre y cuando éste fuera lo suficientemente representativo. Esto ocurre para los lenguajes que poseen una mayor proporción de mensajes en los que se diferencia su expresión tal como el portugués, holandés, indonesio y español. En el caso del inglés predominan los temas particulares más que el idioma en sí, es decir, los términos son mayormente descriptivos.
Con respecto a las herramientas, CLUTO posee una gran ventaja en la entrega de resultados de una manera clara y fácil de analizar, además de presentar información relevante tal como:
1. Índice de similitud interna. A mayor valor, más estrecho se encuentra el clúster.
2. Sumario de los clústeres, con respecto a los porcentajes de los términos más descriptivos dentro del clúster.
3. Palabras más discriminativas, entre otros.
Mahout por otro lado no cuenta con un análisis de datos que se pueda interpretar tan fácil- mente, excepto por la presentación de los términos más descriptivos y su frecuencia en el clúster respectivo.
Conclusiones
En este capítulo se presentan las conclusiones específicas y generales observadas durante la realización del trabajo, que abarcan puntos desde la instalación y configuración, el desarrollo de los casos de prueba y sus resultados hasta el cumplimiento de los objetivos. Finalmente, se presenta el posible trabajo a futuro a seguir.
5.1.
Conclusiones Específicas
Día a día la cantidad de información existente en el mundo de las tecnologías de la in- formación crece de manera exponencial. Uno de los principales problemas que conlleva es el tratamiento de estas grandes cantidades de datos de manera confiable, eficaz y eficiente. Hadoop MapReduce, framework de código abierto que permite el cómputo paralelo de datos de manera distribuida, se ofrece como una de las herramientas para resolver dicho problema.
Los objetivos generales del trabajo consistieron en comprender el funcionamiento de Ha- doop, aprender a partir de casos de estudio su implementación, y analizar las ventajas y des- ventajas en el tratamiento de datos. A través del desarrollo de los casos de prueba, Conteo de Palabras y Búsqueda de Temperatura Máxima, y sus resultados obtenidos en el Capítulo 3, se logra concluir que Hadoop mejora su desempeño en comparación a las versiones secuenciales y Pig a medida que el tamaño de los archivos crece, por lo que es conveniente utilizar dicha herramienta para cantidades de datos de al menos del orden de GB. Esto se debe a la manera en que MapReduce trabaja, al realizar las fases map y reduce de forma paralela y avanzar inmedia-
tamente a medida que los procesos se encuentran disponibles. En cuanto al contraste con Pig, éste último demora más del doble de tiempo de ejecución tal como se menciona en el comienzo del Capítulo 3, debido a que Hadoop al correr de forma nativa aprovecha de mejor manera la optimización de recursos. Sin embargo, la gran ventaja que presenta Pig es la facilidad y ve- locidad de desarrollo en unas pocas líneas, por lo que es altamente recomendable a la hora de probar nuevas implementaciones de código y limpieza de datos, entre otros.
Por otro lado, entre los objetivos específicos se encontraba la implementación y evaluación de un algoritmo de minería de datos sobre Hadoop utilizando Mahout, en donde se escogió clustering y se comparó con la herramienta CLUTO. Dentro de las pruebas realizadas en el Capítulo 4 existen varios puntos a destacar los cuales se exponen a continuación.
Mahout ofrece la ventaja de ser personalizable en cuanto a código, en comparación a CLUTO que no se puede modificar. Sin embargo, es necesario un conocimiento previo del lenguaje Java, el funcionamiento de Mahout, las clases existentes y módulos, entre otros, ya que el desarrollo no es intuitivo.
En cuanto al análisis de “speed-up”, el tamaño del archivo utilizado para comparar ambas herramientas no fue el indicado, ya que sólo contaba con 74 MB, con un total de 1.064.417 mensajes. A pesar de no ser una cantidad tan pequeña, no es el óptimo esperado para trabajar sobre Hadoop tal como se comprobó en el Capítulo 3 en donde se encontró un mejor rendimiento con archivos del orden de GB.
Al contrastar ambas herramientas, Mahout demora alrededor de 2,5 [min] más al realizar la operación de creación del archivo secuencial y vectores. Una de las posibles razones es que la herramienta doc2mat, utilizada para la creación del archivo legible por CLUTO, está escrita en lenguaje Perl siendo superior a Java en operaciones de procesamiento de texto y trabajo con expresiones regulares. En cuanto al tiempo de ejecución del algoritmo de clustering, Mahout tardó sólo 11 [s] más que CLUTO.
Respecto al análisis de los clústeres cabe destacar que la idea principal del experimento no fue realizar text-mining, por lo que el resultado obtenido se considera a modo de re- ferencia para encontrar ventajas y desventajas entre ambas herramientas y las soluciones entregadas por sus algoritmos. Se utilizó un valor de k = 25 clústeres, al poseer como dato el campo de etiqueta de lenguaje de los mensajes. En el caso ideal los clústeres for- mados presentarían la cantidad de elementos correspondiente al total de mensajes en cada idioma, siempre y cuando éste fuera lo suficientemente representativo. Esto ocurre pa- ra los lenguajes que poseen una mayor proporción de mensajes en los que se diferencia su expresión tal como el portugués, holandés, indonesio y español. En el caso del inglés
predominan los temas particulares más que el idioma en sí, ya que estos consideran pa- labras más “universales” como términos descriptivos. Por ejemplo, menciones a páginas web (tumblr, twitcam, 4ms), cantantes adolescentes (harry_styles), equipos deportivos (packers, bears), entre otros. De la misma forma los clústeres restantes no coinciden con palabras en común entre las herramientas, pero agrupan según características como, por ejemplo, estados de ánimo, actividades diarias y canciones.
Tanto CLUTO como Mahout encontraron 10 clústeres que comparten los mismos tér- minos descriptivos dentro de los cinco “top-terms”, además de poseer una cantidad de objetos bastante similar para cada uno de ellos.
Como k-means es un algoritmo heurístico, no existen garantías de que convergen al ópti- mo global y el resultado puede depender de los grupos iniciales generados al azar. La calidad final depende fuertemente de qué tan buenos sean los datos utilizados. Se ob- servaron varias singularidades al revisar el archivo de entrada que pudieron influir, tales como mensajes con dos o más idiomas en una misma frase, por ejemplo menciones a canciones o citas además del lenguaje original; spam o promociones de páginas web in- dependientes del lenguaje, entre otros.
CLUTO entrega los resultados de una manera más comprensible y fácil de analizar, ade- más de presentar información más relevante tal como el índice de similitud interna, un sumario de los clústers, las palabras más discriminativas, entre otros. Mahout por otro la- do no cuenta con un análisis de datos que se pueda interpretar tan fácilmente, excepto por la presentación de los términos más descriptivos y su frecuencia en el clúster respectivo.
5.2.
Conclusiones Generales
A continuación se presenta una lista de conclusiones generales u observaciones a tener en cuenta.
A través del desarrollo de la memoria se encontraron diversos problemas los cuales fueron resueltos mediante la investigación y profundización de los temas. En cuanto a la instala- ción y utilización de los programas en un comienzo resultó bastante complejo al no existir una guía detallada de los pasos a seguir, sino que sólo información de manera dispersa, por lo que la curva de aprendizaje fue lenta. Lo mismo sucede con el desarrollo de código al utilizar distintos lenguajes que van desde Java, MapReduce, Pig y Perl, entre otros.
Cabe destacar que las pruebas fueron realizadas en un servidor con Hadoop Single-Node lo cual pudo influir en los tiempos de resultados.
Para utilizar Hadoop es conveniente analizar si las operaciones son paralelizables, co- mo en los casos de conteo, ya que de otro modo no sería apropiado su uso debido a la complejidad de desarrollo.
5.3.
Trabajo a Futuro
A continuación se presenta una serie de posibles trabajos a futuro a realizar:
Existe una gran variedad de herramientas de código abierto para realizar operaciones so- bre grandes cantidades de datos, por lo que sería interesante compararlas con Hadoop MapReduce con distintos tamaño de archivos, para probar qué tan eficaz sigue siendo. Optimizar el código de Hadoop para poder aumentar la velocidad de análisis, así como agregar más mappers o reducers si es posible. A su vez, trabajar en un servidor dedicado sólo a Hadoop, es decir, no en un servidor compartido o aumentar los nodos, ya que en este caso fue realizado sobre un Single-Node.
Sería interesante poner mayor énfasis al algoritmo de minería de datos de “clustering” y desarrollar un código más óptimo en Mahout, además de contar con un archivo de entrada de mayor tamaño, ya que se demostró que Hadoop mejora su desempeño a medida que el archivo es más grande.
Anexos
A.1.
Instalación de Pig
Para su instalación se descarga la última versión estable, en este caso corresponde a la versión 0.12.0, desde la siguiente dirección y a continuación se descomprime:
wget http://mirrors.ibiblio.org/apache/pig/stable/pig-0.12.0.tar.gz tar –xvf pig-0.12.0.tar.gz
Se crea el directorio pig y se mueve el archivo a éste.
mkdir /usr/lib/pig
mv pig-0.12.0 /usr/lib/pig/
Luego, se cambia la ruta PIG_HOME en el archivo bashrc a través del editor nano y se agregan las líneas expuestas a continuación: