Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

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, May 2, 2013

processing JS y Java. Una herramienta para Visualizaciones.



Un resumen muy introductorio, processing trata de una herramienta, que nos permite hacer visualizaciones, está realizado con Java y requiere un poco de conocimientos de este lenguaje, pero puede ser exportado en JavaScript, para publicarlo en algún sitio web.

La sintaxis es Java, sin embargo existen algunas funciones definidas que facilitan el trabajo, se pueden hacer animaciones, y en otras áreas artisticas es muy utilizado. (biopus) 

No sólo se puede exportar a Javascript sino también a Arduino, por esto es utilizado por grupos que realizan arte interactivo como http://www.biopus.com.ar/ 

La estructura de la sintaxis es de la siguiente forma:

//Todas las variables declaradas  
//afuera de estas funciones 
//serán tomadas como globales.

void setup() {
// se ejecutará una sóla vez, y al inicio de la aplicación.
}

void draw() {
// se ejecutará dependiendo de la tasa de imágenes por segundos 
// (framerate) esto es configurable en el ambiente.
}

un ejemplo lo pueden ver acá: http://maldonado.pl/buenosaires/index.html
y descargar de github: http://github.com/j3nnn1/homework/tree/master/cambiar_imagenes

Web de ProcessingJs http://processingjs.org/
Processing Javoso: http://processing.org/