Ejecutar weka desde linea de comandos

Weka es una librería de algoritmos de aprendizaje automático para realizar tareas de minería de datos (data mining). Incluye también un entorno gráfico muy útil.

Para un proyecto de adquisición léxica en el que estoy trabajando necesitaba ejecutar weka desde línea de comandos, como no ha sido directo averiguar como se hace os hago un resumen.

La idea es que tenemos que escoger un algoritmo, entrenarlo, guardarnos el modelo generado con este entrenamiento y usarlo para clasificar los datos que queramos.

  1. Entrenamiento: Una vez escogido el algoritmo (en nuestro caso utilizaremos un árbol de decisión weka.classifiers.trees.J48) creamos el modelo entrenando el árbol con los datos de entrenamiento:

    java -Xmx[MEGABYTES_DE_MEM_PARA_LA_TAREA]M -cp [PATH_A_weka.jar] [ALGORITMO_DE_APRENDIZAJE+PARÁMETROS] -t [FICHERO_ENTRENAMIENTO] -d [FICHERO_DONDE_SE_GUARDA_EL_MODELO]

    Por ejemplo:

    java -Xmx1024M -cp /opt/weka-3-4-9/weka.jar weka.classifiers.trees.J48 -C 0.25 -M 2 -t rweka.arff -d rweka.model

  2. Clasificación: Con el modelo generado en el paso anterior y los datos para clasificar ejecutamos:

    java -Xmx[MEGABYTES_DE_MEM_PARA_LA_TAREA]M -cp [PATH_A_weka.jar] [ALGORITMO_DE_APRENDIZAJE] -l [FICHERO_CON_EL_MODELO] -T [FICHERO_A_CLASIFICAR] -p 0

    En mi caso:

    java -Xmx1024M -cp /opt/weka-3-4-9/weka.jar weka.classifiers.trees.J48 -l rweka.model -T rweka.arff -p 0

    Este paso nos retornará por la salida estándar la clasificación de cada elemento del fichero en una línea con el número de este elemento en primer lugar, seguido de la clase que asigna el algoritmo y de información adicional:
    [NÚMERO_ELEMENTO] [CLASE_ASIGNADA] [CONFIANZA_EN_LA_RESPUESTA] [CLASE_REAL]

Notas:
  • Los archivos con los datos de entrenamiento y de clasificación han de estar en formato ARFF.

Etiquetas: ,

Posted by Spejman at 10:30 a. m. | 2 comments | links to this post read on

Configurar capistrano en servidores compartidos

Esta es la configuración de capistrano para desplegar una aplicación en Site5 cuando tenemos el código en un repositorio subversion. Posiblemente puede utilizarse en otros servidores compartidos con ligeras modificaciones.

Para escribir este post he realizado un despliegue real de una aplicación, he consultado el tutorial que encontré en http://www.thebitguru.com/articles/9-Setting+up+Capistrano+on+Site5 y he utilizado el soporte de los técnicos de Site5 que me han ayudado durante el proceso con un problema de permisos que había en el servidor.

  1. (este punto es específico de Site5) Pedir que te cambien el shell por defecto de jailshell a bash.

  2. Configurar el entorno de desarrollo: desde el subdirectorio de tu aplicación rails ejecutar cap --apply-to . NOMBRE_APLICACION este comando generará:

    exists config
    create config/deploy.rb
    exists lib/tasks
    create lib/tasks/capistrano.rake

  3. Editar las opciones de configuración: en el archivo config/deploy.rb
    1. Indicar la URL del repositorio subversion:
      set :repository, "svn+ssh://USUARIO@DOMINIO/RUTA_DEL_REPOSITORIO"

    2. Poner las direcciones de cada rol de tu aplicación (web, app, db). Típicamente solo se utilizan :web y :app poniendoles el nombre del dominio (por ejemplo "bee.com.es" ).

    3. Descomentar la linea "deploy_set" indicándole la ruta correcta hacia el subdirectorio del servidor donde quieres que se instale la aplicación, por ejemplo:
      set :deploy_to, "/home/TU_USERNAME/apps/#{application}"

    4. Si el username del servidor es diferente del de la máquina desde donde usarás capistrano, descomenta la línea "user" y pon tu username:
      set :user, "TU_USERNAME"

    5. Añadir las siguientes tareas de capistrano al final del archivo:
      desc "Link in the production database.yml and fix permissions"
      task :after_update_code do
      run "find #{release_path}/public -type d -exec chmod 0755 {} \\;"
      run "find #{release_path}/public -type f -exec chmod 0644 {} \\;"
      run "chmod 0755 #{release_path}/public/dispatch.*"
      end

      desc "Restart the web server. Overrides the default task for Site5 use."
      task :restart, :roles => :app do
      run "chmod 755 #{current_path}/public/dispatch.fcgi"
      run "touch #{current_path}/public/dispatch.fcgi"
      end

  4. Configurar el servidor: Ejecutar desde la raiz de la aplicación el comando cap setup

  5. Cambiar la linea de public/.htaccess:
    RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
    por:
    RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
    Fíjate que solo es cambiar la extensión .cgi por .fcgi

  6. Listo! ahora para desplegar tu aplicación solo tienes que ejecutar desde la raiz de la aplicación el comando cap deploy


Posibles errores:
  • Si el protocolo de tu repositorio subversion es svn+ssh, es decir, utiliza ssh tienes que pedir que te perimitan realizar ssh desde el servidor porque por defecto lo tienen deshabilitado.

Etiquetas: , , ,

Posted by Spejman at 10:25 a. m. | 1 comments | links to this post read on

Traducir código ruby del inglés a otros idiomas

La sintaxis de Ruby es muy cercana al lenguaje natural, esto facilita la lectura del código. Esta característica me hizo pensar la opción de traducir las palabras reservadas y los métodos de las clases más comunes de Ruby.

Esto permitiría acercar Ruby a más gente a parte de simplificar el desarrollo y mantenimiento de aplicaciones en comunidades no anglo parlantes.

Te imaginas:

vector_de_palabras.cada_uno haz |palabra|
imprime palabra
fin

En lugar de:

vector_de_palabras.each do |palabra|
print palabra
end


Esta idea tiene a priori ventajas/inconvenientes

Ventajas:
  • Código más legible por no anglo parlantes

  • Código más fácil de desarrollar

  • Mayor mantenibilidad


Inconvenientes:
  • Código menos estándar


Decisiones a tomar en cuenta para implementarlo:
  • Traducir sólo los métodos o traducir también palabras reservadas y sintaxis.

  • Cómo interpretar el nuevo código:

    • Crear versiones del interprete de ruby

    • Crear un parser que transforme el nuevo código ruby a código ruby estandar

    • Crear un DSL.

  • Utilizar o no acentos, dieresis, etc.


He creado un proyecto en rubyforge llamado políglota dónde organizar toda la información, ficheros y código relacionados.

La idea es crear un framework que permita traducir ruby a varios lenguajes, cuento con la ayuda de traductores titulados, gracias a ellos podremos conseguir unas traducciones más correctas.

Como puedes ver es una propuesta todavía muy verde, espero que te parezca interesante! Si quieres puedes colaborar explicándome tus impresiones en los comentarios o desarrollando partes del proyecto.

Etiquetas:

Posted by Spejman at 4:30 p. m. | 8 comments | links to this post read on

Generador automático de consultas en Ruby on Rails

Estoy intentando hacer una especie de query builder en ruby on rails que permita al usuario crear consultas a la base de datos teniendo en cuenta todas las tablas y sus atributos.

Haciéndolo estoy aprendiendo mucho del código interno de ActiveRecord, os comento un par de trucos que he aprendido y alguna duda que me ha surgido.

  1. ¿Cómo sabe ActiveRecord las columnas de las tablas que forman los métodos de sus objetos? En mysql utiliza la query "SHOW FIELDS FROM nombre_tabla" y lo hace en el método ActiveRecord::Base.connection.columns(nombre_tabla).


  2. ¿Cómo saber las tablas que hay actualmente en la bd? Para saber esto he utilizado la sentencia sql de mysql "SHOW TABLES", ejecutando ActiveRecord::Base.connection.select_values("SHOW TABLES") obtenemos un array con todos los nombres de las tablas que hay en la bd.


  3. ¿Cómo saber que objetos ActiveRecord válidos hay en la aplicación RoR que estamos ejecutando a partir de la lista de nombres de tablas? Para hacer esto utilizo el siguiente código:

    table_names.each do |table_name|
    # comprobación de seguridad antes de hacer el eval.
    next if table_name.include?(";") or \
    table_name =~ /\s/
    table_name = table_name.classify
    begin
    activerecord_classes_names << table_name \
    if eval("#{table_name}.class == Class")
    rescue; end
    end

    No se si es la mejor manera, pero no se me ocurrió ninguna otra puesto que no he encontrado ningún método que me muestre las clases que existen en la aplicación, pero debe haberlo si tu lo sabes por favor dímelo ;)


  4. ¿Como saber las asociaciones que tiene un objeto ActiveRecord con otros objetos ActiveRecord? En la clase ActiveRecord existe el método de clase "reflections" que retorna un hash con los nombres de las asociaciones apuntando a objetos del tipo ActiveRecord::Reflection::AssociationReflection que, entre otros, tienen los siguientes atributos:
    • class_name: Nombre de la clase destino

    • macro: símbolo correspondiente al tipo de relación (has_many, belongs_to, ...)

Etiquetas: , ,

Posted by Spejman at 1:10 p. m. | 5 comments | links to this post read on
Recommend Me


XING
View Sergio Espeja's profile on LinkedIn













Enlaces