BORRADOR MEMORIA PFC EMM



Documentos relacionados
Edición de Ofertas Excel Manual de Usuario

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib

Manual de instalación Actualizador masivo de Stocks y Precios

DOCENTES FORMADORES UGEL 03 PRIMARIA

INSTALACIÓ N A3ERP. Informática para empresas INTRODUCCIÓN CONSIDERACIONES GENERALES DE LA INSTALACIÓN PAQUETES DE INSTALACIÓN PREDEFINIDOS

COPIAS DE SEGURIDAD CON COBIAN BACKUP INSTALACIÓN Y CONFIGURACIÓN

comunidades de práctica

Escudo Movistar Guía Rápida de Instalación Dispositivos Symbian

FSx-Connector Guía rápida del Módulo pcron (Tareas Programadas) Créditos

INSTALACIÓN A3ERP INTRODUCCIÓN CONSIDERACIONES GENERALES DE LA INSTALACIÓN PAQUETES DE INSTALACIÓN PREDEFINIDOS

Móvil Seguro. Guía de Usuario Terminales Android

MANUAL COPIAS DE SEGURIDAD

1.- DESCRIPCIÓN Y UTILIDAD DEL SOFTWARE DAEMON TOOLS.

App para realizar consultas al Sistema de Información Estadística de Castilla y León

Tutorial: Primeros Pasos con Subversion

Base de datos en Excel

WINDOWS : COPIAS DE SEGURIDAD

Manual de rol gestor de GAV para moodle 2.5

Instalación. Interfaz gráfico. Programación de Backups. Anexo I: Gestión de la seguridad. Manual de Usuario de Backup Online 1/21.

Maxpho Commerce 11. Gestión CSV. Fecha: 20 Septiembre 2011 Versión : 1.1 Autor: Maxpho Ltd

Guía de Instalación. Glpi

UNIVERSIDAD DE SALAMANCA

Internet Information Server

Instrucciones para la instalación de IBM SPSS Data Access Pack para Linux

Propuesta de Portal de la Red de Laboratorios Virtuales y Remotos de CEA

Guía Rápida de Inicio

WINDOWS : TERMINAL SERVER

Mi propuesta consiste en crear un portal Web que contemple las siguientes funcionalidades:

Guía de Instalación para clientes de WebAdmin

RESOLUCIÓN DE ERRORES EN MOODLE CAMPUS VIRTUAL-BIRTUALA UPV-EHU

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación

MANUAL DE USUARIO APLICACIÓN SYSACTIVOS

Descripción. Este Software cumple los siguientes hitos:

Manual de usuario de Windows Live Writer

Oficina Online. Manual del administrador

AGREGAR COMPONENTES ADICIONALES DE WINDOWS

LiLa Portal Guía para profesores

MANUAL DE AYUDA. SAT Móvil (Movilidad del Servicio Técnico)

Conceptos Generales en Joomla

Manual del Usuario Groupware

Práctica de introducción a

Curso de PHP con MySQL Gratis

Plataforma e-ducativa Aragonesa. Manual de Administración. Bitácora

Apéndice 5 Manual de usuario de ColeXión. ColeXión 1.0. Manual de usuario

Cómo instalar fácilmente tu WordPress tras contratar un hosting en Hostalia

GESTIÓN DOCUMENTAL PARA EL SISTEMA DE CALIDAD

Notas para la instalación de un lector de tarjetas inteligentes.

Instalación de Tomcat7 en Ubuntu

Planificación, Gestión y Desarrollo de Proyectos

ESTRUCTURA DE LOS SITIOS DE CATEDRAS

Introducción a las redes de computadores

5. Composer: Publicar sus páginas en la web

Configuracion Escritorio Remoto Windows 2003

Tutorial para la creación de un blog institucional

POSICIONAMIENTO EN LA WEB (SEM Y SEO)

Cómo tener tu Tumblr con un domino propio

Sesión No. 4. Contextualización INFORMÁTICA 1. Nombre: Procesador de Texto

Capítulo 4. Requisitos del modelo para la mejora de la calidad de código fuente

ACCESO AL SERVIDOR EXCHANGE MEDIANTE OWA

Ley Orgánica de Protección de Datos

Curso Online de Microsoft Project

Gestión de Oportunidades

INSTITUTO TECNOLÓGICO DE COLIMA LIC. EN INFORMÁTICA

Administración Local Soluciones

Selección de los puntos de montaje

MANUAL DE USUARIO SIMPIOJO TE CNICO

Profesor: José Luis Di Biase

MANUAL DE USUARIO FACTURACIÓN ELECTRÓNICA

Manual CMS Mobincube

CIF-KM. GUÍA DE LOS PRIMEROS PASOS

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

GUÍA Nro. 1 TECNOLOGÍA DE INTERNET. TIII PIII

MANUAL SINCRONIZADOR LEKOMMERCE FACTUSOL

Tutorial: Configuración y Planificación de ejecución de RSYNC actualizando archivos del SIIF vía REDuy

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS

Gestión de Permisos. Bizagi Suite. Copyright 2014 Bizagi

Ubuntu Server HOW TO : SQUID. EN ESTE SE REALIZA LO SIGUIENTE: En este how to se le va a enseñar como instalar servidor proxi Squid.

Implantar Microsoft Software Updates Service (SUS)

TEMA 4: EMPEZANDO A NAVEGAR ESCUELA UNIVERSITARIA DE INFORMÁTICA. Raúl Martín Martín

Correo Electrónico: Webmail: Horde 3.1.1

GUIA DE LABORATORIO #10 Nombre de la Practica: Proxy y Filtrado web en ClearOS Laboratorio de Redes Tiempo Estimado: 2 Horas y 30 Minutos

Manual de software. Dynamic Cloud. 10/2014 MS-Dynamic_Cloud v1.2

Redes de área local: Aplicaciones y servicios WINDOWS

Escudo Movistar Guía Rápida de Instalación Para Windows

Para instalar el software FacturaScripts, primero deberemos descargarlo. Para ello, accedemos a la url:

Presentaciones compartidas con Google Docs (tutorial)

Google Drive. Registro y gestión de archivos. Manual de uso

5.2.- Configuración de un Servidor DHCP en Windows 2003 Server

Configuración SEO en el Panel

Instalar XAMP en modo gráfico

Programa de Ayuda EMCS Instalación Versión SQL Server Versión Marzo 2010

Sistema de SaaS (Software as a Service) para centros educativos

Manual de usuario de IBAI BackupRemoto

Capítulo 1 Documentos HTML5

Arsys Backup Online Manual de Usuario

Instrucciones de instalación de IBM SPSS Modeler Server 16 para Windows

Posicionamiento internacional

Autenticación Centralizada

Transcripción:

Índice BORRADOR MEMORIA PFC EMM Documento de Objetivos de Proyecto o Introducción o Antecedentes o Motivación o Objetivos o Alcance Lista de tareas Diagrama EDT o Planificación temporal Lista de entregas Diagrama de Gantt o Plan de contingencia o Estimación de contes o Factibilidad Arquitectura y Elección Tecnológica Captura de Requisitos o Modelo de Casos de Uso o Modelo de Dominio Análisis o Diagramas de Secuencia de Sistema o Contratos Diseño o Base de Datos o Pseudocódigo por operaciones Implementación o Descripción general o Notas a tener en cuenta Pruebas Manual de instalación Gestión o Trabajado VS. Planificado o Problemas encontrados Conclusiones y trabajo futuro Bibliografía 1

Documento de Objetivos del Proyecto Introducción Se trata de un sistema de recopilación de noticias a través del portal Europe Media Monitor (EMM), que a su vez ordena y cataloga las noticias de periódicos a nivel Europeo. El funcionamiento es el siguiente: Cada vez que se ejecuta, el programa accede al RSS del EMM, cada enlace apunta a un cluster de noticias donde se encuentran la historia a lo largo del tiempo y los países, personas y noticias relacionadas en diferentes idiomas. Esta información es recopilada y almacenada en una base de datos para su posterior uso. Antecedentes -El traductor de Google: Una de las herramientas que hizo posible el traductor de google, fue recopilar noticias de periódicos en varios idiomas y asignar significados a frases en lugar de a palabras sueltas, como hacen los diccionarios tradicionales. El sistema no siempre devuelve el resultado más adecuado, pero permite elegir entre diferentes significados que se ajustan al contexto o añadir uno nuevo. -Minería Web: Esta tecnología se lleva empleando desde que existe la web. Ha sido utilizada desde el principio por buscadores como google y yahoo para indexar la web y automatizar la búsqueda, recopilación y aprendizaje de todo tipo de contenido. -RSS 2.0: Es un lenguaje de marcas creado a partir de xml que se utiliza para facilitar la lectura de blogs, periódicos y otras páginas web. Los usuarios añaden la URL del rss a su programa lector de noticias (Agregador) y a continuación se van mostrando las noticias actualizadas. -Web-Scraping/Spidering: La idea es simular el comportamiento de un navegador web y obtener páginas html completas, archivos multimedia, enlaces etc. Motivación Este proyecto está enmarcado en uno mucho mayor que mediante técnicas avanzadas de Aprendizaje Máquina y Procesamiento de Lenguaje Natural es capaz de ordenar y catalogar la información según su significado. Mi motivación principal es la de aprender y como el proyecto requiere del conocimiento de ciertas herramientas que desconozco, tendré que emplear una parte del tiempo en la formación. 2

Objetivos Al finalizar el PFC se espera entregar además de la memoria: -Programa de obtención de noticias en Perl -Modelo de datos: Base de Datos preparada para utilizar -Plan de implantación: Requisitos/Paso a paso... MÉTODO DE TRABAJO -Gestión y desarrollo: -Reuniones -Búsqueda de información/formación: Perl/RSS/Spidering/Unix -Planificación estructural y temporal -Prototipos -DOP -CR -Análisis -Diseño del modelo de datos -Implementación -Pruebas -Manual de Instalación Alcance El proyecto incluirá el diseño del modelo de datos XML, Base de Datos, etc. el programa que extraiga la información relevante de las páginas y la archive en el modelo de datos, el manual de instalación y uso y los módulos, paquetes y software utilizados. El proyecto no incluye llenar la base de datos. Lista de tareas y subtareas Procesos tácticos Realización del DOP Reuniones de planificación Memoria Procesos operativos Captura de Requisitos Análisis del proyecto Diseño de la aplicación Implementación Pruebas 3

Procesos formativos Lectura de documentación -Perl - RSS - Spidering - Expresiones Regulares - Unix Diagrama EDT Lista de Entregas Primer prototipo (lee rss) DOP + Indice Memoria + Segundo prototipo (lee rss y extrae los datos necesarios del cluster) Tercer Prototipo (lee rss y guarda los datos en el modelo elegido XML, BD Relacional, ) Cuarto prototipo (comprueba que no se descargue lo mismo varias veces) Quinto prototipo (integrar el programa en Linux con cron) + Pruebas Sexto Prototipo + Memoria + Manual de instalación 4

Diagrama de Gantt 5

PLAN DE CONTINGENCIA En todo proyecto es primordial conocer los riesgos y disponer de una serie de medidas para paliar las dificultades que se puedan encontrar a lo largo de su desarrollo. Para ello he realizado un análisis de riesgos a nivel cualitativo: Riesgos Perder la documentación o el código fuente Que me roben o que se me estropee el portátil Que me ponga enfermo Errores de planificación Mala interpretación de los requisitos Contramedidas Copias de seguridad Ordenadores de la facultad y copia de seguridad Dejar unos días para imprevistos en la planificación Acotar el alcance del proyecto Reuniones periódicas con el director ESTIMACIÓN DE COSTES Teniendo en cuenta que la asignatura se compone de seis créditos y que cada crédito equivale a veinticinco horas de trabajo, se espera que emplee unas ciento cincuenta horas como mínimo. Dado que otros años algunos alumnos han empleado unas doscientas horas, y puesto que el tiempo de que dispongo es reducido, estimo que en mi caso emplearé unas ciento setenta. FACTIBILIDAD Al ser un proyecto que requiere adquirir conocimientos en tantas materias, lleva implícito un alto grado de compromiso. Por otra parte el tener que investigar temas desconocidos siempre resulta refrescante. Otro elemento que me impulsa a realizarlo es la necesidad de terminar la carrera cuanto antes para así poder empezar la superior. Por lo tanto no sólo resulta factible sino que con una buena planificación debería ser capaz de realizar un buen trabajo en el tiempo establecido. 6

Arquitectura y Elección tecnológica El programa esá pensado para ser ejecutado en una máquina con un sistema operativo Linux, el intérprete Perl y una serie de módulos que se detallan en el manual de instalación. Mediante la utilidad crontab, habría que configurar la ejecución del programa con la periodicidad requerida. De este modo, el programa se ejecutaría automáticamente recogiendo los datos de los nuevos clusters, noticias etc. Dado que el contenido del RSS se actualiza cada día, habría que configurar crontab para ejecutar el programa al menos una vez al día para evitar que se pierda información. Asimismo, el programa almacena los datos recogidos en una base de datos mysql que puede estar en la misma máquina o en otra diferente. En cualquier caso, ya sea en el mismo ordenador o en la máquina remota, se deberá tener instalado un servidor de bases de datos mysql, disponible en cualquier repositorio de utilidades linux. Captura de Requisitos El Europe Media Monitor (EMM) es un portal de Internet que cataloga, ordena y asocia noticias similares en varios idiomas a partir de publicaciones de periódicos de toda Europa. Una de las herramientas que ofrecen es el NewsExplorer, una interfaz accesible que permite al usuario navegar por los clusters, noticias, fechas, paises, personas, etc. relacionados con cada noticia. Al mismo tiempo esta herramienta proporciona un RSS para estar actualizado de las últimas noticias más relevantes. Nuestra misión es visitar el RSS y obtener los nuevos clusters y su contenido para almacenarlos en una base de datos y poder utilizarlos posteriormente. De cada cluster queremos extraer: Un título de cluster Un enlace de cluster Una descripción de la noticia más representativa del cluster Una lista de noticias en el mismo idioma La historia de la que forma parte Una lista de palabras clave(keywords) de la historia Una lista de clusters relacionados en diferentes idiomas Una lista de paises Una lista de lugares Una lista de personas Una lista de otros nombres sin catalogar 7

De cada país, persona, otro nombre, lugar, historia y noticia se quieren guardar el título y el enlace. También se requieren todas las fechas y horas que se puedan extraer: Fecha de cluster Fecha de inicio de historia Hora de publicación de noticia De cada cluster relacionado en otros idiomas se quiere recuperar la similaridad con el propio cluster, el idioma en cuestión, el título, el enlace y todo lo que se aplica a los clusters excepto la lista de clusters relacionados en otros idiomas. 8

Modelo de Casos de Uso 9

Modelo de Dominio 10

Análisis Diagramas de Secuencia de Sistema 11

Contratos Caso de uso Obtener Cluster Contrato get_description Name: get_description(html) Responsablities: Obtener la descripción del cluster a partir del código html. Preconditions: Si existe descripción, ésta se encontrará entre las etiquetas <p class= center_leadin > y </p> del código html. Postconditions: Ø Salida: Descripción del cluster Contrato get_clusterdate Name: get_clusterdate(html) Responsablities: Obtener la fecha del cluster a partir del código html. Preconditions: La fecha está entre las etiquetas <p class= center_group_main > y </p> del código html. Postconditions: Ø Salida: Fecha del cluster literal 12

Contrato get_places Name: get_places(html) Responsabilities: Obtener la información de los lugares relacionados con el cluster. Preconditions: Los lugares están localizados en el código html a partir de la palabra Places hasta la primera etiqueta </div>. Más concretamente en etiquetas <a></a> con atributos target= _blank y class= headline_link. El parámetro de entrada contiene el código html de la página. Postconditions: Ø Salida: Lista de lugares con nombre, código del país al que pertenecen y enlace. Se devuelve en tres listas. Contrato get_other Name: get_other(html, uri) Responsabilities: Obtener la información de otros nombres relacionados con el cluster. Preconditions: Los otros nombres están localizados en el código html a partir de la palabra Other Names hasta la primera etiqueta </div>. Más concretamente en etiquetas <a></a> con el atributo class= headline_link. El parámetro de entrada uri contiene la dirección absoluta de la página y html el código html de la misma. Postconditions: Ø Salida: Lista de otros nombres con nombre, frecuencia con la que aparecen en el cluster y enlace. Se devuelve en tres listas. Contrato get_news Name: get_news(html, uri) Responsabilities: Obtener la información de las noticias pertenecientes al cluster. Preconditions: Las noticias están localizadas en el código en etiquetas <a></a> con el atributo target= EMMARTICLE. Las horas de publicación se encuentran entre las etiquetas <p class= center_headline_source > y </p>. El parámetro de entrada uri contiene la dirección absoluta de la página y html el código html de la misma. Postconditions: Ø Salida: Lista de noticias con nombre, hora de publicación y enlace. Se devuelve en tres listas. Contrato get_countries Name: get_countries(html) Responsabilities: Obtener la información de los paises relacionados con el cluster. Preconditions: Los paises están localizados en el código en etiquetas <div></div> con el atributo class= country_link cluster_group_item y sus enlaces contienen el tag countryedition. El parámetro de entrada html contiene el código html de la página. Postconditions: Ø Salida: Lista de paises con nombre, frecuencia con la que aparecen en el cluster y enlace. Se devuelve en tres listas. 13

Contrato get_keywords Name: get_keywords(html) Responsabilities: Obtener las keywords (palabras clave) relacionadas con el cluster. Preconditions: Las keywords están localizadas en el código a partir de la palabra Keywords: hasta la primera etiqueta </p>. El parámetro de entrada html contiene el código html de la página. Postconditions: Ø Salida: Lista de keywords. Contrato get_people Name: get_people(html, uri) Responsabilities: Obtener la información de las personas relacionadas con el cluster. Preconditions: Las personas están localizadas en el código a partir de la palabra Related People hasta la primera etiqueta </div>. Más concretamente las personas con enlace se encuentran en etiquetas <a></a> con el atributo class= headline_link y las que no tienen enlace en etiquetas <i></i>. El parámetro de entrada uri contiene la dirección absoluta de la página y html el código html de la misma. Postconditions: Ø Salida: Lista de personas con nombre, frecuencia con la que aparecen en el cluster y enlace. Se devuelve en tres listas. Contrato get_story Name: get_story(html, uri) Responsabilities: Obtener la información de la historia de la que forma parte el cluster. Preconditions: La historia está localizada en el código a partir de la frase This cluster belong to the following story:. Más concretamente en una etiqueta <a></a> con el atributo class= headline_link_bold. El parámetro de entrada uri contiene la dirección absoluta de la página y html el código html de la misma. Postconditions: Ø Salida: Nombre, fecha de inicio y enlace de la historia. Contrato get_related Name: get_related(html, langs, similarity, uri) Responsabilities: Obtener la información de los clusters relacionados en los lenguajes langs que tengan una similaridad de por lo menos similarity. Preconditions: Los clusters relacionados están localizados en el código html en enlaces con alguno de los códigos de lenguaje langs. Ej: href=.*/es/.*. El parámetro de entrada uri contiene la dirección absoluta de la página, similarity un número real entre 0 y 1, langs una lista de códigos de lenguaje con dos caracteres y html el código html de la página. Postconditions: Ø Salida: Lista de clusters relacionados. Cada uno con enlace, lenguaje y similaridad que guardan con el cluster en el que aparecen. Se devuelve en tres listas. 14

Caso de uso Guardar Cluster Contrato exists_cluster Name: exists_cluster(clusterid) Responsabilities: Determinar si el cluster con id clusterid ya está almacenado. Preconditions: Ø Postconditions: Ø Salida: Si ya existe el cluster, se devuelve 1. En caso contrario se devuelve 0. Contrato exists_story Name: exists_story(storyid) Responsabilities: Determinar si la historia con id storyid ya está almacenada. Preconditions: Ø Postconditions: Ø Salida: Si ya existe la historia, se devuelve 1. En caso contrario se devuelve 0. Contrato insert_story Name: insert_story(storyid, storytitle, storystartdate, storylink) Responsabilities: Almacenar los datos de una historia en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. La historia no está almacenada en la base de datos. Postconditions: Los datos de la historia se han almacenado correctamente en la base de datos. Salida: Ø Contrato insert_cluster Name: insert_cluster(clusterid, title, description, link, lang, clusterdate, storyid) Responsabilities: Almacenar los datos de un cluster en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. El parámetro storyid puede estar vacío, pero si no lo está, la historia con dicho id se ha de encontrar almacenada en la base de datos. El parámetro description también puede estar vacío. Postconditions: Los datos del cluster se han almacenado correctamente en la base de datos. Salida: Ø Contrato insert_news Name: insert_news(newstitles, newspubtimes, newslinks, clusterid) Responsabilities: Almacenar los datos de las noticias relacionadas con el cluster clusterid en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. El cluster clusterid está almacenado en la base de datos. Postconditions: Los datos de las noticias se han almacenado correctamente en la base de datos. Salida: Ø 15

Contrato insert_countries Name: insert_countries(countrynames, countryfreqs, countrylinks, clusterid) Responsabilities: Almacenar los datos de los paises relacionados con el cluster clusterid en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. El cluster clusterid está almacenado en la base de datos. Postconditions: Los datos de las noticias se han almacenado correctamente en la base de datos. Salida: Ø Contrato insert_keywords Name: insert_keywords(keywords, storyid) Responsabilities: Almacenar keywords relacionadas con la historia storyid en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. La historia con id storyid se encuentra almacenada en la base de datos. Postconditions: Las keywords se han almacenado correctamente en la base de datos. Salida: Ø Contrato insert_people Name: insert_people(peoplenames, peoplefreqs, peoplelinks, clusterid) Responsabilities: Almacenar los datos de las personas relacionadas con el cluster clusterid en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. El cluster clusterid está almacenado en la base de datos. Postconditions: Los datos de las personas se han almacenado correctamente en la base de datos. Salida: Ø Contrato insert_places Name: insert_places(placenames, countrycodes, placelinks, clusterid) Responsabilities: Almacenar los datos de los lugares relacionados con el cluster clusterid en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. El cluster clusterid está almacenado en la base de datos. Postconditions: Los datos de los lugares se han almacenado correctamente en la base de datos. Salida: Ø 16

Contrato insert_others Name: insert_others(othernames, otherfreqs, otherlinks, clusterid) Responsabilities: Almacenar los datos de los otros nombres relacionadas con el cluster clusterid en la base de datos. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. El cluster clusterid está almacenado en la base de datos. Postconditions: Los datos de los otros nombres se han almacenado correctamente en la base de datos. Salida: Ø Contrato insert_ccs Name: insert_ccs(sourcecluster, targetclusters, similarities) Responsabilities: Almacenar la relación entre clusters junto con la similaridad que comparten. Preconditions: Los parámetros de entrada deben estar correctamente inicializados. Los clusters sourcecluster y targetclusters están almacenados en la base de datos. Postconditions: Los datos de la relación se han almacenado correctamente en la base de datos. Salida: Ø 17

Diseño Base de Datos He optado por crear sendas tablas intermedias para otros nombres, paises y personas, porque de lo contrario se repetirían el nombre y el enlace de cada uno, por cada cluster en el que aparecieran, haciendo crecer el tamaño de la base de datos rápidamente. Lo mismo ocurre con la tabla PLACE. 18

Pseudocódigo por operaciones Programa principal Comprobación de los parámetros de entrada Se obtiene el RSS en el primer lenguaje pasado como parámetro Por cada item del RSS: Se obtiene el id del cluster a partir de su enlace Si el cluster existe: Siguiente item Dormir programa 1 segundo para no sobrecargar el servidor Obtener la página del cluster actual Obtener y almacenar datos del Cluster->getsave_Cluster Obtener enlaces y similaridades de los clusters relacionados Por cada cluster relacionado: Se obtiene el id del cluster a partir de su enlace Si el cluster existe: Siguiente cluster Dormir programa 1 segundo para no sobrecargar el servidor Obtener la página del cluster actual Obtener y almacenar datos del Cluster->getsave_Cluster Almacenar relaciones entre el cluster del bucle exterior y los clusters del bucle interior con sus similaridades Getsave_Cluster(uri,html,clusterId,cluster_lang): Obtener fecha, descripción, noticias, paises, lugares, personas, otros nombres, keywords e historia. Si se ha obtenido la historia: Calcular el id de la historia a partir de su enlace Si no existe la historia en la base de datos: Insertar historia Insertar Keywords Insertar cluster Insertar Personas Insertar Noticias Insertar Otros Nombres Insertar Lugares 19

Funciones especificadas en los contratos get_clusterdate(html): Obtener la fecha del cluster a partir del código html mediante una expresión regular Si se ha obtenido dicha fecha: Sustituir los códigos html para caracteres no-ascii(á) por sus repectivos caracteres (á). Devolver la fecha decodificada get_description(html): Obtener la descripción del cluster a partir del código html mediante una expresión regular Si se ha obtenido dicha descripción: Sustituir los códigos html para caracteres no-ascii(á) por sus repectivos caracteres (á) Devolver la descripción decodificada get_news(html,uri): Obtener en una lista todos los enlaces relativos y los títulos de noticia del cluster a partir del código html mediante una expresión regular Obtener en una lista todas las horas de publicación de las noticias a partir del código html mediante una expresión regular Pasar los enlaces y los títulos a dos listas diferentes Convertir los enlaces relativos en absolutos a partir del parámetro uri Aplicar la función decode_list a la lista de títulos de noticia Devolver las listas de títulos, horas de publicación y enlaces get_countries(html): Obtener una lista con todos los nombres de país junto con la frecuencia con la que aparecen en el cluster a partir del código html mediante una expresión regular Obtener una lista con todos los enlaces absolutos de paises a partir del código html mediante una expresión regular Pasar los nombres y las frecuencias a dos listas diferentes Aplicar la función decode_list a la lista de nombres de país Devolver las listas de nombres, frecuencias y enlaces 20

get_places(html): Obtener el fragmento del código donde se encuentra la información de los lugares a partir del código html mediante una expresión regular A partir de dicho fragmento se obtiene una lista con el enlace absoluto, nombre y código de país de cada lugar Pasar los nombres, los códigos de lugar y los enlaces a tres listas diferentes Aplicar la función decode_list tanto a la lista de nombres de lugar como a la de enlaces Devolver las listas de nombres, códigos de país y enlaces get_people(html,uri): Obtener el fragmento del código donde se encuentra la información de las personas a partir del código html mediante una expresión regular A partir de dicho fragmento se obtiene una lista con el enlace relativo, nombre y frecuencia de cada persona mediante una expresión regular A partir de dicho fragmento también se obtiene una lista con el nombre y la frecuencia de personas que carecen de enlace Pasar los nombres, las frecuencias y los enlaces a tres listas diferentes Aplicar la función decode_list a la lista de nombres de persona Convertir los enlaces relativos en absolutos a partir del parámetro uri Devolver las listas de nombres, frecuencias y enlaces get_other(html,uri): Obtener el fragmento del código donde se encuentra la información de los otros nombres a partir del código html mediante una expresión regular A partir de dicho fragmento se obtiene una lista con el enlace relativo, nombre y frecuencia de cada otro nombre mediante una expresión regular Pasar los nombres, las frecuencias y los enlaces a tres listas diferentes En cada nombre sustituir los códigos html para caracteres no-ascii(á) por sus repectivos caracteres (á) Convertir los enlaces relativos en absolutos a partir del parámetro uri Devolver las listas de nombres, frecuencias y enlaces get_keywords(html): Obtener el fragmento del código donde se encuentran las palabras clave a partir del código html mediante una expresión regular Dividir el fragmento cuando haya una coma, o un slash /, que son los elementos que separan las keywords, y guardar el resultado en una lista Aplicar la función decode_list a la lista de keywords Devolver la lista de keywords 21

get_story(html,uri): Obtener el título y el enlace relativo de la historia a partir del código html mediante una expresión regular Obtener la fecha de inicio de la historia a partir del código html mediante una expresión regular Tanto en el título como en la fecha de inicio sustituir los códigos html para caracteres no- ASCII(á) por sus repectivos caracteres (á) Convertir el enlace relativo en absolutos a partir del parámetro uri Devolver el nombre, la fecha de inicio y el enlace de la historia get_related(html, langs,similarity,uri): Por cada lenguaje de langs: Obtener una lista con todos los enlaces, los lenguajes y las similaridades a partir del código html mediante una expresión regular Pasar los enlaces, los lenguajes y las similaridades a tres listas diferentes Sólo conservar los que cumplen la restricción de tener una similaridad mayor o igual a la pasada como parámetro (similarity) Convertir los enlaces relativos en absolutos a partir del parámetro uri Devolver las listas de enlaces, lenguajes y similaridades exists_cluster(clusterid): Inicializar la variable resultado a 0 Llamar a la función db_connect Se prepara la consulta a la base de datos Se ejecuta la consulta con el parámetro id, correspondiente al id del cluster que se quiere consultar Si se ha encontrado dicho cluster se cambia la variable result a 1 Llamar a la función db_disconnect Devolver el resultado exists_story(storyid): Su código es el mismo que el de existe_cluster, sólo que cambiando la consulta insert_story(storyid,storytitle,storystartdate,storylink): Llamar a la función db_connect Se ejecuta la inserción de la historia con los parámetros storyid, storytitle, storystartdate y storylink Llamar a la función db_disconnect 22

insert_keywords(keywords,storyid): Llamar a la función db_connect Por cada keyword de la lista Keywords: Se ejecuta la inserción del keyword con los parámetros keyword y storyid Llamar a la función db_disconnect insert_cluster(clusterid, title,description,link,cluster_lang,clusterdate,storyid): Llamar a la función db_connect Se ejecuta la inserción del cluster con los parámetros clusterid, title, description, link, cluster_lang, clusterdate y storyid Llamar a la función db_disconnect insert_countries(countries,countryfreqs,countrylinks,clusterid): Llamar a la función db_connect Por cada país de la lista Countries: Se comprueba si ya existe el país en la base de datos Si no existe: Se ejecuta la inserción del país con los parámetros countryname y countrylink Se ejecuta la inserción de la relación entre país y cluster con los parámetros clusterid, countryname y countryfreq Llamar a la función db_disconnect 23

insert_people(peoplenames,peoplefreqs,peoplelinks,clusterid): Llamar a la función db_connect Por cada persona de la lista peoplenames: Se comprueba si ya existe la persona en la base de datos Si no existe: Se ejecuta la inserción de la persona con los parámetros personname y personlink Se ejecuta la inserción de la relación entre persona y cluster con los parámetros clusterid, personname y personfreq Llamar a la función db_disconnect insert_news(newstitles,newspubtimes,newslinks,clusterid): Llamar a la función db_connect Por cada noticia de la lista newstitles: Se aplica la función sha1 al link de la noticia para obtener su id Se ejecuta la inserción de la noticia con los parámetros id, title, link, pubtime y clusterid Llamar a la función db_disconnect insert_others(othernames,otherfreqs,otherlinks,clusterid): Llamar a la función db_connect Por cada otro nombre de la lista othernames: Se comprueba si ya existe el otro nombre en la base de datos Si no existe: Se ejecuta la inserción del otro nombre con los parámetros othername y otherlink Se ejecuta la inserción de la relación entre otro nombre y cluster con los parámetros clusterid, othername y otherfreq Llamar a la función db_disconnect 24

insert_places(placenames,countrycodes,placelinks,clusterid): Llamar a la función db_connect Por cada lugar de la lista placenames: Se comprueba si ya existe el lugar en la base de datos Si no existe: Se aplica la función sha1 al link del lugar para obtener su id Se ejecuta la inserción del lugar con los parámetros placeid, placename, countrycode, placelink, latitud y longitud Se ejecuta la inserción de la relación entre lugar y cluster con los parámetros clusterid y placeid Llamar a la función db_disconnect insert_ccs(sourcecluster, targetclusters,similarities): Llamar a la función db_connect Por cada cluster relacionado de la lista targetclusters: Se ejecuta la inserción de la relación entre los clusters sourcecluster y targetcluster con los parámetros sourcecluster, targetcluster y similarity Llamar a la función db_disconnect Funciones auxiliares db_connect: Contiene los datos de conexión a la base de datos Se conecta a la base de datos Db_Disconnect: Se desconecta de la base de datos. Sha1(item): Calcula el resumen hash hexadecimal SHA1 y lo devuelve. Decode_list(list): Decodifica los códigos html (á etc) de los elementos de una lista y los devuelve en otra lista. 25

Implementación Pruebas Al tratarse de un programa tan extenso, cada vez que he querido añadir alguna funcionalidad nueva he tenido que realizar la prueba aparte. Por ejemplo para obtener los paises a partir del código html, he probado la expresión regular en un script aparte. Otra prueba para la que he codificado un script ha sido la de comprobar la longitud máxima de los enlaces y otros atributos de las tablas. Esto me sirvió para ajustar el tamaño de algunos atributos de modo que ocuparan menos. 26

Guía de Instalación EMM CLUSTERS Requisitos: Para realizar la instalación del programa se requieren dos ficheros: - emm_clusters.sql : Fichero necesario para la creación de la base de datos EMM_CLUSTERS. - prototipo7.pl : Programa perl Asimismo, para poder ejecutar el programa, se necesita tener instalada la última versión de Perl y una serie de módulos instalables a través del cliente CPAN: -LWP::Simple: Este módulo permite simular el comportamiento de un navegador web obteniendo el contenido de una página. - XML::RSS: El programa utiliza este módulo para extraer varios datos de un RSS (título, descripción, enlace, etc.) - URI: Mediante este módulo el programa convierte las direcciones relativas en absolutas. - HTML::Entities: Gracias a este módulo se pueden decodificar las secuencias de escape HTML como á etc. - DBI: Modulo necesario para las interacciones con la base de datos. - Digest::SHA1: El programa realiza un resumen sha1 hexadecimal del enlace de cada cluster y lo utiliza de clave primaria en su respectiva tabla. De este modo además resulta sencillo comprobar si ya se ha guardado información sobre un cluster. También es necesario tener instalado un servidor mysql en alguna máquina accesible desde el ordenador que vaya a ejecutar el programa. Si ya se tiene instalado hay que modificar los datos de conexión a la base de datos en la función sub conectar del programa, que se encuentra al principio del mismo, ya que por defecto está configurado para utilizarlo en una máquina local. Pasos a seguir: 1- Instalar módulos Perl en cliente 2- Crear estructura de la Base de Datos en servidor 3- Programar cron para que ejecute el programa automáticamente 27

1- Instalar módulos Perl en cliente Para instalar los módulos desde el cliente CPAN es necesario tener privilegios de administrador por lo que en una nueva terminal de consola ejecutamos: >sudo cpan en caso de ubuntu o su equivalente en otras distribuciones. Aparecerá una linea de comandos con prefijo cpan> en la que tendremos que ir introduciendo las siguientes instrucciones a medida que vayan terminando: install LWP::Simple install XML::RSS install URI install HTML::Entities install DBI install Digest::SHA1 Esto puede llevar bastante tiempo por lo que se aconseja ser paciente. 2- Crear estructura de la Base de Datos en servidor Desde el servidor se ejecuta la interfaz de línea de comandos mysql, que también requiere permisos de administrador: >sudo mysql mysql>source ruta_del_fichero Por ejemplo: source /home/usuario/desktop/archivo.sql 3- Programar cron para que ejecute el programa automáticamente Abrir crontab en un editor mediante el comando : >crontab e Añadir una línea por cada ejecución que queramos realizar. Formato: Minuto = El minuto de 00 a 59. Un * indica cada minuto Hora = Hora del día en formato de 24 horas: de 00 a 23. Un * indica cada hora Día = Día del mes de 1 a 31. Un * indica cada día Mes = Mes del año de 1 a 12. Un * indica cada mes Día de la semana = 3 caracteres en inglés (sun, mon,..) o númerico empezando el domingo por 0 (0=domingo, 1=lunes,...). Un * indica cada día de la semana. Comando = El comando que queremos que se ejecute. Ejemplo: 0 14 * * * perl -w /home/usuario/desktop/prototipo7.pl es en fr 0.5 0 15 * * * perl -w /home/usuario/desktop/prototipo7.pl en es fr 0.5 0 16 * * * perl -w /home/usuario/desktop/prototipo7.pl fr en es 0.5 Estas tres líneas ejecutarían a las 14:00, a las 15:00 y a las 16:00 de todos los días tres versiones diferentes del programa empezando por clusters en español, inglés y francés respectivamente. 28

Gestión Trabajado VS Planificado Este proyecto me ha llevado más tiempo que el estimado. Esto se debe a una mala planificación, dado que he subestimado la cantidad de tiempo y trabajo que requiere redactar la memoria. Muestra de ello es que pensaba terminarlo en diciembre y ha llegado enero sin haberlo finalizado. Estimo que en total sumarán unas 250 horas invertidas en el proyecto, frente a las 170 que pensaba. Software utilizado COPIAS DE SEGURIDAD -Cobian Backup -Dropbox EDICIÓN -Microsoft Word 2007 PROGRAMACIÓN -Notepad++ -Perl BASE DE DATOS -MYSQL GESTIÓN DE PROYECTO -Dia -Microsoft Project 29

Problemas Encontrados -Berkeley DB XML: La solución ideal para almacenar los datos extraídos resulta compleja de instalar. Viene con un fichero autoinstalable buildall.sh que se puede configurar mediante parámetros. Al instalarlo me dio problemas con uno de los módulos de los que dependen el resto. -Empleé mucho tiempo intentando solucionar el problema hasta que desistí y me centré en una solución con una base de datos relacional. -Expresiones Regulares: Pensaba que las sabía manejar pero al no controlarlas del todo, me dan algunos problemas. -Solución: Investigar más y utilizar otros medios de extracción de datos cuando sea necesario. -Tiempo: He perdido mucho tiempo en algunas indagaciones que no han dado ningún fruto. El tiempo se agota y debo terminar. -Solución: Acortar algunos aspectos de la captura de requisitos. Conclusiones y trabajo futuro De haber tenido más tiempo y en otras circunstancias habría podido realizar un trabajo más extenso guardando más datos y visitando más secciones del EMM. Por mi parte tengo intención de seguir estudiando técnicas de inteligencia artificial y aprendizaje automático para poder abordar mejor este tipo de problemas. Bibliografía -LWP & Perl Sean M. Bourke O Reilly - 2004 -Spidering Hacks - Tara Calishain, Kevin Hemenway O Reilly 2003 -Perl Cookbook 2nd Edition - Tom Christiansen & Nathan Torkington - O Reilly 2003 -Developing Feeds with RSS and Atom - Ben Hammersley O Reilly 2005 -Mastering Regular Expressions 2nd Edition - Jeffrey Friedl O Reilly - 2002 30