Part 2: Analytic approaches
4.1 The order and disorder of the pre ‐ Olympic site
4.1.2 Types and rhythms of occupancy and use
En la primera iteración se desarrollaron actividades conjuntas entre todo el equipo referentes a la planeación del desarrollo, así como el planteamiento de las historias de usuario, tareas de ingeniería y pruebas de aceptación. Las descripciones y especificaciones de las historias de usuario definidas en la primera iteración se encuentran en el Anexo No 1.
7.2.1.1. Historias de Usuario
Esta iteración tuvo como objetivo, por un lado, la identificación o implementación del crawler que permitiera obtener la información de los personajes de la política colombiana a través de la enciclopedia libre en línea Wikipedia y por el otro la integración del crawler al sistema.
Las historias de usuario definidas para la primera iteración se encuentran en la tabla 6. Allí se encuentra el nombre de la historia, su descripción y el estado con el que finalizó dicha historia de usuario.
Historias Nombre Descripción Estado
1
Extraer información de Wikipedia
El sistema debe extraer la información de Wikipedia en español de los personajes que sean solicitados por el
usuario Rechazada
2
Def inición o desarrollo del crawler a utilizar
Se debe realizar un análisis de crawlers de código abierto que se puedan integrar al sistema y de los cuales se pueda obtener información relacionada con personajes de la política colombiana. Luego de revisar y probar las distintas
opciones encontradas se elige el crawler Uru Aceptada
3
Integrar crawler en el aplicativo
Realizar la integración del crawler Uru al aplicativo web por medio del montaje de s us componentes de sof tware e
instalación de sus dependencias. Aceptada
4
Cargar inf ormación del crawler
Construir un componente de software que permita
almacenar toda la información extractada por el crawler en una base de datos que pudiese almacenar información semiestructurada. Para lo cual después de revisar varias
opciones se determinó que la mejor era MongoDB. Aceptada 5
Construir servicio socket
Realizar un servicio socket de tipo bidireccional que permita
env iar y recibir información entre Python y Node.js. Extendida
Tab la 6 Historias de usuario de la primera iteración.
El énfasis de la primera iteración fue realizar la búsqueda de componentes de software, librerías o APIS con la funcionalidad de extraer información de las páginas de Wikipedia para obtener la mayor cantidad de información relacionada a los personajes.
35
7.2.1.1.1. Extraer información de Wikipedia
Como resultado de la búsqueda de librerías que permitieran extraer información de las páginas de Wikipedia, se buscó la integración de las librerías “Wikipedia API” y “WPTools” sin embargo, los componentes probados e integrados al sistema extraen información de forma parcial o incompleta, sus tiempos de respuesta son lentos con grandes cantidades de datos y los componentes no respondieron a la cantidad de peticiones necesarias para el sistema. Dados los resultados anteriores se consideró necesario obtener la información de las páginas web que se encontraban enlazadas por lo que se contempló la utilización de un crawler.
7.2.1.1.2. Definición o desarrollo del crawler a utilizar
La función básica de un crawler es la exploración y extracción de información de un sitio web. En este caso fue la extracción de toda la información de un personaje y la información de otros enlaces que tengan relación con dicho personaje.
Para identificar cuál crawler ofrecía mayor información acorde a las necesidades del aplicativo, se realizaron pruebas con los incluidos en la tabla 7, identificando las características principales. Como resultado de esta exploración se determinó que el componente de software “Uru”, presentaba las funcionalidades necesarias para la integración con el aplicativo.
Nombre Descripción Código libre
Cumple Lenguaje
wikipedia-crawler Únicamente realiza la extracción de enlaces relacionados a una página inicial ingresada por el usuario de Wikipedia [64].
Si No Py thon
wiki-crawler Realiza una búsqueda en Wikipedia a partir de un término y descarga todas las páginas relacionadas con el término ingresado. Solo descarga el título y descripción de cada página encontrada [65].
Si No Jav ascript
Wiki_crawler Únicamente busca otros términos relacionados con una palabra ingresada por el usuario [66].
Si No Py thon
web crawler Solo busca enlaces relacionados con un criterio según términos de búsqueda ingresados por el usuario, no muestra relación cuáles f ueron los
Si No Jav a Script
36
enlaces “semilla” (donde se comienza la iteración) [67]
Httrack Descarga todo el contenido HTML de la página web, sin embargo para obtener cierto dato de la página es necesario la implementación de un Scrapy [61]
Si No .Net
Uru Extrae nombres, f echa de nacimiento, religión, residencia, ocupación, partido político, entre otros. Uru extrae todo el contenido de la página de Wikipedia que generalmente contiene inf ormación más detallada de la persona como su biografía, f amilia, logros alcanzados en su ocupación, obras, entre otros [62].
Si Si Py thon
Tab la 7 Comparación de crawlers (Diseño propio).
Uru es un componente de software construido en Python que se encarga de recolectar información personal, y contenido en general a partir de páginas en español de Wikipedia relacionadas con personas. Dentro de la información general que extrae el crawler está: nombres, fecha de nacimiento, religión, residencia, ocupación, partido político, entre otros [62].
7.2.1.1.3. Integración del crawler en el aplicativo
Luego de definir el crawler se realiza el proceso de integración de dicho componente al aplicativo web. Uru extrae todo el contenido de la página de Wikipedia que generalmente contiene información detallada de la persona como su biografía, familia, logros alcanzados en su ocupación, obras, entre otros. En la ilustración 3 se encuentra un ejemplo de la información que puede ser extraída por el crawler Uru y del personaje “Juan Manuel Santos Calderón” presidente de Colombia para el periodo 2014-2018, en dicha figura aparece un fragmento de información básica del personaje.
"URL": "https://es.wikipedia.org/wiki/Juan_Manuel_Santos", "Información personal": {
"URL": "https://es.wikipedia.org/wiki/Iglesia_cat%C3%B3lica", "title": "Iglesia católica"
},
"Partido político": [ {
"URL": "https://es.wikipedia.org/wiki/Partido_Social_de_Unidad_Nacional", "title": " Partido Social de Unidad Nacional"
37 } ], "Residencia": [ { "URL": " https://es.wikipedia.org/wiki/Casa_de_Nari%C3%B1o", "title": " Casa de Nariño"
} ]
Ilustración 3 Fragm ento de inform ación extractada por el crawler (Diseño propio). 7.2.1.1.4. Cargue de información del crawler
La información que se extrae del crawler es semiestructurada en formato JSON, por lo que fue necesario incluir un motor de bases de datos compatible con este tipo información. MongoDB es una base de datos NoSQL orientada a documentos de tipo BSON (JSON Binario) la cual proporciona alto rendimiento, alta disponibilidad y escalabilidad. Con el fin de guardar toda la información en bruto obtenida por el crawler, se determinó el uso de esta base de datos para llevar registro de los personajes que han sido procesados.
El crawler siempre extrae el nombre y la URL de la página como identificador del personaje. El resto de la información es opcional, es decir que no siempre se encuentra en todos los personajes extractados por el crawler. En la ilustración 4 se encuentra un modelo general de la colección de MongoDB implementada para el aplicativo.
38
Ilustración 4 Modelo de datos colección de MongoDB (Diseño propio). 7.2.1.1.5. Construcción servicio socket
Para la comunicación entre Python y Node.js se implementó un servicio creado en Python a través del socket que permite enviar y recibir información en tiempo real. Para la implementación del socket se utilizó SocketIO [68] que es una tecnología implementada en JavaScript la cual crea canales bidireccionales en tiempo real basados en eventos de emisión y recepción brindando rapidez y confiabilidad de transmisión de información. Por otro lado flask-socketio [69] es un componente que permite el montaje del socket en Python donde una aplicación del lado cliente (JavaScript, Java, C++, Swift o cualquier cliente compatible) puede establecer una conexión al socket web.
7.2.1.2. Tareas de ingeniería
En la tabla 8 se encuentra la lista de tareas de ingeniería que se realizaron para la primera iteración. La descripción de cada tarea de ingeniería se puede encontrar en el Anexo No 1.
39
Tarea
Historia de
usuario Nombre Estado
1 1 Integrar librería “Wikipedia API” Rechazada 2 1 Integrar librería “WPTools” Rechazada
3 2 Búsqueda de crawlers Aceptada
4 3 Integración del crawler Aceptada
5 3 Adaptac ión de la información obtenida del crawler Aceptada 6 4 Insertar información de personajes Aceptada 7 4 Consultar información de personajes Aceptada 8 5 Construir servicio básico del socket Aceptada
Tab la 8 Tareas de ingeniería de la primera iteración.
El desarrollo de las tareas de ingeniería para la primera iteración dio como resultado:
7.2.1.2.1. Integración librería “Wikipedia API” y “WPTools”
Aunque las dos primeras integraciones de las librerías de Python fueron rechazadas, estas tareas de ingeniería sirvieron para explorar e identificar los datos, el tiempo de respuesta y la disponibilidad de la información solicitados por el sistema. Igualmente, sirvieron para identificar que era necesario extraer información de las personas relacionadas en la página de Wikipedia del personaje, por lo que se decidió que era necesario la integración de un crawler.
7.2.1.2.2. Búsqueda de crawlers
La definición del crawler implicó la búsqueda de varios componentes de software disponibles que permitieran las extracciones de información de Wikipedia. Uru es el componente de software seleccionado para la integración con el aplicativo web que cumple con una de las especificaciones necesarias para el desarrollo del sistema.
7.2.1.2.3. Integración del Crawler
La integración del crawler implicó el montaje de los componentes de software del crawler Uru en el aplicativo web que se ve reflejados en el diagrama de componentes de la Ilustración 5, donde se describe los distintos componentes del crawler presentes en el aplicativo web. En la capa de negocio se encuentra el componente que se encarga de extraer la información de Wikipedia y el componente que envía la información extraída a la capa de presentación. El componente de la capa de presentación se encarga de visualizar los personajes que han sido procesados.
40
Ilustración 5 Diagrama de componentes integración del crawler de Uru (Diseño
propio).
7.2.1.2.4. Adaptación de la información obtenida del crawler
Para obtener la información relacionada al personaje al crawler Uru se le debe ingresar como parámetro una URL con la que se obtiene un conjunto de datos de la página de Wikipedia en la que se encuentran:
Nombres. Cónyuge(s) Padre(s) Hijo(s) Cargo(s) Educación Religión.
Fecha y lugar de nacimiento
Residencia
Ocupación
41
7.2.1.2.5. Inserción y consulta de información de los personajes
Cuando el aplicativo obtiene la información del personaje inserta un documento en una colección en MongoDB. La información almacenada en MongoDB se puede gestionar a través de un componente en software construido en el aplicativo web. Dicho componente permite entre otras funciones filtrar a través de la URL y el nombre.
7.2.1.2.6. Construcción servicio básico del socket
El socket se implementa con una dirección IP y un puerto por donde se comunicará Python y Node.js. Este montaje permite que en las siguientes iteraciones se pueda construir los servicios que requiere el sistema. El montaje del servicio crea canales los cuales envían información entre el lado cliente y el lado servidor. En la ilustración 6 se incluye un diagrama de la estructura del socket implementado. En este caso el lado cliente es Node.js y el lado servidor es Python donde ambos pueden enviar y recibir información de acuerdo con sus respectivos flujos de trabajo.
42
7.2.1.3. Pruebas de aceptación
La lista de pruebas de aceptación que se realizaron para cada una de las historias de usuario se encuentra en la Tabla 9. Cada prueba de aceptación se realiza de acuerdo con las diferentes condiciones y pasos descritos en el Anexo No 1.
Prueba
Historia de
usuario Nombre Estado
1 1 Extraer información de Wikipedia. Rechazada 2 2 Extraer información a través crawler URU Aceptada
3 3
Registrar información de personajes en la base de datos
MongoDB Aceptada
4 4 Consultar información de personajes Aceptada 5 5 Env ío de información a través del socket Aceptada
Tab la 9 Prueb as de aceptación de la prim era iteración 7.2.2. Segunda iteración
El objetivo para esta iteración es la recolección de ayudas léxicas para alimentar la ontología. Algunas de las tareas que se realizan son: la recolección de categorías y sinónimos almacenados en archivos de extensión JSON. Para la segunda iteración aparecen 3 nuevas historias usuario y una historia que se extendió de la primera iteración.
7.2.2.1. Historias de usuario
El resumen de las historias de usuario definidas para la segunda iteración se encuentra en la tabla 10. Toda la especificación de cada una de las historias de usuario se encuentra en el Anexo No 1.
43
Historias Nombre Descripción Estado
6
Controlar las categorías de búsqueda de personajes
Con el f in de delimitar los resultados de bú squeda que se presentaran al usuario se deben cargar las categorías de Wikipedia que tenga relación con el
gobierno colombiano Aceptada
7
Cargar sinónimos de términos generales
Wikipedia al ser una enciclopedia libre en la que múltiples usuarios interactúan, existen una gran multiplicidad de términos que hacen ref erencia a la misma inf ormación, de esta manera debe existir un
mecanismo que identif ique sinónimos. Aceptada
8 Def inir estructura de datos
La inf ormación almacenada en la base de datos orientada a grafos debe estar estructurada según un modelo de datos previamente diseñado, esto tiene el f in de que independiente de la fuente de información el almacenamiento se realizará sobre los nodos y
relaciones prev iamente diseñados. Aceptada
9
Carga de conocimiento en la ontología
Para mejorar la búsqueda de relaciones entre personajes es necesario ingresar conocimiento
acerca de la estructura política colombiana. Aprobada Tab la 10 Historias de usuario de la segunda iteración.
7.2.2.1.1. Control de categorías de búsqueda de personajes
Para la búsqueda de los personajes disponibles en Wikipedia se utilizó la librería de Python Wikipedia 1.4.0 [70], la cual tiene un método que permite obtener los enlaces de las páginas que estén relacionados con un criterio de búsqueda. Al realizar un análisis de los resultados se notó que no todos los enlaces corresponden a páginas de personas y no todas las páginas de personas se deberían dar como sugerencia al usuario dado que se busca que la información de la página este enfocada a personajes del entorno público de la política colombiana. Sin embargo, cada página de Wikipedia se encuentra asociada a un conjunto de categorías o subcategorías. Por lo tanto, el aplicativo selecciona las categorías de Wikipedia para realizar filtros y mostrar al usuario solamente los resultados de búsqueda que cumplan con el objetivo del prototipo.
Para la historia de usuario 5 se realiza una búsqueda de las categorías de Wikipedia donde se encontraron 134 categorías y subcategorías que hacen parte del campo de la política en Colombia en el idioma en español. Las categorías permiten al sistema delimitar la búsqueda de personajes de Wikipedia y restringen los tipos de páginas y contenido no hacen parte de dichas categorías. Para la extracción de las categorías que van a ser incluidas posteriormente dentro del sistema se utiliza un componente de software construido en Python que se encarga de buscar todas las categorías hijas o subcategorías de una categoría general. En la ilustración 7 se
44
encuentra una porción muy pequeña de la estructura en forma de grafo de las categorías de Wikipedia, los óvalos son las categorías y los rectángulos las páginas.
Ilustración 7 Porción del grafo de categorías de Wikipedia (Diseño propio).
En la ilustración 8 se encuentra el pseudocódigo del componente que extrae las categorías de Wikipedia. Su función principal es ingresar una categoría padre y por medio de una solicitud al API de wikimedia [71] busca las categorías hijas o subcategorías, las añade a una lista con la que realiza la búsqueda recursiva y controla las categorías ya iteradas. Cuando el proceso ha finalizado el componente de software crea un archivo de extensión JSON con las categorías que fueron encontradas.
Ilustración 8 Pseudocódigo de com ponente que extrae categorías (Diseño propio). 7.2.2.1.2. Cargar sinónimos de términos generales
Para esta historia de usuario se identificó que Wikipedia no tiene un estándar en la información de los personajes. Es decir, los datos se pueden referir a una misma
45
información para todos los personajes, pero puede encontrarse esta información con distintos términos. Por ejemplo, cuando se quiere obtener la información con respecto a la educación obtenida por el personaje podemos encontrar términos tales como: educación, alma mater, universidad, institución, facultad, escuela, etc. En general, estas palabras o frases se pueden encerrar en un solo concepto que puede ser llamado “Educación” donde permite identificar el tipo de información que está procesando el sistema. El proceso anterior permitió crear un compendio de conceptos con sus sinónimos en español para lograr estandarizar la información recolectada de Wikipedia.
El ejemplo anterior de la educación cursada por un personaje, se puede suponer que un personaje estudia o estudió en una institución por un periodo de tiempo para obtener un pregrado, posgrado, curso, diplomado, etc. El personaje es un nodo de tipo persona y la institución educativa se puede definir como un nodo de tipo institución u organización. Para conectar los dos nodos se define la relación con la información que une ambos nodos, en este caso la información de la relación es el periodo de tiempo y la actividad que realizó el personaje en dicha institución. En resumen, todos los términos relacionados a los personajes se pueden generalizar en conceptos propios del sistema y asociar a nodos y relaciones que se encargan de unir toda la información que se pueda extraer de Wikipedia. En la Ilustración 9 se encuentra un ejemplo de cómo funciona todo el proceso de asociación de términos con los nodos y relaciones.
Ilustración 9 Proceso de generalización de térm inos a nodos (Diseño propio)
Para la recolección de sinónimos se utiliza un componente de software que se encarga de conectarse e ingresar términos al API de “Word Reference”, retornando una lista de sinónimos que son agregados a un archivo de extensión JSON. El
46
proceso de generalizar el conjunto de sinónimos obtenidos en un concepto se realiza de forma manual con el fin de luego lograr asociar el concepto con un tipo de nodo o un tipo de relación dentro de la ontología. En la Ilustración 9 se encuentra el pseudocódigo del componente de software que se encarga de extraer sinónimos.
Ilustración 10 Pseudocódigo de com ponente que extrae sinónim os (Diseño propio) 7.2.2.1.3. Definición de estructura de datos
Con el fin de manejar las categorías de búsqueda, los sinónimos y términos generales, así como el modelo de datos (Ver Ilustración 14), se definió el manejo de una ontología que permita acceder a esta información y controlar los procesos de la aplicación. Se definió que la ontología debería ser almacenada en una base de datos en memoria dada la velocidad que ofrecen en comparación con las bases de datos en disco por lo que se escogió el sistema manejador de base de datos REDIS.
7.2.2.1.4. Carga de conocimiento en la ontología
Con el fin de detectar las relaciones laborales entre los personajes, fue necesario ingresar en la ontología la organización del gobierno colombiano para reconocer qué personajes pertenecen a la misma organización gubernamental, así mismo