Spanish [SOLUCIONADO] Crear una wrapper library del stemmer SnowBall para B4A

GeoT

Active Member
Licensed User
Hola.

Queremos hacer una librería del stemmer SnowBall para B4A, para nuestro proyecto.
Enontramos el .jar de Java de este sistema de stemmer en Download snowball-stemmer JAR 1.3.0.581.1 with all dependencies.
Pudimos descompilarlo y obtener sus .java
Pero no sabemos el código que le falta ni el proceso para convertirlo en una librería de B4A.
¿Hay que hacerlo con Eclipse, Android o Simple Library Compiler (SLC)?
¿De que manera?
¿Luego, como se accede a sus métodos en B4A?

Gracias.
 
Last edited:

GeoT

Active Member
Licensed User
Gracias José.

Si, ya conocíamos ese enlace, pero no nos queda clara esa explicación, ni si hay que hacerlo así o con las otras opciones enunciadas.

Saludos.
 

JordiCP

Well-Known Member
Licensed User
Si se dispone de las librerías originales y se realiza un wrapper para B4A, las clases y funciones miembro que sean exportadas ya se podrán utilizar directamente en B4A (en esto consiste el wrapper), añadiendo la librería generada al proyecto (como si fuera cualquier otra librería). Para compilarlo se puede tanto utilizar Android Studio, Eclipse o SLC. A no ser que el código fuente ya te venga como un proyecto de los dos primeros, la manera más sencilla en mi opinión sería usar SLC.

Por supuesto, el wrapper necesita ser programado, y la complejidad del mismo dependerá de la librería en cuestión.

Otra opción es no realizar ningún wrapper, añadir la librería al proyecto mediante #AdditionalJar, y crear una especie de 'clase puente' que permita acceder desde B4A a los componentes y métodos necesarios mediante JavaObject + inline Java. Una vez más, la 'idoneidad' de utilizar un método u otro puede depender la la librería en cuestión.
 

GeoT

Active Member
Licensed User
Gracias JordiCP.

Alguna pista de cómo tiene que ser el código Java original, su estructura y demás...
Y se le tienen que añadir las importaciones de las librerías de B4A, ¿no?
 

JordiCP

Well-Known Member
Licensed User
Para empezar, es imprescindible saber un poco de Java.

El tamaño y la complejidad del wrapper (siento repetirme) no dependerá tanto del tamaño de la librería original, sino de la estructura de la misma y de las clases/funciones que necesites exportar. Por ejemplo, si tienes una librería que hace operaciones muy complejas con números y tiene muchos módulos, pero tu solamente necesitas exportar el acceso a un par de estas operaciones porque son las que va a necesitar tu programa, el wrapper puede ser sencillo.

Y se le tienen que añadir las importaciones de las librerías de B4A, ¿no?
Normalmente de algunas internas sí, sobretodo si necesitas pasarle la actividad, produce eventos, ...

Mi recomendación es, además del link que puso José (si vas a utilizar Android Studio), empezar con el ejemplo que hay en el post de SLC.
Una vez lo tengas funcionando, tanto la estructura, las librerías de B4A importadas y las herramientas a utilizar, te servirán de base para otros wrappers.
 

GeoT

Active Member
Licensed User
Si eso haremos.
¿Pero qué crees que le falta a este código adjunto, si no es mucho preguntar?

Gracias.
 

Attachments

  • libstemmer_java.zip
    71.8 KB · Views: 126

JordiCP

Well-Known Member
Licensed User
He mirado un poco el código pero desconozco exactamente qué hace la librería. Parece que, partiendo de un texto en un idioma concreto, lo procesa y saca un resultado, pero no sé para qué. ¿Podrías describir un poco para qué sirve exactamente?

El ZIP que has adjuntado contiene unas clases de la librería y un fichero 'Testapp.java' como programa de ejemplo, que muestra un posible uso.
Este programa, cada vez que se llama, se le pasan como parámetros: un fichero de entrada (donde supongo que está el texto original), un idioma (de entre los disponibles en la librería) y como opcional un fichero de salida donde la librería pondrá el resultado.

¿Me puedes confirmar si este es el uso que necesitáis de la librería?
Si es así, lo más sencillo con diferencia sería prescindir del wrapper, y añadir al proyecto B4A una clase con un método (el punto de entrada) que, mediante mediante el uso de Javaobject, ejecutara lo equivalente al programa de ejemplo, que se traduciría mediante inline Java. Sería necesario añadir las librerías mediante #AdditionalJar.
 

GeoT

Active Member
Licensed User
Correcto JordiCP, funciona así.
Consigue extraer la raíz de las palabras leídas del archivo mediante el algoritmo de derivación Porter2. El destino final será un diccionario para un motor de búsqueda.

¿Hay alguna explicación de los procesos al respecto en los foros?
De la creación de la clase, la relación entre el JavaObject i el inline Java, las importaciones de B4a...
¿Qué librería habría que añadir? ¿El archivo jar de donde descompilé ese código?

Gracias.
 

JordiCP

Well-Known Member
Licensed User
Lamentablemente no existe un tutorial único para lo que buscas porque hay mas de una manera de llegar a lo mismo. No hay fórmulas mágicas sino diferentes ejemplos y tutoriales para irse familiarizando.
Eso sí, necesitas saber un mínimo de Java y utilizar el buscador del foro. En mi opinión los tutoriales de SLC y inline Java son imprescindibles. Pelearse un poco con ellos y perder algo de tiempo es la única manera de aprender.

He integrado la librería en un ejemplo B4A y parece que saca algo (incluso creo que tiene sentido):
  • Desde el main se crea un fichero de texto y se pasa como parámetro a un método de una clase
  • Los otros parámetros son: idioma, fichero de salida, y número de iteraciones.
  • El método de esta clase que llamamos, es una función 'puente' al método principal de esta librería (traducido a inline java).
  • El resultado se escribe en el fichero de salida.
  • Al volver de la llamada se escribe el contenido de este fichero por el log.
Necesitas copiar el .jar a la carpeta de librerías adicionales.

Espero que te sirva :)
 

Attachments

  • stemmerB4A.zip
    9.5 KB · Views: 138

GeoT

Active Member
Licensed User
¡Muchas gracias JordiCP!

Tu ejemplo funciona perfectamente.
Ya vemos que lo complicado es adaptar el contenido Java al inline Java de B4A, ¿no?

Por si alguno más lo va a utilizar, le he tenido que añadir la línea
B4X:
#BridgeLogger: True
para poder ver el log en modo Release en mi dispositivo, y le he quitado la librería RandomAccesFile pues no se utiliza.

Y el archivo .jar lo bajé de Download snowball-stemmer JAR 1.3.0.581.1 with all dependencies.
Allí enumera también los idiomas que procesa.

Veremos a ver de dónde conseguimos el código Java para el catalán o el euskera, entre otros, y cómo se los añadimos.

Saludos.
 

GeoT

Active Member
Licensed User
Bueno, leyendo el archivo destino a mano, parece que no guarda la última palabra leída. :(
Y habría que tratar el texto original antes para que no contenga signos de puntuación, números ni demás, para crear o comparar del diccionario.
 

JordiCP

Well-Known Member
Licensed User
Qué raro lo de la última palabra...ni idea.
Mañana miraré el código a ver si he introducido algún gazapo o ya era así...en el peor de los casos, si lo hace siempre, se le puede añadir una palabra fija al final, no?

En cuanto a signos de puntuación y números, este "pre-procesado" se puede realizar en B4A.
 

GeoT

Active Member
Licensed User
Si, es raro.
En el archivo de entrada si está esa palabra.
Vale JordiCP. Esperamos, pero sí, sería una solución.

Si, ese "pre-procesado" ya lo tenemos preparado.

Gracias.
 
Last edited:

JordiCP

Well-Known Member
Licensed User
He mirado el código original y efectivamente se comía la última palabra porque sólo iba añadiendo los resultados parciales al fichero de salida cada vez que encontraba un espacio. Al llegar al final del texto (si el mismo no acababa con un espacio) terminaba sin más... Supongo que es debido a que era una rutina a modo de ejemplo para demostrar cómo se usa la librería.

He modificado esta parte en el inline Java para que al finalizar también compruebe si ha quedado algo a medias, parece que va bien.:)
 

Attachments

  • stemmerB4A.zip
    9.6 KB · Views: 133

GeoT

Active Member
Licensed User
Vale, muchas gracias JordiCP. :) Ahora lo pruebo.

Por mi parte, con el programa Eclipse, he importado el contenido del archivo .jar, que ya tenía descompilado, con la opción File System, y le he añadido el archivo .java de catalán que encontré. También he sustituido el .java de francés por uno que no me da errores, y he vuelto a compilar el proyecto como .jar, exportándolo como Runnable JAR File con el archivo testApp como Launch configuration. Tras quitar la copia del jar original del proyecto.

Y ahora trabaja con el lenguaje catalán también.

Saludos.
 

JordiCP

Well-Known Member
Licensed User
No debería. Cada vez que se escribe en el fichero, vacía el buffer intermedio. Lo único que he añadido es que, al final de todo, compruebe si queda algo en este buffer.

Bien hecho con lo de añadir idiomas. Por curiosidad ¿cuál es el propósito de la aplicación?
 

GeoT

Active Member
Licensed User
Vale. ¡Gracias JordiCP!

Es una plataforma móvil con red social, anuncios, negocios y tiendas online. Con su buscador, claro.

Saludos.
 
Top