Ad verba per numeros


Friday, April 11, 2008, 11:02 AM
Las categorías de la Wikipedia permiten asociar artículos similares, a diferencia de otros sistemas las categorías de la Wikipedia no forman un árbol, es decir, no dan lugar a una estructura jerárquica y un mismo artículo puede pertenecer a varias categorías que, individualmente, formarían parte de árboles relacionadas con diferentes facetas del artículo (p.ej. en el caso de una persona podría pertenecer a categorías relativas a sus inquietudes ideológicas, pertenencia a organizaciones académicas o influencias literarias). Por otro lado, aunque existen una serie de guías proporcionadas por los editores que tienen como objetivo que el sistema de categorías no degenere lo cierto es que se trata de un sistema desarrollado por los usuarios de la Wikipedia; en consecuencia no es tan "estricto" y está tan "organizado" como otros sistemas de categorización.

Wordnet es un sistema que organiza semánticamente el léxico inglés de tal manera que es posible encontrar sinónimos de términos para sus distintos significados así como establecer relaciones jerárquicas para los mismos (p.ej. dado el término painter es posible derivar que es un tipo de artista (artist) y, en consecuencia, un creador (creator) y, a su vez, una persona (person).

Existen diversas iniciativas que han vinculado las categorías de la Wikipedia con Wordnet (p.ej. YAGO), sin embargo, aunque este proyecto tendría ciertas similitudes con dichas iniciativas tiene unos objetivos más modestos. Básicamente, lo que se pretende es asociar a cada categoría "wikipédica" (de un subconjunto dado) información proveniente de Wordnet para facilitar la organización de la información de los artículos categorizados; posteriormente, dicha información debería facilitar, al menos, la identificación de artículos relativos a personas, grupos de personas, artefactos, eventos y lugares.

Este proyecto está bastante relacionado con la oferta titulada "Visualizing Picasso - Visualización gráfica y exploración de redes asociativas". En este proyecto se utilizarán tecnologías como: extracción de términos (servicio web de Yahoo) y etiquetado Part-Of-Speech (probablemente mediante LingPipe).

El objetivo del proyecto aquí descrito es desarrollar prototipos que plasmen las ideas anteriores, generando un conjunto de datos de tamaño relativamente pequeño pero útil e ilustrativo. Producir documentación de calidad que describa la/s técnica/s empleadas/desarrolladas y permita su replicación futura a mayor escala.

La idea es utilizar diversas herramientas ya disponibles (como Wordnet, LingPipe y varios servicios web) para poder hacer cosas como lo siguiente:

  1. Saber que un Modern painter es un painter y, en consecuencia, un artist / creative person y, por tanto, un creator y, entonces, un person / individual / human y, en consecuencia, un organism, ...
    De este modo podrían tenerse filtros más o menos específicos.
  2. Asociar a los artículos wikipédicos categorías excluyentes como "persona", "grupo de personas", "evento", "artefacto", etc.
    • Por ejemplo, saber que el artículo wikipédico Picasso se puede identificar con una persona (que resulta ser un creator, artista, pintor, pintor moderno, además de pintor español).
    • En cambio, Femme aux Bras Croisés es un artefacto, en concreto, una obra de arte y, para más señas, una pintura.
    • Por otro lado, Spanish Civil War es un evento, que involucró a grupos de personas, en acciones militares, en concreto una guerra y, además, civil.
¿Qué lenguaje de programación se utilizará? Prácticamente cualquier cosa; podría hacerse en Java o en un lenguaje de script. Los resultados, probablemente en XML y, tal vez, habría que desarrollar scripts que faciliten cargarlos en una base de datos SQL.

Esta Semana Santa preparé un pequeño prototipo que tiene como una tercera parte de la funcionalidad que me interesa. Dicho prototipo tiene 477 líneas (y muchas son comentarios y líneas en blanco). Este prototipo estará a disposición de los alumnos que trabajen en este proyecto a fin de explicarles algunas cosas que tendrían que hacer y cómo hacerlas (o cómo no hacerlas).

Ahora una explicación un poco más larga:

La aplicación a desarrollar trabajaría siguiendo una especie de "pipeline" de tal manera que en distintos momentos se deberían realizar ciertos trabajos con los datos. Intentaré explicarlo con cierto detalle pero sin que resulte demasiado abrumador.

Para empezar se trabajaría con versiones HTML de artículos de la Wikipedia, de hecho, con un subconjunto que ya está elaborado y disponible aquí.

En una segunda versión del proyecto sería mucho mejor trabajar con una base de datos pero, para este proyecto, eso no es importante.

Uno de los artículos que se encuentra en dicho volcado es éste. Dicho artículo pertenece a las siguientes categorías:

1881 births | 1973 deaths | Andalusian people | Cubism | French Communist Party members | Modern painters | Pablo Picasso | Spanish atheists | Spanish communists | Spanish painters | Spanish people of the Spanish Civil War | Spanish potters | Spanish sculptors

¡IMPORTANTE! La primera fase del pipeline consistiría entonces en obtener los nombres de todas las categorías asociadas con un artículo dado. Lo ideal sería elaborar un script que recibiese como parámetro una ruta y generase como salida un archivo (quizás en XML).

Una vez se conocen las categorías habría que asociar a cada una de ellas la metainformación que está disponible en Wordnet. Para los siguientes ejemplos voy a centrarme únicamente en dos categorías: Spanish people of the Spanish Civil War y Spanish painters.

Comencemos con la primera, es un nombre bastante largo y habría que procesarlo de algún modo antes de consultar Wordnet puesto que no nos serviría de mucho consultar por separado los términos spanish, people, of, the, civil y war; eso sin olvidar que of y the no es que resulten particularmente interesantes.

¡IMPORTANTE! Esta sería la segunda fase y aquí entraría en juego el siguiente servicio web de Yahoo. Se trata de un servicio de extracción de términos que, lamentablemente, sólo funciona de manera aceptable en inglés. Si quieres ver qué resultados proporciona sin necesidad de programar nada puedes utilizar http://yq.search.yahoo.com/

Así, para Spanish people of the Spanish Civil War obtendríamos los siguientes términos multipalabra: spanish civil war, spanish people. Para Spanish painters se obtendría spanish painters.

En resumen, en la fase 2 se asociaría a cada nombre de categoría uno o más términos multipalabra obtenidos mediante el servicio web de Yahoo. Ni que decir tiene que no todo será tan sencillo como en estos ejemplos pero los problemas que surjan en esta fase (como en cualquier otra) se resolverían dentro de ella sin necesidad de afectar a ninguna otra tarea.

¿Qué se hará con los términos multipalabra obtenidos?

En primer lugar se intentará comprobar si aparecen "tal cual" en Wordnet. Para hacer pruebas podéis utilizar esta versión online. No es la "oficial" pero me gusta más su interfaz. También podéis descargar una versión para Windows (en realidad DOS).

Así pues, habría que consultar Wordnet con spanish people, spanish civil war y spanish painters.

Para spanish people ofrece un resultado: Spanish, Spanish people, the people of Spain, puede resultar interesante almacenar estas definiciones. Sin embargo, lo que más me interesa es conocer la jerarquía semántica de la palabra. Para ello nos interesa el enlace (en esta explicación, en la aplicación seguramente usases un comando o bien una versión en SQL) spanish people is a kind of, si lo pulsas verás que:

Spanish, Spanish people
=> nation, land, country, a people
=> people
=> group, grouping

Es decir, spanish people es una nación, una tierra, un país, un pueblo (una gente), un grupo.

Para spanish civil war también hay información: Spanish Civil War, civil war in Spain in which General Franco succeeded in overthrowing the republican government, during the war Spain became a battleground for fascists and socialists from all countries, 1936-1939 y también hay información is a kind of:

Spanish Civil War
=> civil war
=> war, warfare
=> military action, action
=> group action
=> act, human action, human activity
=> event

Con spanish painters no hay la misma suerte puesto que no aparece en Wordnet. Así pues necesitamos algo más:

¡IMPORTANTE! La tercera fase (que no se aplicaría como puedes ver en todos los casos) requiere procesar los términos multipalabra con lo que se denomina un POS tagger. POS significa Part-Of-Speech y, básicamente, nos etiqueta si una palabra es un nombre, un adjetivo, un verbo, etc. Lo mejor sería utilizar LingPipe (hay documentación sobre uso de un proyecto anterior), para esta explicación puedes probarlo online aquí.

Si introducimos spanish painters. (¡ojo! el punto "." es importante) nos produciría la siguiente salida:

<output>
<s i="0">
<token pos="jj">spanish</token>
<token pos="nns">painters</token>
<token pos=".">.</token>
</s>
</output>

¿Qué significa jj, nns y otras etiquetas POS que aparecen en este XML? En este caso se ha utilizado el denominado Brown Corpus y JJ significa adjective y NNS plural noun. Los adjetivos son, obviamente, interesantes pero por las pruebas que he hecho creo que lo más razonable es limitarse a los nombres. Eso quiere decir que para la categoría Spanish painters hemos obtenido (mediante Yahoo) el término multipalabra spanish painters y mediante LingPipe sabemos que se le puede asociar a dicha categoría el adjetivo spanish y que la información de Wordnet la encontraremos para el nombre painters.

Así, al introducir painters (sí, ya sé que está en plural) en Wordnet encontramos:

1. an artist who paints
2. a worker who is employed to cover objects with paint
3. a line that is attached to the bow of a boat and used for tying up (as when docking or towing)
4. cougar, puma, catamount, mountain lion, panther, Felis concolor, large American feline resembling a lion

Como se puede ver, painter tiene 4 sentidos diferentes, ¿cuál es el que nos interesa? Como seres humanos somos capaces de identificar el primero con Picasso pero la cuestión es cómo hacerlo automáticamente. Para esto tengo una serie de ideas bastante claras que sé que pueden ser bastante robustas pero creo que eso lo dejaremos para más adelante.

En resumen, hasta el momento he expuesto las 3 primeras fases del pipeline y las tecnologías a utilizar; espero que te haya quedado un poco más clara la idea aunque, claro está, el conseguir "pegar" unas cosas con otras ya será otra cuestión. El servicio web de Yahoo es muy sencillo, LingPipe está escrito en Java y ya hay un precedente de uso en la EUITIO. Casi lo que más me preocupa es Wordnet aunque hay varios proyectos relacionados que podrían resultar útiles para "consumirla" vía programática con facilidad.



Back Next