CouchDB

Necesitaras tener o una instalación local en tu computador de CouchDB o una cuenta (gratis) en Cloudant para repetir los ejemplos aquí abajo.

  1. Prepara un CouchDB local
  2. Instala CouchDB desde http://couchdb.apache.org/
  3. Verifica que lograste instalar e arrancar CouchdB

Hay mucho mas que decir sobre CouchDB por supuesto. Por suerte la documentación es excelente.

R-CouchDB

Hay dos paquetes disponible en CRAN para conectar con CouchDB, y uno en Github que aun no esta publicado. El que escojí es preferencia personal, si ves una razón para mover el proyecto a otro paquete nos cuentas.

library(couchDB) # usa la version en mi rama en https://github.com/fvd/RcouchDB
conn <- couch_http_connection(host = "localhost")
couch_ping(conn)
## Response [http://localhost:5984/]
##   Date: 2016-06-28 20:52
##   Status: 200
##   Content-Type: application/json
##   Size: 151 B
## {"couchdb":"Welcome","uuid":"ac10c6c0eea8caf2a3dfcaabb42d46b9","version"...

Listo, si puedes hacer un ping a tu base de datos significa que tienes todo funcionando localmente. Lo que nos lleva a una herramienta nueva escrita por David Leonardo Gutierrez.

PDFCurdler

Para trabajar de una forma sensata con los PDF’s vamos a tener que separarlos en texto e imágenes. David Leonardo escribió una herramienta en .net para hacerlo la cual llamamos PDFCurdler. En el momento necesitarás usarlo en Windows y correrlo desde Visual Studio. Si necesitas más instrucciones avisanos para expandir el “leeme” del proyecto en github.

PDFcurdler lee un documento PDF y crea una carpeta con el nombre del documento y dos sub-carpetas “texto” y “Imagenes”. Para cada uno queremos crear un documento en Couchdb con el texto y con las imagenes como “attachment” binario. Esto nos rinde una carpeta con todos los documentos, que ahora podemos cargar uno por uno a CouchDB.

Despues de pasar los PDF con PDFCurdler vas a tener una carpeta con el contenido de acuerdo a la siguiente estructura (esto va a cambiar, mira los tiquetes abiertos en github):

nombre-documento
    |_ Imagenes
             |_ 1.jpg
             |_ n.jpg
    |_ Texto
          |_ text.txt

Esa estructra la vamos a usar para el siguiente paso.

Subir Actas a CouchDB

Ya probaste arriba que tu CouchDB arranco localmente. Obviamente también puedes crear una cuenta en Cloudant y usar un servicio en linea. Y con eso estas listo para crear una base de datos donde vas a guardar las actas:

couch_create_database(conn, "actas_dev")
## Response [http://localhost:5984/actas_dev]
##   Date: 2016-06-28 20:52
##   Status: 412
##   Content-Type: application/json
##   Size: 95 B
## {"error":"file_exists","reason":"The database could not be created, the ...

Y ahora pasamos el texto y las figuras a un documento en CouchDB con el nombre del archivo.

library(stringr)
# Puse las actas convertidas en una carpeta aparte
# (WD = Workding directory)
setwd("~/Documents/ActasTransparentes_WD/")

actas_convertidas <- list.dirs(full.names = TRUE)
texto_convertido <- str_subset(actas_convertidas, "Texto")
imagen_convertida <- str_subset(actas_convertidas, "Imagenes")

# Tenemos toda la informacion para subir el texto y las imagenes
sube_texto <- sapply(texto_convertido, function(x) {
  #file <- list.files(x, full.names = TRUE)  
  #message(readLines(file))
  doc_nombre <- str_split(x, "/")[[1]][3]
  doc_texto <- readLines(paste(x, "/text.txt", sep=""), encoding="UTF-8")
  # Ahora unimos todos las reglas en el vector doc_texto
  doc_texto <- paste(doc_texto, collapse="")
  doc_couchdb <- couch_new_object(list("texto"=doc_texto), database="actas_dev", key=doc_nombre)
  couch_store(conn, doc_couchdb)
  print(x)
})

sube_imagenes <- sapply(texto_convertido, function(x) {
  # TODO:
  # obten URL del documento (acta)
  # por cada imagen, subelo como attachment
})

El diseño ideal del documento esta aún abierto a discusion y empezamos con la forma mas simple para hacer una prueba de concepto. El resultado de arriba es un documento con un ID y un campo “texto” que contiene todo el texto del acta.

Cuéntanos!

Te funcionó hasta aquí? Encontraste errores? Visto como hacerlo mejor? Cuéntanos en la siguiente reunión.