Sunday, November 24, 2013

Referencias sobre papers que hablan de datamining.


La imagen me encanta resumen bien, muchas de las cosas que se ven muy amenudo en Datamining.

Organizando, decidí recopilar muchas de las cosas que tenía impresa inecesariamente, y reciclarlas : D
así que en este post colocaré artículos, papers, información impresa que me gustaría tener un registro de ella:

Papers:

"Discovery of interesting Usage Patterns from Web data"
 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.33.1543&rep=rep1&type=pdfData"
Interesante :O,  usan logs para analizar el comportamiento del usuario, es viejísimo el paper pero es
como el paper que es mencionado constantemente, también uno de los que escribió el paper es el
escritor del libro:
http://www.cse.msu.edu/~ptan/
Si quieres saber de Datamining y Web, es un buen punto para leer.

"The class imbalance problem in pattern classfication and learning"
http://marmota.dlsi.uji.es/WebBIB/papers/2007/1_GarciaTamida2007.pdf
Notas:
alternativas que se pueden realizar cuando está desbalanceado el conjunto de datos,  bien sea over o under sampling, medidas de ganancia empleada, soluciones a nivel del algoritmo, mejora con ensembles, no siempre compensar la clase desbalanceada ayuda a clasificar, es mejor tener la medida de ganancia de modelo generado por ensembles, curva ROC, precisión y recall.

Este artículo está bueno leer.
http://www.datasciencecentral.com/profiles/blogs/66-job-interview-questions-for-data-scientists

"Aprendizaje Automático: Algoritmos genéticos" 2004
Quintairos
Notas: Metaheuritica, tiene buen esquema de los pasos de un algoritmo genético y no es tan viejo.

"Data Preparation for Mining World Wide Web Browsing Patterns"
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.11.3835&rep=rep1&type=pdf
Notas:
Información sobre como procesar datos provenientes de la Web, medidas como lift, confianza, belief (creencia), conjunto de creencias, las creencias pueden ser generadas manualmente en base al dominio del conocimiento, siendo esto  No práctico.  El dominio del conocimiento puede ser usado para automáticamente crear evidencia sobre las creencias.
Cobertura/ Coverage:  es la medida de la fracción total del número de transacciones que contienen al menos un item del itemset.  count (A y B) / NT
Este paper propone un modelo basado en el soporte lógico.
Establece el criterio para medir el interes o lo interesante de un atributo. pudiendo ser:
objetivo: soporte, lift, confianza. subjetivo: novelty o unexpectedness.

Web Mining tiene los siguientes tipos de dominio de información:
  1. contenido
  2. estructura
  3. usabilidad
La meta es identificar a un conjunto de creencias y usar este conjunto como filtro para identificar reglas interesantes.

Fundamental en web mining es el descubrimiento del conocimiento, y alguna expectacion definida del conocimiento  (creencias)

belief utiliza un framework de lógica difusa (Baldwin's support logic) manejando multiples fuentes de evidencia. y busca reglas que no contradigan una creencia existente.

Define evidencia como cada pieza de información (regla, termino o medida).
cada creencia posee una escala de evidencia, o evidencia necesaria. y cada creencia tiene una cantidad de ignorancia acerca de la creencia. La evidencia se clasifica en: evidencia necesaria, evidencia posible.

Las evidencias son interesantes cuando:
las creencias entran en conflicto con la evidencia.
las creencias con evidencia de la fuente.

Clasificadores Basados en Reglas:
Ripper: analiza la ganancia de la información, el conjunto de datos más pequeños, como clasificación positiva y el resto como clasificación negativa.
Prims:  No toma en cuenta el tamaño de la clase, sino que a medida que va iterando va añadiendo atributos de la clase como condición por lo que tiende a sobreajustar los datos y para ello puede hacerse prunning en cada iteración  o prunning global.

Sobre Metaheuristica:

"Improving User Profiles for E-Commerce by Genetic Algorithms"

Paper Yi-Shin and Cyrus Shanabi
Notas: meciona diferentes tipos de sistema de recomendación, técnicas de análisis de datos.
técnicas de filtrado: content-based filtering, collaborative filtering.  Cada uno tiene sus puntos beneficios y sus puntos débiles. Cabe destacar que el sistema es susceptible en generar soluciones no adecuadas si el comportamiento del usuario no es consistente, en cuanto al flujo de su navegación. Y mencionan que no existe algún mecanismo de aprendizaje automático que pueda lidiar con  comportamientos inconsistentes.
El cromosoma será decodificado en un perfil del usuario.
La función fitness toma en cuenta dos factores, promedio de satisfacción de usuarios con la lista generada, y la lista de deseos estimada para el usuario, midiendo la similaridad entre estos dos factores, mientras más parecido mejor es la lista de deseos del usuario.

"A  Review of evolutionary Algorithms for E-Commmerce"
Paper Alex. A Freitas
Menciona varios papers que  tratan de algoritmos evolutivos y su aplicación para ecommerce, tiene una aplicación muy clara de programación genética con una estructura de datos de árboles. definiciones variasGA = algoritmo evolutivo, PG = programación genética. cada iteración es una generación, la función fitness filtra los individuos que estarán en la siguiente generación. La tasa de mutación, crossover definirá los cambios que se realizan sobre la población.


"Genetic Algorithms for credit card fraud detection"
SATVIK VATS, SURYA KANT DUBEY, NAVEEN KUMAR PANDEY


"Review on evolutionary algorithms in Datamining"
A. Freitas

"A review on evolutionary algorithms in Bayesian network learning and inference tasks"
A review on evolutionary algorithms in Bayesian network learning and inference tasks

"Integración de técnicas de Minería de datos y metaheurísticas en sitios de comercio electrónico"
Barragan Edgar, Giraldo Fabián Andres. 

Modelado de Tópicos.


Cosas que me gustaría tener como referencia sobre el Modelado de Tópicos.


Papers: 
"On Smoothing and Inference for Topic Models"
http://www.ics.uci.edu/~asuncion/pubs/UAI_09.pdf
Notas:
para el cálculo de la Probabilidad Apriori utilizan PLSA ó LDA.
para el cáculo de la Probabilidad Posteriori mencionan:  Gibbs sampling, Collapsed variational Bayesian Inference, Inference Variational Bayesian, Maxímo Likehood Estimation (ME), Maximo Posteriori Estimation.

"An Estimate of an Upper Bound for the Entropy of English "
http://acl.ldc.upenn.edu/J/J92/J92-1002.pdf
Notas:
La definición de entropía como medida sobre que tan bueno o no es un modelo, por su representación en bits. cuantos bits utiliza un modelo. bits/palabras, bits/trigrams, bits/bigrams.


"Probabilistic topic models"
http://www.cs.princeton.edu/~blei/papers/Blei2012.pdf
Notas:
Una revisión bien completa y que define de forma fácil cómo funciona el modelado de tópicos.


"Latent Dirichlet Allocation"
http://www.cs.princeton.edu/~blei/papers/BleiNgJordan2003.pdf
Notas:
¿Cuantos tópicos son apropiados?, ¿Cuantas iteraciones de muestreo son necesarias?, ¿Cómo puede ser optimizado?
Exchangeability: NO significa que las variables aleatorias son independientes e identicamente distribuidas. se le define como "condicionalmente independientes" e identicamente distribuidas.
La distribución conjunta de variables aleatoriaas es simple y calculada cn la probabilidad marginal ajustada a la distribución LDA.
Los Documentos son representados como una mezcla aleatoria de tópicos donde cada tópico es caracterizado por una distribución sobre palabras.
Para variar el alfa y beta ( utiliza Newton-Rapson) estos parametros influyen en la perplejidad del modelo.
Perplejidad es una métrica que mide que tan bueno es el modelo,
Si perplejidad es menor el modelo es mejor, tiende a ser más general, y se define que el modelo hace un mejor trabajo de comprensión de la data de prueba.
Si la perplejidad incrementa, se diría que desmejora. La perplejidad es una medida de la teoría de la información, Este es el paper que da base al software de modelado de tópicos Mallet.
LDA utiliza: Distribución de probabilidad conjunta observada y aleatoria.

Algunas definiciones, creo que es de la wikipedia, son anotaciones personales:

Gibbs Samplings: Es un algoritmo del tipo MCMC (Markov Chain Monte Carlo) que permite obtener una secuencia de observaciones. Donde sus valores son una distribución de probabilidad multivariada (es decir la unión de distribuciones e probabilidades diferentes de 2 o más variables) .
Esta secuencia puede ser usada para aproximar distribuciones que no siguen una distribución conocida sino que contiene partes de varias.

Gibbs Samplings es comúnmente usado en la estadística de inferencia, especialmente por la inferencia bayesiana. Es un algoritmo de resultados aleatorios por lo que en cada ejecución arroja diferentes resultados.
Gibbs Samplings genera una cadena de Markov donde cada elemento está relacionado con el inmediato siguiente, y no con el resto de eventos pasados. (ley de memoria distribución exponencial, La probabilidad de ocurrencia de eventos presentes o futuros no depende (eventos independientes) de los que hayan ocurrido en el pasado)
Gibbs para datos continuos --> se divide en carpetas (bin) y se utiliza ME (expectation maximization)
para datos discretos --> Maximun Posteriori. Mallet utiliza Gibbs Sampling por defecto, sin embago se puede modificar.
tf-idf,  valora palabras basado en cuan especial son ellas a un documento en particular con un gran corpus. LSA utiliza este score con una matriz de documentos y términos.  otra forma es a través del SVD (singular value descomposition) permite descubrir como una palabra se encuentra relacionada con la otra.
pLSA asume  que un documento es un conjunto de tópicos, más no de palabras (los tópicos son generados primeros que los documentos.).


Saturday, August 31, 2013

firefox y sus dependecias


Usar firefox es directamente relacionado
con usar gtk-engine-murrine y gtk-engines
si no quieres que te arroje
warnings al iniciar gtk (notes
temas de gtk, igual funciona pero
arroja un monton de warnings).

e que son

:(

También nuevas versiones son liberadas
con ciertas rarezas, cómo:

 GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed

existe desde el 2011, aún siguen reportandolo
sin embargo está en el repositorio upstream
como resuelto :-s

¿organizado  no?

si llego a conseguir como aplicar el path actualizaré acá. :P (entre tiempo, trabajo y univ..)

Friday, August 16, 2013

Inteligentes que no saben nadar.

Imágenes de la batería del teléfono luego de un divertido chapuzón en agua.
Podríamos decir era muy inteligente pero no sabía nadar :(

Q.E.P.D.



Sunday, August 11, 2013

Recuperación de fotos de una SD, o cualquier unidad de almacenamiento o disco duro.


A veces por varias razones se corrompe la tabla que almacena la dirección  física del archivo en la (SD/disco duro), y el nombre del archivo, dicho de forma simple. Entonces cuando lee nuevamente la unidad de (SD..) reconstruye esta tabla pero desde 0, sin los registros que poseía anteriormente, es decir las fotos anteriores del accidente. 

¡¡¡sin embargo las fotos están ahí!!! sólo que no se encuentran en esta tabla, que dice en que dirección están las fotos. Por eso dicen que si quieres borrar definitivamente algo, tienes que llenar el disco duro de 0, de resto es recuperable la información.

Recién ocurrió eso, y una herramienta a utilizar se llama photorec, viene en conjunto con el paquete testdisk en arch. En win también anda, y es realmente fácil de usar, "boton siguiente siguiente e install".

pacman -Sy extra/testdisk 

más o menos estos son los pasos:

1 - tiene que ser ejecutada con usuario privilegiado, en caso de que no sea así al menos debes tener privilegios a través de sudo.
2 - photorec 


Al inicio aparece esta pantalla en linux las particiones se ven de esa forma, en win lo veras que si C:/ o D:/ o F:/ .. lo cierto es que mi tarjeta SD es /dev/sdb de hecho trae una breve descripción Multi-card Generic, por si no estas seguro jeje. La otra partición es mi disco duro. ^.^ que ya se llenó :(





Luego eliges si buscar en todo el disco duro o una partición en particular, en este caso solo hay una, daría igual elegir arriba o abajo, pero en caso que tengan 9 particiones en el disco duro, se verían acá.


Acá le especificas, el tipo de formato donde se almacenará el contenido recuperado de la SD/Disco.

Si estas en windows: eliges other (FAT/NTFS/) y si usas cosas raras RaiserFS.. pero no es lo usual. En linux eliges el formato de archivos ext2/ext3 que por defecto es el que usa.

Acá le especificas que quieres hacer, si quieres extraer TODO lo que tiene la SD seleccionas la opción [ Whole ] sí solo quieres los archivos que no están en la tabla mencionada arriba. [ Free ]  Y Listo.


shift + c cuando ya hayas seleccionado el directorio.

Algo así mientras recupera los archivos y cuando finaliza esto,  luego seleccionar
[Quit] , [Quit] [Quit]

:)
La fotografía es un lindo cuadro hecho por la artista Larissa está basado en otro cuadro que no recuerdo pero quedo lindo :) 

Saturday, August 10, 2013

Mallet How to.



En linux es realmente sencillo, sólo descargar y exportar la variable de ambiente en la terminal/línea de comando/consola. En Win igual sólo que hay que saber como editar las variables de entorno.

export MALLET_HOME = 'ruta/donde/esta/mallet'

En general Mallet viene con stopwords definidas para inglés y alemán. Se encuentran en el directorio stoplists. En caso de añadir nuevas stopwords colocarlas en este directorio por llevar un orden, realmente se pueden colocar en cualquier sitio ya que luego en el comando se le añade la ruta del listado de palabras que se desean eliminar.

sample-data: directorio con data de ejemplo.
bin: directorio con el binario, a usar para ejecutar mallet.
test:
src: se puede ver el código de mallet en su mayoría se reduce a contar palabras, el 90 % del tiempo esto es lo que se hace cuando nos referimos a text mining.

Yo creé un directorio llamado data: ahí están todos los txts, de los cuales quiero extraer los tópicos, Mallet también lee el formato csv, donde la primera columna es el título y el resto es el contenido o texto que quiero analizar. cada línea sería un texto o documento diferente.

cosas que no vamos a tocar, ni mirar:
pom.xml, build.xml, Makefile : archivo de configuración de Maven.
lib: librerías para que funcione mallet, un monton de archivos jar.
dist: Archivo jar que contiene la funcionalidad de mallet.
class: archivos binarios ya compilados de Java.



Obtener el formato mallet desde un archivo csv:

./bin/mallet  import-file --input allmyfavorites.csv --output myfavorites.mallet

Obtener el formato Mallet de aproximadamente 6500 articulos:

bin/mallet import-dir --input ./data \
--keep-secuence  true \
--output noticias.mallet \
--stoplist-file ./stoplists/stopwords.txt
comenzó: 5:18 termino 5.19. para 6000 documento bastante rápido veamos..
lo siguiente, hará el trabajo de obtener tópicos mediante el algoritmo LDA:

bin/mallet train-topics \
--input noticias.mallet \
--optimize-interval 20 \
--num-topics 20 \
--word-topic-counts-file  noticias_word-topic-counts.txt \
--output-state noticias-topic-state.gz \
--output-topic-keys noticias_keys.txt \
--output-doc-topics noticias_composition.txt 
Comenzó a las 5.22 aplicando LDA a 6500 documentos.
Terminó : 6y22 :( al menos lo hizo y no dió error de memoria :)
Total time: 56 minutes 46 seconds

Los archivos de salida son 3:

noticias_keys.txt tendría todos los tópicos que encontró el algoritmo.
noticias_composition.txt tendría todos los tópicos, y la porción de cada tópico en cada documento, de este archivo se puede realizar grafos, heatmap, treemap, y es el que contiene la información que podría definir similaridad entre documentos.
noticias-topic-state.gz contiene todas las palabras, que encontró en los distintos documentos, podría servir para hacer una nube de palabras, y para analizar globalmente con R.

Esto se realizó siguiendo este tutoríal: http://programminghistorian.org
La fotografía, es de una exposición donde las ilustraciones deben reflejar lo que contiene el texto de la derecha de la imagen.
Licencia, Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported


Mas info y scripts: https://github.com/j3nnn1/topic_model


Thursday, August 1, 2013

Modelado de Tópicos "automagically".


Es una técnica para tratar documentos que no tienen alguna categorización,
y asume que cada documento es una mezcla aleatorias de categorías o tópicos
donde cada categoría es definida por la preferencia de algunas palabras
sobre otras. Finalmente pretendemos que vamos a generar cada palabra
en cada documento desde 0 una y otra vez, y aleatoriamente escogemos una
categoría y de esta categoría escogemos una palabra que representen dicha
categoría basado en la preferencia de esta palabra sobre otras.

Un tópico en el contexto de modelado de tópicos es una distribución
de probabilidades de palabras para un conjunto, e indica la probabilidad
que una palabra aparezca en un documento  sobre un tópico en particular.

Resumen.

1 - El modelado de tópicos asume que las palabras que comprende el texto
fueron generadas aleatoriamente. (mmmjum si claro, y en la luna ha oxigeno.)
2 - Su objetivo es Inferir una convincente respuesta bajo la asunción que el punto
1 siempre es verdadero.

Poco creíble ¿no?, pero lo cierto es que segun lo leído en su mayoría funciona.
Comentan que el potencial del modelado de tópicos no se observa en cada
documento individualmente, sino más bien en un enfoque global analizando
grandes cantidades de documentos para visualizar patrones entre ellos. Esto
me trae buenos recuerdo de Bertalanffy y su teoría general de sistemas.


Para definir un proyecto de modelado,  consta de 5 atributos:

1 - ¿cual es el corpus a analizar?
2 - ¿qué técnica o algoritmo de modelado se va a aplicar?
3 - ¿Cual es la unidad de Análisis?
4 - ¿Como fue el postprocesamiento?
5 -¿Puedo visualizarlo mediante y gráfico y cómo?

Los Proyectos de modelado de tópicos se dividen en:

Proyectos de enfoque sincrónico: en el cual el valor de la unidad de análisis
no posee límite de tiempo, o mejor dicho no se identifica con una brecha de
tiempo.

Proyecto de enfoque diacrónico: La unidad de analisis de tiempo se genera
en un fecha o rango de fecha definido.

Respondiendo esto de acuerdo a un proyecto que tengo actualmente:
1 - ¿cual es el corpus a analizar?
    noticias, artículos y opiniones de 10 periódicos en internet,
    bajo la sección de economía, sin tomar en cuenta la fecha
    en la que se hizo el fetch de la url.
2 - ¿qué técnica o algoritmo de modelado se va a aplicar?
    Vanilla LDA Mallet. (Distribution Dirichlet?)
 3 - ¿Cual es la unidad de Análisis?
    1 documento = 1 noticia.
4 - ¿Como fue el postprocesamiento?
    si el tiempo es generoso con nosotros hacer cluster en R
    en base a esta data de tópicos.
5 - ¿visualización?
   un heapmap sería una buena opción. Si murphy no anda cerca.
   un gráfico de líneas,  con variable x = tiempo y scoring
   de relevancia y cada línea sería un tópico diferente.

Referencia.
topic-modeling-in-the-humanities-an-overview

Thursday, July 25, 2013

Scrapy como casi crawler.

0 - Primero
scrapy startproject articulo_lanacion 

1 - Crear el Modelo, Los Itemes que quiero
obtener de la página por lo pronto solo un Item.
Al ejecutar el primer comando se creo un archivo llamado

items.py acá se definen sus atributos.
class LaNacionComArItem(Item):
    # define the fields for your item here like:
    # name = Field()
    title = Field()
    content = Field()
    pass
2 - Crear la arañita:
class LanacionSpider(BaseSpider):
   name = "lanacion" 
   allowed_domains = ["www.lanacion.com.ar"]
   start_urls = [
          "www.lanacion.com.ar", 
          "www.url2.com"]#urls to fetch
   hxs = HtmlXPathSelector(response)
   item = LaNacionComArItem()#here a new object

   #getting the specific html element with the content
   item['title'] = 
       hxs.select('/html/body/section/
       section/section[6]/article/section[2]/h1')
          .extract()
   item['content']= 
       hxs.select('//*[@id="cuerpo"]').extract()
   return item
3 -Para guardar en CSV, JSON, XML, entre los mencionados
ejecutamos desde la terminal:
 scrapy crawl lanacion -o items.csv -t csv  
EL csv quedará de la forma:

content, url
un monton de data.... , www.url.com

Referencias Acá: Documentación y Tutorial

PD: la imagen si no lo recuerdan es de un personaje de scooby doo, llamado scrappy :) 

Tuesday, July 23, 2013

vfat or not

Sí esto aparece en dmesg y no puedes montar la unidad de fat,


[78098.543829] FAT-fs (sdb1): bogus number of reserved sectors
[78098.543840] FAT-fs (sdb1): Can't find a valid FAT filesystem
[78107.498487] sdb: detected capacity change from 2002780160 to 0
[78110.599817] sd 6:0:0:0: [sdb] 1990656 512-byte logical blocks: (1.01 GB/972 MiB)
[78110.601989] sd 6:0:0:0: [sdb] No Caching mode page present

Solución:
$ fsck.vfat /dev/sdb1

Y luego hacer el mount habitual.


Backbone y Coffescript.


Hoy en día, ya existe un pequeño compilador para windows, todo comienza con instalar node.

0 - instalar node desde acá: http://nodejs.org/ ya existe msi para win, y para linux cualquier gestor de paquetes lo tiene.

1 - luego npm install cofffee-script

2 - Para compilar, coffee -c DirectorioConArchivosCoffee y los reemplazara la opción -o creará una nueva carpeta con los archivos compilados.

$ coffee -c backbone

3 - Luego para las plantillas, usé grunt.js, siguiendo un tutoríal que reseñé acá:

En cuanto al código de coffee-script y backbone,
soy nueva en el uso de ambos, por lo que lo reseño acá errores que me ocurrian:

TypeError: iterator is not a function 
Esto se generaba durante el uso del método each
de la librería underscore.js aplicandolo a collecciones,
revisar el orden y sintaxis del método each, y que exista la función.

Typeerror: this.model is not a constructor
Revisar en la definición del modelo, que el nombre
referido en la declaración de la collección coincida con
el nombre del modelo, en mi caso fue un misstyping,
también puede ser que el modelo no exista.

This template is not a function 
Esto ocurre cuando olvidé hacer el import mediante
 script src="./js/assets/backbone/car_form.js"
 type="text/javascript"  /script

del template, usualmente es un archivo js, backbone utiliza por defecto
underscore y cuando realiza:
CarFormView.prototype.template = 
JST["backbone/templates/car/car_form"];

y no consigue el archivo car_form.js, falla.

TypeError View is not a constructor
De igual forma que el anterior falta declarar el archivo.js en el html, con el
tag script, o la vista no se encuentra definida, no se ha realizado la declaración
de la vista.

Apuntes Sobre Estructura.

  1. Cada vista puede tener pequeñas vistas que la componen, así como las matrioskas.
  2. Cada view solo puede manejar eventos, añadir secciones a su ámbito definido.


  1. El Router = Controlador, varios tutoriales los mencionan haciendo referencia a lo mismo.
  2. El Modelo consta de:  initialize, defaults, methods.
  3. La Vista consta de: initialize, render, events, functions.
  4. el , objeto creado en el browser, todas las vistas poseen este
    objeto, por defectoo es un elemento div vacío. Cualquier evento monitoreado
    por la vista debe estar en este elemento.
  5. Collecciones, se podría ver como un arreglo de modelos,
    suelen usarse con un mismo  modelo.
  6. ¿Donde comenzar? 
    Añadiendo los Modelos, router, Templates y Vistas.
    Sin olvidar que: por cada edición revisar si se realiza el
    import de los scripts necesarios.
  7. Próximos pasos: Backbone y Amd..
Fotografía compartida con licencia Creative Commons:
acá está el dueñ@ http://www.flickr.com/photos/kiki-follettosa/2225844941/

Sunday, July 21, 2013

Testing code pretty Print.


this["JST"] = this["JST"] || {};
enlace con los diferentes estilos:
Estilos que admite
Soporta los siguientes lenguajes: prettify code

PD: imagen aleatoria de que al menos un repositorio ordenado y limpio tengo :)
cortesia de oh my zsh, recomendado. oh-my-zsh

Saturday, June 29, 2013

Haciendo un XML con python.




Cómo crear un xml con python, de forma rápida
y sencilla, la mejor librería que se adapta a eso es:

lxml
ElementTree está genial, sin embargo
al momento de crearlo, lo generaba en
una sola línea :-/ lxml utiliza ElementTree
y un poco más :) Esta librería me permitió
 añadir nueva línea para cada tag,
de forma que quedara legible e identado. 
Resultado: GitHub Python Script
Comentadas están algunas otras que probé
pero su forma de crear el XML no se ajustaba a lo
que necesitaba.

Para formatear un XML, no muy grande:
http://www.freeformatter.com/xml-formatter.html

Enlaces de Referencia:
http://effbot.org/zone/element.htm
http://www.boddie.org.uk/python/XML_intro.html
http://docs.python.org/2/library/xml.etree.elementtree.html
http://luisartola.com/software/2010/easy-xml-in-python/
http://wiki.python.org/moin/PythonXml
http://docs.python.org/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree

Element Tree example:
http://pymotw.com/2/xml/etree/ElementTree/create.html
Este está completo, sobre lxml:
http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

Friday, June 14, 2013

Haciendo un mapa con D3,



1 - Buscar los datos límitrofes del mapa. (En mi caso, esto lo quiero hacer para Venezuela y Argentina) tomé los datos de un archivo shapefile:

sitio que tiene estos datos: http://www.gadm.org/country
ó acá: http://www.naturalearthdata.com

de acá tomé el de argentina ya que el de IGN tenía un detalle con la provincia tierra del fuego.

Otra herramienta para hacer mapas sencillos: sin mucha animación es:jvectormap.com
realmente sencillos pero fácil de usar.

Y esta librería es más sencilla todavía solo importar y usar, solo viene con mapas de usa y por regiones, mundial, sur américa, y europa.

Argentina: IGN AR

Tomé los shapefile y los llevé al formato geoJson con FWTools. instalarlas en linux y en la ventana es bastante sencillo. Y con la línea de comando:
ogr2ogr -f geoJSON provincias.geojson provincias.shp
En caso de los archivos de venezuela el que posee extensión  
ogr2ogr -f geoJSON estados.geojson estados.shx
2 - Convertir Archivos geoJSON a TopoJSON.
3 - Usar D3.
Antes de hacer copy and paste de los ejemplos,
 y luego no entender porque tienes una patalla 
en blanco mejor entender que elementos componen 
un mapa en d3 (requeridos) y que cosas son 
opcionales que permiten personalizar.
De la imagen anterior, todo mapa en d3 tiene un
 "path" (generador de ruta) o una "projection" 
(proyección) son requeridas.
PROJECTIONS: esto permite que coordenadas esféricas
 sean proyectadas a un plano cartesiano. Siendo esto
 necesario para mostrar figuras esféricas en un plano 
2D. En las visualizaciones 3D esto no sería necesario.
PATH:  Toma las figuras geométricas proyectadas en 2D 
y las formatea correctamente para el formato SVG ó CANVAS.

STREAMS: para computarizar áreas proyectadas, 
centroides, límites consistentes a la geometría 
mostrada, y puede incluso filtrar fíguras geometricas 
dependiendo de la escala.

Un ejemplo de Mapas con D3: La Nación Censo AR
Otro ejemplo pero seguro no el mejor código, 
lo veo y sé que hay formas de mejorarlo:
Mapa Argentina 

Convertir GeoJson a TopoJson, una ayudaita para recordar :)


Desde Microsoft:
Gracias a que hicieron unos msi, el proceso es realmente simple.

1 - Descargar node: NodeJs
2 - Luego desde la consola "cmd", de win, hacer: npm install -g topojson
3 - Desde la línea de comando:   topojson -o provincias.topojson provincias.geojson
tomado de: Wiki TopoJson

Y listo para usar con D3.

Desde linux:

pacman -S nodejs 

¡El resto es igual! 

PD: acá está el resultado luego  de largo trabajo con Js, mapa Argentina

Saturday, June 8, 2013

python, virtualenv y no hay problema!




Instalar virtualenv.

pip install virtualenv

por el gestor de paquetes.
python2-virtualenv-clone
python2-virtualenv

Creando un entorno virtual.

mkdir ~/virtualenvs/blog/
virtualenv ~/virtualenvs/blog/ --no-site-packages -p /usr/bin/python2virtualenv --no-site-packages nombreEntorno : Esta opcion hace que el entorno virtual se instale sin tomar en cuenta los paquetes del sistema operativo.

virtualenv --python=python3.1 nombreEntorno: Para que use un python específico.

Listar los ambientes virtualenvs.

   Porque menciono esto ya que la costumbre de usar rvm o perlbrew es poder listar las diferentes versiones del lenguaje que ya tengo instalada, por lo que no existe una única forma de hacer esto, ya que esto NO te instala diferentes versiones de python en tu SO, sino crea entornos virtuales para cada aplicación haciendo más limpia su implementación, por ejemplo tengo en mi SO dos versiones de python, puedo instalar estas dos versiones en mi ambiente local. Lo más recomendable es hacer un directorio donde almacenar todos los entornos virtuales.
Activando el entorno virtual.

cd ~/virtualenvs/mysite.com
source bin/activate


Desactivando el entorno virtual (Dejar de usar el python local). 

deactive 

Como funciona un entorno virtual.
Cuando uno crea un entorno, dentro del mismo se crean tres carpetas:

bin: cuando uno tiene el entorno activado, y ejecuta un comando como python, pip o easy_install, se ejecuta alguno de los binarios que se encuentran en esa carpeta, en vez de ejecutar los del sistema.
include: es simplemente un link al a los archivos de la instalación de Python.

Un link a algunos archivos de Python. En este caso a los .py
Una carpeta, site-packages, que es donde se instalan los paquetes cuando uno usa pip o easy_install

lib: esta es otra carpeta importante. Al igual que include tiene una carpeta llamada python pero a diferencia de include, esta no es una link a la carpeta de Python. La carpeta tiene dos cosas importantes:

Instalar Modulos en el entorno virtual.

pip install psycopg2

pip install numpy

pip install rpy2


Usando un wrapper para agilizar la utilización del entorno virtual.

usar: http://virtualenvwrapper.readthedocs.org/en/latest/


Servidor que contiene binarios no oficiales para python y windows

http://www.lfd.uci.edu/~gohlke/pythonlibs/


Referencias de:
 

Un tutorial genial para instalar virtualenv y como funciona:
https://wiki.archlinux.org/index.php/Python_VirtualEnv

referencia al titulo: http://www.youtube.com/watch?v=21fRA1VrLPo :)

adorable  alf

Tuesday, May 28, 2013

Apuntes de visualización.




    2 philogb -> Las visualizaciones que realizó: http://philogb.github.io/blog/ y las herramientas que ha creado
      actualmente no se encuentra tan actualizado el proyecto JIT  ya que fue comprado por sencha labs.
       sin embargo para probar está bastante bueno.
    3 geonames.org en búsqueda avanzada es una herramienta que permite
      a partir de nombres obtener resultados con sitios geográficos que
      coincidan con ese nombre.
    4 marumushi.com -> flipboard lector de noticias, para dispositivos móbiles. realizó newsmap.jp
      realmente está buena esa página permite visualizar las noticias mediante un treemap en base a
      la cantidad de menciones en diferentes diarios.
    5 catherine plaisant -> participa como jurado en Vast
    6 algoritmo que utiliza el treemap: squarified tree map.         
    7 videos sobre visualizaciones:
           Ted Talks
           La belleza de visualización de los datos
           Shneiderman
    8 Learning getting started with D3 Listo. it-ebooks
    9 Robert Spence,  Information Visualization.  Falta por leer. y revisar mejor esta wiki: infovis-wiki.net

Sunday, May 26, 2013

D3 js una alternativa, para hacer visualizaciones con Javascript.



En este caso realicé un treemap de las aplicaciones de cliente para twitter que usaron las personas para hacer tweets en el flisol 2012 y que tuvieran en su "location" alguna información o palabra de estados de venezuela, o venezuela en sus distintas formas y además que mostrara el tamaño del cuadro con respecto a la cantidad de followers que tiene el usuario:

El ejemplo del treemap fue tomado de acá: http://bl.ocks.org/mbostock/4063582

Y Quiero hacer estas modificaciones: http://www.billdwhite.com/wordpress/2012/12/16/d3-treemap-with-title-headers/

pero será para otro post y en otro tiempo:

El enlace del resultado está acá: Flisol 2012 App de Twitter

El código es Js y html, con un wget de esto les funcionará.

La data formateada la realicé con varios scripts.

0 Obtener la data de los usuarios de acuerdo a los Ids. los Ids los pueden conseguir acá:

Github J3nnn1 Ids Twitter 

1 Pasar de CSV a Json al fomato que recibe el layout de treemap.

importante:
Ayuda a corregir si un json está mal formado! :)

http://jsonformatter.curiousconcept.com/#jsonformatter



Sunday, May 19, 2013

SPSS + Python + Ninja IDE = Menos consumo de memoria RAM

Menor consumo de memoria RAM, aunque usted no lo crea. Esto resulta de no ejecutar la interfaz de usuario de SPSS, sino usar las funciones de SPSS que se pueden acceder mediante su API en Python.

0 - Tener python instalado. (reiniciar con cada instalación, si es windows)
1 - Tener SPSS instalado.
2 - Instalar el plugin que corresponda, a la versión de SPSS que se tiene instalada, en mi caso la versión de spss es la 20. por lo que requiero este plugin (no instalar fixed si no tienes la versión de spss correcta): buscar acá:
python spss esential
Cuando instalen el plugin debería reconocer la ruta del python que tienen instalado para instalar las librerías que conformarán la API:

Configurar ninja IDE para que tome la versión del python que utiliza spss. muestro un screenshot de la ruta:



Y cuando ejecutan el script de python no pueden usar el spss,  con el mismo archivo, sino crea una copia del archivo.

Si en el scripts haces modificaciones al archivo puedes guardarlas y revisarlas al final :)
es lo más si cuentas con una máquina de pocos recursos. (2GB de ram) y ¡un poco más de data de lo habitual!

Algo extra: Cómo correr un proceso cron: SPSS como CronJob

Monday, May 13, 2013

Flisol 2013 tweets y Usuarios.

Una nube de palabras sobre el flisol 2013. durante el transcurso del flisol estuve obteniendo los tweets que al menos algunas de estas 3 palabras hiciera mención: flisol flisolve flisol2013  y bueno aproximadamente sólo 1800 tweets obtuve hasta las 6pm de Venezuela.

un sort al archivo, y colocando todo en un sólo archivo, arrojó las siguientes imagenes:
Usuarios (screen_name).

Tweets frecuencia > 10

Todos los Tweets

Y curioseando con R y apriori, nada nuevo se vé porque hay mucha data que opaca los casos inusuales. ¿Sería cuestión de eliminar el resto de la data y tomar sólo la minoritaria? como diferenciar casos raros.

     lhs                          rhs                           support confidence      lift
{Hundreds,  Installing}      => {Latin}           0.009911894 1.00000000 69.846154 {¡No,                                                                                
      al,                                                                                 
      aquí:,                                                                              
      asistir,                                                                            
      importa,,                                                                           
      online,                                                                             
      puedes}                 => {míralo}                 0.006057269 1.00000000 165.090909

     {ciudadades,                                                                        
      dmuchas,                                                                           
      es,                                                                                
      Festival,                                                                          
      Instalación,                                                                       
      Latinoamericano,                                                                   
      Software}               => {Libre}                  0.006607930  1.0000000  25.22222
     {ciudadades,                                                                        
      contintente.,                                                                      
      dmuchas,                                                                           
      Festival,                                                                          
      Ho@wikinoticias:,                                                                  
      Instalación,                                                                       
      Latinoamericano,                                                                   
      Software}               => {Libre}                  0.005506608  1.0000000  25.22222
     
      En resumen: muchos tweets sobre que es el FLISOL, en inglés y en español, y además si
      no podías asistir compartían el enlace para visualizarlo por streaming, el usuario
      wikinoticias también cubrió la noticia. Eliminando algunas palabras que son las mayoritarias:

         lhs                          rhs                           support confidence      lift
    {#PanamGracias,                                                                       
     @Tecnomenia,                                                                       
     @utpfisc?,                                                                           
     míralo,                                                                              
     puedes}                  => {http://t.co/9yvPOaC7zI!} 0.004955947  1.0000000 201.77778
        
    {#CiudadDeMéxico}      => {#Hackerspace}            0.004405286  1.0000000 139.69231
   
Cuando aparecen las palabras del lado derecho seguido luego aparece un enlace para visualizarlo. Y la mención a esos usuarios de twitter. Estos usuario son de panamá: @utpfisc?, @Tecnomenia,  @la_cascara  y se meciona al flisol bogotá difundiendo sus sedes y varias ciudades de brasil que realizaron el flisol.

Sunday, May 12, 2013

predicciones con árboles.


árboles de decisión, son muy usados para establecer modelos predictivos,en base a hechos del pasado.

Ejecución de árboles en R.

que algoritmo utiliza R,

library(tree)
library(datasets)
iris.tr = tree(Species ~ ., iris)
iris.tr
> summary(iris.tr)

> plot(iris.tr)
> text(iris.tr)
> misclass.tree(iris.tr)
> misclass.tree(iris.tr, detail=TRUE)

> library(rpart)
> data(spam7)
> attach(spam7)
> spam.tree = rpart(formula = yesno ~ crl.tot + dollar + bang)
> spam.tree = rpart(formula = yesno ~ crl.tot + dollar + bang + money + n000 + make,method="class", data=spam7)
> plot(spam.tree)
> text(spam.tree)
printcp(spam.tree)
> spam.tree = rpart(formula = yesno ~ crl.tot + dollar + bang + money + n000 + make,method="class", data=spam7, cp=0.001)
> plotcp(spam.tree)
> spam7b.tree = prune(spam.tree, cp = spam.tree$cptable[which.min(spam.tree$cptable[,"xerror"]), "CP"])
> plot(spam7b.tree)
> text(spam7b.tree)



Con Weka desde R
> library("RWeka")
tree = make> tree = make_Weka_classifier("weka/classifiers/trees/J48", c("bar", "Weka_tree"))
> print(tree)
> WOW(tree)
> fm = tree(yesno ~ crl.tot + dollar + bang + money + n000 + make, data=spam7, control=Weka_control( S=TRUE, M=150))
> fm
table( observed= spam7$yesno, predicted = fitted(fm))
fm = tree(yesno ~ crl.tot + dollar + bang + money + n000 + make, data=spam7, control=Weka_control( S=TRUE, M=150))
library(party)
plot(fm)


Rotando un video porque UPS está al reves..


mencoder (Codificador de películas de MPlayer) es un sencillo codificador de películas, diseñado para codificar películas reproducibles con MPlayer (véase  más  arriba)  a  otros  formatos  también  reproducibles  con  MPlayer (véase más abajo).  Codifica a MPEG-4 (DivX/Xvid), uno de los códecs libavcodec y audio en PCM/MP3/VBRMP3 en 1, 2 o 3 pasadas.  Además, puede copiar flujos, un potente sistema de filtros (recortar,  expandir,  girar,   post-procesar, rotar, escalar, ruidos, conversión RGB/YUV) y más cosas.

referencia: man mencoder

En una boda, tome algunos videos, peeeero los realicé al reves, por lo que requería de una aplicación de edición de video que me permitiera rotarlo. 

En linux existen las gráficas y las no gráficas.

Mencoder es no gráfica y 
Openshot es una alternativa simple para edición de videos, menos compleja que cinelerra y blender. sólo se añade el video a la línea del tiempo, click derecho y se escoge hacia donde girar.

em mencoder es más de leer el man para ver si está actualizado y es igual a este: 

mencoder -vf rotate=1 -ovc lavc -oac pcm 16032008002.mp4 -o rotated.mp4
Y bueno chao.

PD: imagen tomada de google con la palabra boda+xkcd.

Saturday, May 11, 2013

crawlers o araña web Opensource.


Selección de un crawler.

- Tenga actualizaciones recientes en su software (2013).
- El lenguaje en el cual fue realizado, se pueda usar en los diferentes sistemas operativos. Con una instalación poco complicada.
- La licencia  del Software es importante, sin embargo una condición es que sea opensource,  ya que permitiría un estudio amplio de sus características y comportamiento.
-La documentación es MUY importante.

Abot, está hecho en c#, creo que por esta razón lo descarté.

Aspseek, está hecho en c++, funciona en sistemas POSIX, sin embargo es demasiado viejo, su última modificación fue en el año 2002, por lo que podemos decir que es un software poco usado hoy en día, sin embargo existen paquetes (rpm y .deb)para instalar esta antigüedad.

DataparkSearch: está escrito en C, existen paquetes para su instalación y su última actualización fue en el año 2010. Por lo que descartamos su utilización.

Wget: Es un crawler por línea de comando, que tiene una amplia gama de opciones para personalizar la descarga, obtiene el contenido de una página web, sin realizar el parseo, extracción, tokenización, del sitio web descargado, A diferencia de Nutch que realiza el proceso de parseo del formato HTML, y procesamiento de la data.
Curl ( http://curl.haxx.se/ ), principalmente utilizado para la transmisión de archivos también se utiliza aunque a menor escala para crawlear. Soporta entre otros protocolos FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP. Esta escrito en C++ y es multiplataforma ( *nix, Microsoft Windows, etc).

Grub: Ja, no el gestor de arranque de sistemas operativos.. es grub el crawler. Es un crawler distribuido, suena bien, y lo utiliza wikia, ya que fue comprado por Wikipedia en el 2007. Está escrito en c++ a pesar que durante un tiempo fue un proyecto de código cerrado, luego de la compra por wikipedia es un proyecto Opensource. El detalle por el cual es descartado es que tiene muy poca documentación. Sin embargo es un proyecto interesante y tiene un archivo TODO con cosas que se pueden realizar para contribuir con el proyecto, su última actualización fue el 03 de abril de este año (2013).

Heritrix: Es un crawler cuya última actualización fue realizada en el año 2006, está escrito en Java. Posee una interfaz web, para realizar funciones de cualquier crawler. 

Ht-//Dig: Es un crawler cuya última actualización fue en el año 2004, un software bastante viejo, y además con muy poca documentación.

HTTTrack: Crawler escrito en C, algo muy al estilo wget (software ejecutado por línea de comando) sólo que con algo más dulzura, permite expresiones regulares, maneja los enlaces con rutas relativas y enlaces originales, una de sus ventajas es su versatilidad de opciones para obtener resultados diferentes. algo interesante es que puede establecer prioridades por el tipo de archivo que descarga y tasa mínima y máxima de transferencia para no abarcar todo el ancho de banda.  

Sin embargo es un software no muy amigable que requiere un nivel mayor de conocimiento sobre como procesar los datos que obtiene este programa, ya que no realiza el parseo de los archivos obtenidos, y requiere de conocer un lenguaje de programación (perl, python) para procesar estos datos.

ICDL Crawler:  es un crawler distribuido, que parsea el contenido a un formato de Web semantica (archivos WPT) interesante el uso de ontologías para este formato, es una herramienta algo avanzada para el objetivo de este trabajo práctico. Pueden obtener más información de: http://www.omfica.org que utiliza este tipo de crawler de acuerdo a las especificaciones del sitio.

mnoGoSearch: software que se utiliza como motor de búsqueda, es privativo por lo que quedó descartado para la realización de este proyecto, además de no tener actualizaciones desde el año 2012.

PHP-Crawler:Es una herramienta web que usa una base de datos para guardar datos de un sitio web y permite hacer búsquedas en el sitio. No se utiliza por línea de comandos sino por el navegador, sin embargo no tomamos en cuenta este proyecto ya que no se actualiza desde el 2006.

tkWWW Robot: proyecto muy muy viejo desde el año 1992, y su última actualización en 1996.

Seeks y Yacy: su objetivo primordial es ser un motor de búsqueda alternativo y tienen su propio crawler, en vista que se enfoca más hacia un motor de búsqueda, no lo tomaré en cuenta para el proyecto.

Scrapy: se requiere conocer el lenguaje de programación python y tener un poco de conocimiento de programación orientada a objetos. Creo que cualquier persona con poco conocimiento puede obtener la data que requiere, a diferencia de un crawler que obtiene toda la data, acá podemos obtener la data que necesitamos y no más de ahí.. está más orientado al web scraping.

Nutch: Es un crawler por sí sólo no es posible utilizarlo, se requiere de solr para obtener la data indexada, importante a destacar es su estructura, aún se encuentran dos versiones estables:

La versión 1.6 que permite utilizar el crawler y solr, sin necesidad de instalar otras aplicaciones para su manejo como hadoop, hbase, agora, hive, entre otros. La versión 2.x se orienta a procesos de mayor escala, y permite implementar "crawlers" distribuidos, y el procesado del texto a través de map reduce.

En la versión 1.6 se puede usar solr "out the box" es decir luego de descomprimir los archivos, nutch es un crawler enfocado más a escribir que a ser un motor de búsqueda, muchas de las características son plugins que pueden ser personalizados en el archivo de propiedades del nutch. Entre las características personalizadas se encuentra:

- seleccionar que sólo descargue las páginas perteneciente a los dominios de las semillas mencionadas en el directorio url.

- Seleccionar que parsee el archivo durante el fetch del mismo. Pero consume mucha memoria, y genera muchos procesos de lectura y escritura.

http://pastebin.com/YSXySCW1

db.ignore.external.links a "true" para que no busque enlaces externos dentro de los dominios semillas.

- El proceso de crawler de nutch consta de varias etapas:  

 inject->generate->fetch->parse->updatedb   

- Añadimos una expresión regular de forma que sólo haga fetch de los sitios que pertenezcan a esos dominios definidos en el archivo regex-urlfilter.txt algo importante a comentar es que la utilización masiva de expresiones regulares realentiza el proceso del crawler. En nuestro caso son pocas urls, de igual forma en el archivo de configuración seteamos la propiedad:

Crawling e indexing.

./bin/crawl urls/ crawl http://localhost:8983/solr 2

./bin/nutch solrindex http://localhost:8983/solr crawl -linkdb crawl/linkdb crawl/segments/* 

Comandos Nutch para visualizar que descargamos:

Estadísticas de lo descargado:

./bin/nutch readdb crawl/crawldb -dump pageurl 

 ./bin/nutch readdb crawl/crawldb -stats

./bin/nutch readdb crawl/crawldb -url https://wwws.whitehouse.gov/petitions 
 
También:
 
bin/nutch readseg -list  crawl/segments/20130725200658 
bin/nutch readseg -dump  crawl/segments/20130725200658 dumpdir 
 
Contenido de un segmento descargado.
 
s=`ls -d crawl/segments/* | head -1` 

./bin/nutch readseg -dump crawl/segments/20130509191222 outputsegment
 
Para obtener Todo lo descargado en un solo archivo:
 
./bin/nutch readseg -list ./crawl/segments/ outputAllSegments 

 
Para más detalle de como es el proceso: 
http://florianhartl.com/nutch-how-it-works.html 
este enlace está muy bien explicado.

Y sobre scoring utilizado por defecto con el plugin de nutch:
si tienes duda de porque eligió esas páginas para el topN que seleccionaste: 
http://www2003.org/cdrom/papers/refereed/p007/p7-abiteboul.html  
 
En resumen: nutch > curl > wget  
 
(sí y solo si no sabes programar 
 
y buscas obtener el contenido rápido) 
 
sino libcurl > wget > nutch 
 

Borrar todos los índices en solr:

http://localhost:8983/solr/update?stream.body=%3Cdelete%3E%3Cquery%3E*:*%3C/query%3E%3C/delete%3E&commit=true

Listar Urls inyectadas.

bin/nutch readdb crawl/crawldb -stats  

bin/nutch readdb crawl/crawldb -dump dump

sí leiste todo esto tal véz te interese: como usar un scrapper con python:
Scrappy a scrapper.