Introducción

Hace tiempo ya que soy un usuario registrado en Flickr y, desde el año 2000, estoy muy interesado en la Web Semántica y en el proyecto FOAF para la descripción de personas.

Una de las cosas que mas me gustaría hacer es poder buscar mis fotos almacenadas en Flickr de un modo sencillo, y sin tener que recordar que título le puse, o que etiquetas, etc. O una foto donde esten varias personas, en un determinado lugar, a una determinada hora. Flickr no tiene una interfaz de búsqueda como la que necesito, pero si proveé la información con la cual puedo desarrollarla.

Los ejemplos se encuentran todos en Turtle, otra sintaxis de RDF mucho mas comoda.

Representando gente en la Web Semántica

Dado que principalmente mis fotos son acerca de personas, lo primero que debo hacer es representarlos a todos ellos en un formato adecuado para este proposito. Por suerte no hay que creerlo, dado que ya existe FOAF. Para ello identificaré a las personas por medio de su e-mail, pero como los spamers estarian muy contentos de poner la dirección publicamente disponible, vamos a complicarles las cosas y las codificaremos. Para mayor información al respecto, los remito a mi tutorial sobre FOAF donde cuento algo al respecto.

_:p1 a foaf:Person;
    foaf:mbox_sha1sum "7a9ac80b951378d4a82ed9eab2bb8fffd449b315"
    foaf:nick "inkel"
    .
    
_:p2 a foaf:Person;
    foaf:mbox_sha1sum "8702b4fa06455608159a8ada349f7924b9208386"
    foaf:nick "Peque"
    .
    
_:p3 a foaf:Person;
    foaf:mbox_sha1sum "556066e2c00f75e0703686b16949e150d710da14"
    foaf:nick "Mer"
    .

Representando fotos

FOAF también nos brinda la clase Image que nos permite indicar que un recurso es una imagén (una foto en este caso). Flickr almacena las fotos a varios tamaños. Esto nos permite, con los datos de la foto, construir la URL de la imagen original y su thumbnail. Tambien puedo saber que tag tiene cada imagén, que constituyen la base de mi respuesta.

<http://photos23.flickr.com/31214810_b9ab6ae39d_o.jpg> a foaf:Image ;
    foaf:thumbnail <http://photos23.flickr.com/31214810_b9ab6ae39d_t.jpg> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/inkel/> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/petos/> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/2005/>
    .

<http://flickr.com/photos/51722096@N00/tags/inkel/> a flickr:Tag ;
    rdfs:comment "inkel" ;
    rdfs:label "inkel"
    .
    
<http://flickr.com/photos/51722096@N00/tags/2005/> a flickr:Tag ;
    rdfs:comment "Foto tomada en el año 2005" ;
    rdfs:label "2005"
    .
    
<http://flickr.com/photos/51722096@N00/tags/petos/> a flickr:Tag ;
    rdfs:comment "Foto tomada en la casa de Peto y Guada" ;
    rdfs:label "Peto's"
    .

Con esto ya tengo mas que suficiente para relacionar fotos con sus etiquetas. Ahora llega una de las partes mas criticas, que es indicar la correspondencia entre tags y personas:

_:p1 a foaf:Person;
    flickr:tag <http://flickr.com/photos/51722096@N00/tags/inkel/> ;
    foaf:nick "inkel" ;
    foaf:mbox_sha1sum "7a9ac80b951378d4a82ed9eab2bb8fffd449b315"
    .

Por supuesto que no necesariamente tienen que ser personas, puede ser casi cualquier tipo de cosas. De hecho, los predicados que realizan la unión entre foto y objeto retratado, foaf:depicts y foaf:depiction, tienen como rango y dominio a owl:Thing respectivamente, por lo tanto cualquier cosa puede ser descripta.

Más metadatos

Ahora agregamos más metadatos a la imagén, como el título, la descripción, la fecha en que fué tomadá y publicada la foto, y los tags como keywords:

<http://photos23.flickr.com/31214810_b9ab6ae39d_o.jpg> a foaf:Image ;
    foaf:thumbnail <http://photos23.flickr.com/31214810_b9ab6ae39d_t.jpg> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/inkel/> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/petos/> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/2005/> ;
    dc:title "Tadaaaaaaa" ;
    dc:description "Con ustedes........ yo" ;
    dc:keyword "2005" ;
    dc:keyword "petos" ;
    dc:keyword "inkel" ;
    dcterms:issued "2004-08-22T00:12:57" ;
    dc:date "2004-42-23T21:09:25"
    .

Resultado final

Una vez ejecutados los scripts el sistema agrega algunos datos mas, que en ejemplo estan marcados en negrita:

<http://photos23.flickr.com/31214810_b9ab6ae39d_o.jpg> a foaf:Image ;
    foaf:thumbnail <http://photos23.flickr.com/31214810_b9ab6ae39d_t.jpg> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/inkel/> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/petos/> ;
    flickr:tagged <http://flickr.com/photos/51722096@N00/tags/2005/> ;
    dc:title "Tadaaaaaaa" ;
    dc:description "Con ustedes........ yo" ;
    dc:keyword "2005" ;
    dc:keyword "petos" ;
    dc:keyword "inkel" ;
    foaf:depicts _:p1
    .

_:p1 a foaf:Person;
    flickr:tag <http://flickr.com/photos/51722096@N00/tags/inkel/> ;
    foaf:nick "inkel" ;
    foaf:mbox_sha1sum "7a9ac80b951378d4a82ed9eab2bb8fffd449b315" ;
    foaf:depiction <http://photos23.flickr.com/31214810_b9ab6ae39d_o.jpg>
    .

Y ahora si, solo me queda realizar consultas sobre mi repositorio RDF. Eso será motivo de otro documento!

Scripts

Mi lenguaje favorito desde hace unos años es Python, el cual tiene una excelente libreria para procesar RDF: RDFLib, desarrollada por Daniel "eikeon" Krech. La versión utilizada es la 2.2.2.

Para la conexión a Flickr utilicé la libreria flickr.py de James Clarke, la cual tuve que emparchar. Para poder utilizarla deberán conseguir un API KEY.

Los siguientes son los archivos que deben bajarse, además de las librerias:

namespaces.py
Archivo de definiciones de diferentes namespaces.
tags2rdf.py
Obtiene todas las etiquetas de un usuario, para facilitar el proceso de asociación de etiquetas a cosas.
photo2rdf.py
Obtiene toda la información de las imagenes pasadas como parametro.
smusher.py
Lee todos los archivos .rdf que se encuentren en la carpeta y agrega las 3-uplas RDF necesarias.

Conclusiones

Esta sencilla herramienta muestra algunas de las posibilidades de la web semántica, y como nos beneficiaremos de ella. Se pueden agregar aún mas datos, todo depende de la creatividad de cada uno. Por favor enviar sus comentarios a inkel-rdf@f14web.com.ar, indicando en el asunto [flickr2foaf.es]

TODO

Relacionados