Mi primera extensión para PHP

Luego de algún tiempo de inactividad, buscando tema para GSoC, me he metido en territorio desconocido para mí, jugar un poco con el Zend Engine, de ahí que bajé algunas presentaciones sobre como incluír PHP en una aplicación. Luego leyendo un poco más vi unos ejemplos de lo que hace tiempo he querido hacer, escribir una extesión nativa para PHP. Nativa significa código escrito en C,  ya que la máquina virutal, el compilado y el resto de PHP está escrito en C.

Me puse manos a la obra, y lo que nació como un juego, hoy en día (una semana más tarde exáctamente) es la versión alfa de los wrappers del LibTextCat. El libTextcat es un interesante proyecto que aplica la teoría presentada en N-Gram-Based Text Categorization, paper que también lo he implemendado el PHP para Languess.

Seguramente se preguntaran ¿porqué escribir algo nativo si ya lo tenias en PHP? , la respuesta es simple, rapidez. El código PHP tenia algo así como 2000 ejecuciones de bytecode, mientas con la nativa solo unas cuantas, más o menos 10, para pasar parámetros a la función C. La diferencia es de alrededor 0.05 segundos contra 0.001 segundos, es bastante pero para pequeños requerimientos la diferencia no es mucha, pero para procesamientos a larga escala, es considerable.

Más adelante escribiré como crear una extensión nativa para PHP, es relativamente sencillo, pero requiere conocimientos del lenguaje C, y cosas como autoconf, configure, en realidad más de C que otra cosa, por obvias razones ;)

Básicamente el PHPTC  (para no escribir PHPLibTextCat), se utiliza de la siguiente manera,

<?php
/* crear el "recurso" de textcat */
$tc = textcat_init();
/*  agregar un source.lm que tiene la definición del lenguage "source lang" */
textcat_add_knowledge($tc,"source.lm","source lang");
?>

Los archivos *.lm (en este caso source.lm) contiene la definición del lenguaje o conjunto de textos similares los cuales se utilizaron como ejemplos, aquí un ejemplo de como entrenarlo, aunque la librería ya venga con algunos ejemplos ya procesados.

<?php
/* crear el "recurso" de textcat */
textcat_train("source.lm", # Archivo de salida
    "este es un texto, escrito en Español, en teoría podrían ir textos más largos",
    "y otros textos, todo referentes a la misma cosa, claro",
    "podrían ser del mismo tema, o el mismo idioma, depende de tí"
);
?>

Para clasificar ciertos textos, es relativamente sencillo:

<?php
/* crear el "recurso" de textcat */
$tc = textcat_init();
/*  cargar el "conocimiento" */
textcat_add_knowledge($tc,"english.lm","Inglés");
textcat_add_knowledge($tc,"spanish.lm","Español");

$cat = textcat_get_cat($tc,"este es un pequeño texto a clasificar");
if (is_string($cat)) {
    echo "El texto esá escrito en $cat";
} else if (is_array($cat)) {
    echo "El texto parece estar escrito en ".implode(",",$cat);
} else if ($ret == SHORT_TEXT) {
    echo "Imposible de obtener categoria, texto muy corto";
} else {
    echo "Ocurrio un error"; # a leer los warnings
}
?>

Pensé por un momento agregar hacer open source www.languess.com, pero sería tonto, ya que básicamente los códigos de arriba, son toda la página.

Para el futuro implementaré una API usando Class,y me enfocaré en re-escribir el proyecto LibTextcat para agregar mejor soporte para el manejo de memoria, agergar soporte para unsupervised learnings alias text clustering, utf8 por defecto y más características.

Como instalar

Bajar el código fuente

$ git clone "git://github.com/crodas/phplibtextcat.git"

Compilar

$ cd phplibtextcat
$ phpize
$ ./configure --with-textcat
$ make
$ make test
$ make install

Agregar la extension a PHP

$ echo "extension=textcat.so" > /etc/php.d/textcat.ini
$ /etc/init.d/httpd restart

Sus feedbacks, bug reports, features requests, serán bien recibidas aquí

6 Comments

  1. Matías says:

    ¡Qué bueno!
    git clone… A probar.

  2. Muy bueno chera’a! Interesante tu propuesta!!

  3. Anderson says:

    Hola soy de Brasil. He escuchado de usted en un evento que usted hizo aquí.

    En primer lugar, felicitaciones por el puesto. Estoy queriendo aprender un tiempo, pero tengo que aprender C.

    ¿Cómo hacer para gravar vídeo en el ambiente de Linux? He utilizado el Camtasia en Windows.

    Abrazos y éxito!

    Nota: Yo no hablo español. El texto fue traducido a través de Google. Si el error, la culpa no es mía. =)

Leave a Reply