Mi opinión sobre éstas elecciones

Un día antes del 20D estaba seguro que Podemos y PsoE se entenderían pasadas las elecciones. Que hablarían y llegarían a un acuerdo. Al fin y al cabo, dos partidos de izquierdas, con programas casi idénticos, voluntad de cambio, preocupación por el sufrimiento de la población, etc. ¿qué podía fallar?

Pasaron las fiestas y vimos como se movía poco todo. Después, en orden cronológico:

  1.  El 22 de enero Pablo Iglesias propone un Gobierno de coalición junto al PsoE. Sánchez, al ser segunda fuerza, sería Presidente. Iglesias, al ser tercera, vicepresidente.  Algo bastante razonable a mi parecer. Acto seguido y como ya viene siendo de lamentable costumbre, numerosos ataques hacia Iglesias. Sánchez no contesta. No se moja. No puede.
  2. El 3 de febrero el rey propone a Sánchez a la investidura. De forma totalmente inexplicable para mi y para muchos entonces, ese mismo fin de semana, Sánchez inicia su negociación con Ciudadanos. La excusa fue el respaldo de Podemos  a que haya un referéndum en Catalunya. La realidad es que en ningún momento se habló sobre Catalunya ni entonces ni meses después. Sobre ésto, me gustaría añadir que, aunque Podemos siempre mantuvo que esa no era una linea roja, que si el PsoE tenía una mejor solución estaba dispuesto a escucharla, me parece muy triste que no gocemos de la salud democrática ni la valentía de otros países como UK o Canadá. Aquí sobre ese tema simplemente se difama: “Podemos quiere romper España”.
  3. El 23 de febrero PsoE y Cs dan a conocer el pacto alcanzado. Un pacto que como puntos a tener en cuenta:
    1. Rivera se pavoneaba de haber “colado” el 80% del programa de Cs en él. 
    2. Implicaba un contrato único que en realidad era una forma encubierta de reducir aún más la indemnización por despido
  4. Como sabéis, luego vinieron presiones a Podemos para votar a favor de ese pacto (eso si, que ni se les ocurra modificar nada). Prohibido tocar. “Voten a favor y a callar”, parece ser que pensaron. Aquí al menos el PsoE fue claro: si no lo hacían, los acusarían de estar a favor del PP. La pinza y todo eso. Y así han seguido hasta hoy.

Lo demás, como sabéis fue la no investidura de Sánchez y que estemos a punto de celebrar nuevas elecciones.

Pero entonces, mientras la maquinaria del PsoE iniciaba su ataque feroz contra Podemos, algo muy esclarecedor sucedió en Twitter. Fue el 8 de abril:

Para quién no lo sepa, José Antonio Pérez Tapias es, además de ex-diputado del PsoE, miembro de su Comité Federal. Para quién tampoco lo sepa, el Comité Federal del PsoE es el encargado de decidir entre otras cosas la política de pactos del partido.

Es decir, desde el 28 de diciembre Sánchez sabía que no podía pactar con Podemos. Los barones, que son los que deciden realmente en el PsoE, se lo habían prohibido. Y es esa la razón por la que volvemos a tener elecciones. Demos las gracias a personas como Susana Diaz, Fernández Vara o García Page. Ellos son los responsables. No Podemos.

Y que nadie se equivoque. Estos barones odian literalmente a Podemos. Son la casta. Saben que lo son y saben que si llega Podemos se les acaba el chollo. Se les acaba el enchufismo a sus amigos y las subvenciones. Se les acaba el vivir del betusto bipartidismo que ha traído a las zonas donde gobernaban niveles de desarrollo y paro propios de países del tercer mundo. Son gente que no creen en la democracia. Gente como Ibarra que dice que el resultado de las elecciones fue “un inmenso error”. Como si los ciudadanos y su voluntad pudieran estar de alguna manera equivocadas. Como si él estuviera en posesión de la verdad y no la voluntad de la mayoría. Qué miedo.

Sinceramente, ojalá me equivoque, pero no veo a Pedro Sanchez pactando con Pablo Iglesias y haciéndolo presidente. Mis apuestas son:

  1. La más probable: el PsoE se la pega históricamente again. Sánchez se ve obligado a dimitir. El repuesto (o la substituta) pacta con el PP la gran coalición por algún “sentido patrio” que ellos mismos inventen o permite a través de la abstención “por sentido de estado” otro gobierno del PP.
  2. Vuelven a jugar al matrimonio PsoE + Cs contando otra vez el mismo cuento: si Podemos no quiere al PP, tendrá que hacer presidente a Sanchez. Aunque hayan quedado terceros, da igual.

La verdad es que es lamentable que haya un candidato a la presidencia que se niegue a decir con quién va a pactar por puro interés electoral. Seguramente una postura sincera y honesta le haría perder menos votos de los que acabará perdiendo. Encima, se atreve con las carcajadas cuándo se le pregunta sobre el tema. Debería ser obligatorio contestar/definirse. Y más en éstas elecciones.

Para acabar, y sólo por puntualizar, otra cosa que se repite y repite por parte del PsoE es que PP y Podemos votaron en contra juntos. Han llegado a decir ridículamente que éstos dos partidos tienen un acuerdo para no atacarse. La realidad, es que el día de la fallida investidura votaron en contra TODOS los partidos menos los dos que pactaron: PSOE y Cs y Coalición Canaria que se abstuvo. Dejen de desinformar, manipular y columniar por favor.

 

Publicado en Uncategorized | Deja un comentario

How to use Stanford NER with Spanish text

Last week I was trying to find a Java library to execute NER (Named Entity Recognition) in Spanish. I have used FreeLing in the past and I have to say that it’s quite good. The point is that this time I wanted to avoid making calls to C code from Java. My first intention was to try using OpenNLP. I made some tests with his Spanish models but I felt quite disappointed with the accuracy so I decided to move on and look for another library. The next one was the Stanford Named Entity Recognizer. This is a pure Java 8 library from the Stanford Natural Language Processing Group. After some tests, I realized that this would be my choice. The precision was really good, both in English and Spanish.

These are the steps to follow in order to integrate it as a Java library:

  1. Download latest version of Stanford Entity Recognizer (currently 3.6.0)
  2. Unzip it. You will find some shell scripts to play, the jar (stanford-ner.jar), javadoc and sources. There is also a folder named ‘classifiers’ with the English models and a folder ‘lib’ with the extra needed dependencies.
  3. Download spanish models (this is a jar file, unzip it and go to /edu/stanford/nlp/models/ner folder. Then copy the “spanish.ancora.distsim.s512.crf.ser.gz” file to a folder included on your application classpath. For example src/main/resources.
  4. Add stanford-ner.jar to the classpath of your application. I decided to “mavenize” this jar as a local maven artifact, using the standard Maven command:
mvn install:install-file -Dfile=stanford-ner.jar -DgroupId=com.tesnick.ai.nlp.ner -DartifactId=stanford-jar-Dversion=3.6.0 -Dpackaging=jar

After this I added to my pom.xml the dependency:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

(maybe you need to some extra dependencies, like slf4j or joda-time. In my case I had only to add slf4j-api)

Finally, to use it you can try something like:

String spanishSerializedClassifier = "spanish.ancora.distsim.s512.crf.ser.gz";

String englishSerializedClassifier = "english.all.3class.distsim.crf.ser.gz";
AbstractSequenceClassifier<CoreLabel> classifier = CRFClassifier.getClassifier(spanishSerializedClassifier);

List<List<CoreLabel>> classifier.classify("David Bowie toma las calles del mundo.");

for (List<CoreLabel> coreLabels : apply) {
    System.out.println(coreLabels);

    for (CoreLabel word : coreLabels) {
        System.out.print(word.word() + '/' + word.get(CoreAnnotations.AnswerAnnotation.class) + ' ');
    }
}
The result will be:

[David, Bowie, toma, las, calles, del, mundo, .]
David/PERSON Bowie/PERSON toma/O las/O calles/O del/O mundo/O ./O  

 You can download a sample code project on my github page.

Publicado en Artificial Intelligence, named entity recognition, natural language processing, ner, nlp, Uncategorized | Deja un comentario

Una solución al dilema post-electoral

resultados_20DMinutos después de conocerse los resultados de las elecciones de éste 20D, algunos ya se apresuraban a decir que iba a ser imposible formar gobierno y haría falta ir a unas anticipadas. Otros, los defensores de la “estabilidad económica” (por decirlo finamente) presionan por una “gran coalición anti-podemos”. Desde mi punto de vista, esas dos opciones son bastante probables, pero aún existe una solución para los que defendemos que las cosas cambien definitivamente a mejor.

Así están las cosas para tener un acuerdo PSOE + Podemos:

  • Podemos tiene como linea roja que haya un referéndum en Catalunya
  • PSOE tiene como linea roja que no se rompa la soberanía nacional

Éste es el punto que hace que no se puedan entender los dos partidos mayoritarios de izquierdas en España. Es triste, sí. Pero es así: no se ponen de acuerdo en si se debe consultar a los ciudadanos o no. Cosas de la poca cultura democrática española? Yo creo que si. Franco hizo mucho daño y todo eso… pero bueno, eso es otro tema. El caso es que entre los dos, tienen 159 diputados. Si además sumamos IU, 161.

Solución: permitir el referéndum sobre Catalunya PERO consultando a todos los españoles. De ésta forma, tanto los catalanes (que siempre han dicho que no les importaría hacerlo así y que podrían ver los resultados desglosados por comunidad autónoma) como el resto (porque participarían de la consulta, es decir, nadie les robaría su soberanía) estarían un poco contentos (de eso se trata negociar no?). Se desencallaría por fin una situación que lleva 4 años “torturando” a muchos catalanes y muchos no catalanes. Entre ellos yo. Además de ser el combustible que da de beber a una parte del independentismo catalán.

Sobre si debiera ser vinculante o no, creo que no deberíamos tener miedo a hacerlo vinculante. Demostrar voluntad de diálogo y consenso es lo único que puede devolver los % del Sí al periodo pre-rodillo-del-Estatut. En cualquier caso, si el hecho de hacerlo vinculante fuera una linea roja, siempre se puede hacer uno no-vinculante. La cuestión es conocer la opinión del pueblo de Catalunya forma inequívoca (no como hasta ahora…). Eso es lo que quiere el 80-90% de los catalanes.

Volviendo al tema, para poder investir a un Presidente (en este caso, creo que lo lógico sería que fuera Sánchez, que ha sacado más votos y escaños) haría falta, al menos, una mayoría simple (es decir, tener más votos a favor que en contra).

  • A favor, PSOE + Podemos + IU -> 161
  • En contra, es casi seguro que tendrían PP y Ciudadanos -> 123 + 40 = 163.

161 < 163, osea que aún harían falta al menos 3 votos. Podría ERC, DL (o las dos) ceder sus 9 y 8 votos respectivamente, o como mínimo 3 a cambio del referéndum? Yo creo que sí.  Y sino, cosa bastante improbable, quedan otros 11 diputados de los otros partidos minoritarios a los que preguntar. No parece algo bastante sensato y razonable?

En definitiva, si acabamos con un gobierno PP+PSOE+Ciudadanos, PP + PSOE o en nuevas elecciones, será porque alguien está interesado en que nada cambie y/o en que el llamado “problema catalán” se acentúe aún más.

Otra cosa que puede pasar, si no se trata ésta solución a tiempo, es que éste domingo la CUP decida investir a Mas y el lunes el PSOE en su comité, por “responsabilidad de estado”, decidan formar gobierno con las derechas (aka “partidos constitucionalistas”, PP y Ciudadanos). Entonces, los que piensan en “estabilidad”, estarán provocando justo lo contrario. La vía del inmovilismo no solucionará el problema catalán.

Publicado en Uncategorized | Deja un comentario

Mi voto

Hace algo más de 4 años, el 15 de mayo del 2011, algo crujió en España. La gente, entre ellos yo, estábamos ya muy hartos.  Hartos de lo que llamaban hasta entonces la “clase política”. Después, alguien supo ponerle un alias más acertado: la “casta”.

La definiría con estas características:

  1. Cero empatía con el sufrimiento de la sociedad
  2. Total impunidad para hacer o deshacer a su antojo
  3. Lejanía absoluta respecto los problemas reales de la gente
  4. Corrupta como medio de funcionamiento
  5. Manipuladora de los medios de información
  6. Incapaz o con insuficiente formación para los puestos que ocupan en muchos casos
  7. Apoyo a los grandes poderes económicos
  8. Se perpetúa con ingresos públicos o salta a la empresa privada como alto cargo

 

Era un sentimiento común de rabia y condena hacia el status quo. Una emoción. Una ambición genuina por cambiar las cosas de raíz. Incapaz de aceptar cualquier arreglo estético. Una seguridad en merecernos algo más. Era, como bien se dijo, una voluntad por más y mejor democracia.

Bien, pasado el 15M llegaron las generales en noviembre de ese mismo año y con ellas el PP al poder. Parecía que ésto del 15M habían sido cuatro locos radicales, cómo dijeron los medios. Aunque algunos otros enseñaban interesantes encuestas. Éste, por ejemplo, hablaba que un 72% de los encuestados estaba a favor de las ideas del 15M. Algo raro estaba pasando.

Ya no había un horizonte electoral próximo hasta 2014, así que pasaron los meses, los recortes, las subidas de impuestos, los casos de corrupción, los SMS a Bárcenas… así hasta llegar a ese 2014. Fue entonces cuándo algunos decidieron hacer caso a los que les pedían que se presentaran a las elecciones. Y así fue en las europeas, contra todo pronóstico, 1.253.837 votos. Un inesperado 7,98%.

Entonces, el efecto bola de nieve y la aparición continua en TV hizo el resto. Podemos creció y creció. Empezaba a parecer como un partido con posibilidades de ganar y capaz de cambiar las cosas… así que el miedo empezó a cuajar en los sectores que realmente controlan éste país. Y con ello, empezaron los ataques. Todo ésto se puede ver más claramente aquí, mirando desde Mayo de 2014 (las europeas) hasta Diciembre (el auge) y de allí hasta Octubre (los ataques y la desaparición en los medios).

Y luego llegó, en cosa de dos/tres meses, de Octubre a ahora, la remontada. Hoy, la noticia es la cara de Merkel cuándo Rajoy le comenta que Podemos podría ser segunda fuerza.

Este domingo las cosas pueden cambiar por fin. Han pasado casi 40 años que nos han servido para aprender qué queremos y qué no queremos. No olvidamos. Se huele cambio. Se huele esperanza y se percibe esa emoción que cuatro años antes, activaba este maravilloso mecanismo que es el progreso. Y si, algunos nos emocionamos con él.

 

 

 

Publicado en Uncategorized | Deja un comentario

Carta abierta a Pablo Iglesias

Hace unos 20 meses, poco más de año y medio, Podemos no existía. España se pudría en corrupción, más o menos como ahora, pero además, sin ninguna esperanza. Entonces llegaron las elecciones europeas y aparecisteis vosotros. Fuisteis el cuarto partido más votado. Después, vino el subidón. Optábais a la pole position, decían. La esperanza crecía. Muchos de los que nos identificamos profundamente con los movimientos del 15-M veíamos por fin alguien que sí nos representaba. Alguien que hablaba el mismo lenguaje que nosotros. Lo quiero decir de nuevo, esperanza.

Después, como todo subidón, tocó el bajón. El escándalo Monedero, el “escándalo” (por llamarlo de alguna manera) Errejón, Venezuela… Ya sabes.  Pero también vinieron las autonómicas y municipales. Ahora parecen ya lejanas, aunque sólo han pasado cinco meses. Allí, vivimos impagables momentos, como ver irse a su casa a Esperanza Aguirre, Rita Barberá o Xavier Trias. La casta Pablo, no lo olvidemos. Hagamos memoria, que no hace tanto. ¿Quién contaba con esto hace 20 meses?

Entonces llegaron las catalanas. Y como bien reconocisteis, la cosa fue mal. Y fue mal, a mi humilde entender, porque la desconexión entre Catalunya y España es ya un hecho. (añado: y lo será más si no entra un gobierno responsable y valiente el 20D). Quedó de manifiesto, aunque me duele decirlo, que no supisteis captar la transcendencia que tenían. Porque los catalanes queríamos ir a votar hacía mucho. Y además, queríamos votar si o no a la independencia. Y como la participación demostró, así lo hicimos. Añado que Podemos no supo transmitir claramente su posición, cosa que provocó la lamentable actuación de algunos, contando esos votos hacia su lado, por puro y duro interés.

Y aquí es dónde quería llegar. Después de eso, te he visto triste, alicaído. Tocado. Diría que incluso medio hundido. Como si olvidaras lo que habéis hecho en éste poco más de año y medio. Como si olvidaras, que todo esto, tenía un único objetivo: ganar las generales. Y ahora, a dos meses vista, te rompes. Mira Pablo, no te conozco, pero creí conocerte escuchándote mientras argumentabas con razón, pasión y valentía las razones por las que estabas aquí. Cuándo eras políticamente incorrecto. Cuándo se te escapaba algún taco. Cuándo incluso, si tenías que levantar la voz, la levantabas. Creo que ése es el Pablo que hizo y puede hacer aún cambiar las cosas en este extraño país. Ese, que ahora no está. Ese que el domingo no vi en Salvados.  Ese que nunca tiraría la toalla antes del combate más decisivo.

No te lo permitimos Pablo. Lo siento. Somos muchos los que contamos contigo. Somos muchos, jóvenes y viejos, del #nolesvotes, de las mareas, de la PAH o de ninguno de esos sitios, que estamos muy hartos del statu quo. Hartos de la corruptela, el amiguismo y la pandereta. Nos diste esperanza, ahora, estos 2 meses que quedan, a currar.

Quiero acabar recordándote ésto: “que se presenten a las elecciones”. Un saludo.

 

 

 

 

 

 

Publicado en Uncategorized | Deja un comentario

Benchmarking ‘Hadoop The Definitive Guide Chapter 2’ approaches

Following the previous post, I thought it could be interesting to execute some benchmarks to check the execution time of each implementation approach on the Hadoop The Definitive Guide book Chapter 2.

To focus on the problem, the book exercise consists of processing a big file performing an aggregation operation with its data. More specifically:

  • For the benchmark, I’ve created a relatively big file (named noa.all) following the instructions defined on the previous post. It’s a txt file with 16.873.949 lines of Weather Data (4.1 Gigabytes). Each line represents the measurement of weather data (we’re only interested in air temperature and year of measurement) from a weather sensor across the globe.
  • The aggregation operation consists of getting the max value of temperature by year.

The implementation approaches proposed by the book are:

  1. Using Unix Commands (cat and awk)
  2. Using Hadoop (with and without a combiner function)
  3. Using Hadoop Streaming with Ruby (with and without a combiner function)
  4. Using Hadoop Streaming with Python (with and without a combiner function)

And these are the execution time results:

Label Approach Time in seconds
1 cat + awk 23.482
2 cat + python script 82.675
3 Hadoop Streaming with combiner + python 84.359
4 cat + ruby script 86.169
5 Hadoop Streaming with combiner + ruby 89.356
6 Hadoop Streaming + python 90.558
7 Hadoop Streaming + ruby 93.952
8 Hadoop with combiner function 114.527
9 Hadoop 123.788

 

It’s easier to appreciate on a graphic:

cropped

Conclusions

It seems clear that the most optimized approach using only one machine is using Unix commands. Python and Ruby are the second and third best options. The overhead using Hadoop with Java code is not justified in this case. In case we need to reduce more the execution times and if we had several machines, we could consider the Hadoop option. As it ‘s explained in the book, in this case, using a 10-node EC2 cluster running High-CPU Extra Large instances, the program takes seven times less than the naive AWK version does.

How to execute the benchmark

I used the Ruby and Python scripts provided by the git repo from the book. They are on the ch02-mr-intro/src/main/python and ch02-mr-intro/src/main/ruby folders.

The script to execute the cat + awk commands, is a modified version of the max_temperature.sh file (ch02-mr-intro/src/main/awk). This is the code:

#!/usr/bin/env bash

target=”/home/user/Projects/Hadoop/noaa.all”;

cat $target |
awk ‘{ temp = substr($0, 88, 5) + 0;
q = substr($0, 93, 1);
if (temp !=9999 && q ~ /[01459]/ && temp > max) max = temp }
END { print max }’

You can download it from here.

Commands executed:

Command
1 time max_temperature_modified.sh
2 time cat noaa.all | max_temperature_map.py | sort | max_temperature_reduce.py
3 time hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar -input noaa.all -output output -mapper max_temperature_map.py -combiner max_temperature_reduce.py -reducer max_temperature_reduce.py
4 time cat noaa.all | max_temperature_map.rb | sort | max_temperature_reduce.rb
5 time hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar -input noaa.all -output output -mapper max_temperature_map.rb -combiner max_temperature_reduce.rb -reducer max_temperature_reduce.rb
6 time hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar -input noaa.all -output output -mapper max_temperature_map.py -reducer max_temperature_reduce.py
7 time hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar -input noaa.all -output output -mapper max_temperature_map.rb -reducer max_temperature_reduce.rb
8 time hadoop MaxTemperatureWithCombiner noaa.all output
9 time hadoop MaxTemperature noaa.all output

You can download a shell script with all the commands from here.

Environment used

Ubuntu 14.04.3

Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz

8 GB Ram

 

Publicado en Big Data, Hadoop | Deja un comentario

Data for ‘Hadoop The Definitive Guide’ book, chapter 2

Some weeks ago I read the book “Hadoop The Definitive Guide“. In the second chapter, the book explains MapReduce followed by an example using information from the National Climatic Data Center (www.ncdc.noaa.gov).

To get the NCDC Weather data, the book refers to the Appendix C. There you can find the link to the book:

http://www.hadoopbook.com

If you go to the link, and navigate to the “Code and Data” menu, you will find the link to the GitHub repository:

http://github.com/tomwhite/hadoop-book/

Here is the interesting part:

“A sample of the NCDC weather dataset that is used throughout the book can be found at https://github.com/tomwhite/hadoop-book/tree/master/input/ncdc/all.

“The full dataset is stored on Amazon S3 in the hadoopbook bucket, and if you have an AWS account you can copy it to a EC2-based Hadoop cluster using Hadoop’s distcp command.”

So that’s it. If you are interested, you can try with AWS. In my case I prefer to get the data directly from the NCDC Web, so I found this link:

https://www.ncdc.noaa.gov/cdo-web/datasets

Here is the step by step procedure:

  1. Click on Legacy Applications -> Global Hourly Data
  2. Click on FTP button

Then you’ll arrive to the ftp with all the data from 1901 to 2015:

ftp://ftp.ncdc.noaa.gov/pub/data/noaa/

I hope this is useful for someone!

PD. Remember, to follow the book exercise, it’s necessary to preprocess the files generating only one by year. The reason to do so, according to the book, is that process of smaller number of relatively large files is easier and more efficient. You can use this shell script to do this:

#!/usr/bin/env bash

# NCDC Weather file to load into hadoop
target=”/home/user/Projects/Hadoop/data/noaa”;

# Un-gzip each station file and concat into one file
echo “reporter:status:Un-gzipping $target” >&2
for file in $target/2005/*
do
gunzip -c $file >> $target.all
echo “reporter:status:Processed $file” >&2
done

You can download it from here.

Publicado en Big Data, Hadoop | 1 Comentario