Lenguajes para trabajar con Inteligencia Artificial¶
En este documento haremos un repaso a qué herramientas y lenguajes podemos utilizar para desarrollar aplicaciones de Inteligencia Artificial. Analizaremos las principales tendencias actuales, y las características básicas de cada lenguaje, para que nos ayuden a tomar una decisión sobre qué lenguaje(s) puede(n) ser apropiado(s).
1. Eligiendo un lenguaje¶
A la hora de decidir cuál es el lenguaje más utilizado en el desarrollo de aplicaciones relacionadas con la inteligencia artificial, o qué lenguaje utilizar para desarrollar una aplicación basada en IA, podemos consultar algunas opiniones en Internet, y sacar nuestras propias conclusiones. Si bien no existe un sitio "oficial" especializado en analizar este tipo de lenguajes y ofrecer un estudio comparativo objetivo (cosa que sí ocurre al analizar lenguajes de programación para propósito general), podemos encontrar opiniones diversas, como esta, esta o esta, y luego sacar nuestras propias conclusiones.
De todas estas webs de ejemplo, y otras muchas que podemos consultar, podemos sacar varios factores comunes, varios lenguajes que se repiten como aconsejables o predominantes en el mundo de la inteligencia artificial. Entre otros, y no necesariamente en este orden:
- Python
- Java
- Lisp
- C++
- R
- Julia
- Prolog
- Scala
Una vez hecha esta primera criba, podemos determinar cuál de estos lenguajes es el más popularmente utilizado en general, y para ello podemos:
- Utilizar algún listado basado en estadísticas objetivas, como el que publica semestralmente la revista online RedMonk, basado en el estudio de la presencia de dichos lenguajes en webs relevantes, como GitHub y Stackoverflow.
- Utilizar algún sistema dinámico de popularidad, como Google Trends y comparar varios de los lenguajes en los que estamos interesados.
De un modo u otro, podríamos reordenar el listado anterior de lenguajes en base a esa relevancia general, y obtener algo así (aunque algunas posiciones pueden variar ligeramente)
- Python
- Java
- C++
- R
- Scala
- Julia
- Lisp
- Prolog
A pesar de que, a día de hoy, Python y Java tienen una popularidad muy similar en el desarrollo de aplicaciones en general, hemos optado por colocar a Python en primer lugar porque su relevancia en el campo de la inteligencia artificial es mayor actualmente. En cualquier caso, es indudable que estos dos lenguajes son los más populares de entre los utilizados en el campo de la inteligencia artificial, y merece la pena centrarse en alguno de ellos.
A continuación pasamos a explicar las características más importantes de estos lenguajes, para determinar mejor nuestra futura elección.
2. Características de los principales lenguajes¶
Veremos ahora algunas de las características principales de los lenguajes identificados en el punto anterior, así como qué elementos del lenguaje lo hacen apropiado para desarrollar aplicaciones basadas en inteligencia artificial.
2.1. Python¶
Python es un lenguaje de programación creado a principios de la década de los 90 del siglo pasado. El auge que ha tenido en estos últimos años se debe, principalmente, a su facilidad de aprendizaje y uso. Es un lenguaje de alto nivel con una sintaxis muy fácilmente entendible, lo que lo convierte en un candidato muy interesante para enseñar programación en etapas intermedias (bachillerato, e incluso primeras etapas universitarias).
Es un lenguaje multiplataforma, de tipado dinámico y adaptable a distintos paradigmas: imperativo, orientado a objetos, funcional... e incluso se pueden desarrollar scripts de sistemas operativos, o videojuegos, empleando dicho lenguaje.
En lo relativo al campo que nos interesa (inteligencia artificial) dispone de diversas librerías que podemos incorporar para facilitar el desarrollo de aplicaciones de aprendizaje automático, tales como:
- Numpy, para gestionar colecciones multidimensionales de datos
- Pandas, para el análisis y filtrado de datos
- Scikit-learn, para el modelado de sistemas de aprendizaje
- Tensorflow/Keras/PyTorch, para el desarrollo de redes neuronales simples o complejas
- Matplotlib o Seaborn, entre otros, para representaciones gráficas de los datos de un problema
- ...
Para quienes no estéis muy familiarizados con el lenguaje, aquí dejamos un fragmento de código que define una función que devuelve la suma de los dos números que recibe como parámetro, y cómo utilizar esa función desde un programa:
def suma(n1, n2):
return n1 + n2
# main
resultado = suma(2, 3)
print(resultado)
2.2. Java¶
Java es otro lenguaje multiplataforma y multipropósito, desarrollado a principios de los años 90 del siglo pasado por Sun Microsystems. Es un lenguaje que funciona bajo el paradigma orientado a objetos, es decir, todo lo que definamos en Java debe definirse en clases, que luego generarán objetos en la aplicación. Es de tipado estático (debemos definir el tipo de datos de nuestras variables antes de darles un valor), y, junto con Python, constituyen hoy por hoy los dos lenguajes multiplataforma más ampliamente utilizados en las aplicaciones de propósito general (no exclusivamente orientadas a web).
Entre sus principales opciones orientadas al desarrollo de aplicaciones de inteligencia artificial, podemos destacar las siguientes:
- MLib, una librería para machine learning que funciona sobre Apache Spark, una plataforma para el procesamiento de datos a gran escala
- DL4J, una librería para desarrollo de aplicaciones deep learning
- Java-ML, una librería con distintos algoritmos y estructuras de machine learning
- MOA, Massive Online Analysis, destinada al análisis de grandes cantidades de datos
- Neuroph, framework para creación de redes neuronales
- ...
Mostramos en Java el mismo ejemplo anterior, de la función que devuelve la suma de sus parámetros, y el programa principal donde utilizarla.
public class Ejemplo
{
static int suma(int n1, int n2)
{
return n1 + n2;
}
public static void main(String[] args)
{
int resultado = suma(2, 3);
System.out.println(resultado);
}
}
2.3. C++¶
El caso de C++ (o su lenguaje originario, C) es un tanto particular. Son lenguajes creados en la década de los 60-70 del siglo pasado. Son lenguajes compilados, lo cual hace que su adaptación a diferentes plataformas sea algo más compleja (es necesario recompilar la aplicación en las distintas plataformas) y, en general, la curva de aprendizaje en estos lenguajes suele ser más pronunciada que en el resto.
¿Dónde radica la importancia de C++ en el campo de la inteligencia artificial? Tanto C como C++ tienen una cualidad importante, de la que carecen casi todos los demás lenguajes: la capacidad de acceder a los componentes físicos a bajo nivel. Esto los hace particularmente útiles para, por ejemplo, incluir algoritmos inteligentes en dispositivos físicos, donde otros lenguajes no son capaces de llegar.
C++ puede trabajar con los frameworks TensorFlow y PyTorch comentados anteriormente. También puede incorporar librerías como Caffe (para el entrenamiento y la inferencia de redes neuronales convolucionales) o Dlib (para el procesamiento de imágenes)
Mostramos cómo quedaría el mismo ejemplo anterior utilizando lenguaje C++:
#include <iostream>
using namespace std;
int suma(int n1, int n2)
{
return n1 + n2;
}
int main()
{
int resultado = suma(2, 3);
cout << resultado;
}
2.4. R¶
El caso del lenguaje R es un tanto particular. Es un lenguaje de la misma antigüedad que Python o Java (años 90 del siglo pasado) pero que ha adquirido una popularidad importante en los últimos años, a diferencia de sus coetáneos, que muy pronto ganaron esa popularidad.
Es un lenguaje multiparadigma, que podemos aplicar desde una perspectiva estructurada, funcional o incluso orientada a objetos, y su principal aliciente consiste en lo apropiado que resulta para aplicaciones de análisis estadístico, minería de datos, análisis financiero o incluso machine learning.
Al igual que ocurre con otros lenguajes, existen varios paquetes o librerías que podemos incorporar a este lenguaje relacionadas con la inteligencia artificial:
- tidyverse, un conjunto de librerías específicas para ciencia de datos
- ggplot2, para representaciones gráficas de conjuntos de datos
- dplyr, para manipulación y transformación de datos (incluida en tidyverse)
- Caret, para modelos predictivos
- kernLab, para sistemas de clasificación y regresión
- mlr3, para estructuras de machine learning en general, incluyendo técnicas de clasificación y regresión
- ...
Escribimos a continuación cómo quedaría el código del ejemplo anterior en lenguaje R:
suma <- function(n1, n2) {
n1 + n2
}
resultado <- suma(2, 3)
print(resultado)
2.5. Scala¶
Scala es un lenguaje creado en 2003, y orientado a un paradigma funcional. Este paradigma es especialmente indicado para el análisis de datos, y también se puede aplicar el lenguaje a diferentes tareas relacionadas con el ámbito del machine learning. Es un lenguaje multiplataforma y orientado a objetos, con algunas características similares a Java, con quien comparte su entorno de ejecución (JVM, máquina virtual de Java).
El ejemplo anterior traducido a Scala quedaría así:
object SumaPrograma {
def suma(a: Int, b: Int): Int = {
a + b
}
def main(args: Array[String]): Unit = {
val resultado = suma(2, 3)
println(resultado)
}
}
Scala dispone de diversas librerías para análisis de datos y machine learning, como por ejemplo:
- Spark MLib, que permite utilizar la herramienta de big data Apache Spark
- Deeplearning4j para desarrollo de modelos de aprendizaje profundo
- Smile para desarrollo de modelos de machine learning orientados a distintas tareas: regresión, clasificación, clustering...
2.6. Julia¶
Julia es un lenguaje de más reciente creación (2012), y que se ha hecho un pequeño hueco como lenguaje apropiado para el desarrollo de algoritmos inteligentes. Es un lenguaje multiparadigma (estructurado, funcional, orientado a objetos), y con ciertas utilidades que le otorgan un peso importante en tareas de computación científica y técnica.
Entre las principales librerías que podemos utilizar en este lenguaje, podemos citar Flux o Mocha (para tareas de deep learning y machine learning en general), y también otras librerías de machine learning populares como TensorFlow o Scikit tienen su correspondiente versión en Julia.
El ejemplo anterior traducido a este lenguaje quedaría así:
function suma(n1, n2)
n1 + n2
end
resultado = suma(2, 3)
print(resultado)
2.7. LISP¶
LISP es un lenguaje antiguo, de finales de los años 50 y principios de los 60 del siglo pasado. Podría considerarse un lenguaje multiparadigma, aunque con una sintaxis y estructura particular que lo hacen especialmente adecuado para paradigmas declarativos, como el funcional. En realidad LISP es el acrónimo de LISt Processor, y una de sus principales características es el uso de listas encadenadas en su sintaxis, donde todo se agrupa en paréntesis y se anida o enlaza entre sí. Inicialmente se concibió como una notación matemática práctica, y se fue abriendo poco a poco camino en el ámbito de la inteligencia artificial.
Aquí vemos cómo quedaría el ejemplo anterior en lenguaje LISP:
(defun suma (n1 n2)
(+ n1 n2)
)
(defvar resultado (suma 2 3))
(write resultado)
2.8. Prolog¶
Prolog es otro lenguaje antiguo (años 70), y también bastante orientado a aplicaciones basadas en inteligencia artificial y lógica. De hecho, su nombre proviene de la expresión en francés PROgrammation en LOGique. Es un lenguaje lógico y declarativo, donde programamos definiendo una serie de reglas o predicados que le indican al programa qué decisión tomar o qué hacer cuando reciba ciertos tipos de entradas. Su sintaxis también es particular, y difícil de aprender por lo poco que tiene en común con otros lenguajes más populares.
Aquí vemos cómo quedaría el ejemplo anterior en Prolog:
suma(A,B,R):-R is A+B.
:- initialization(main).
main :-
suma(2, 3, Resultado),
write(Resultado).
3. Lenguajes de marcado¶
Además de los lenguajes de programación, que nos van a permitir desarrollar nuestros programas basados en inteligencia artificial, tenemos que prestar atención a otro tipo de lenguajes, que nos van a permitir estructurar la información con la que podemos trabajar. Hablamos de los lenguajes de marcado. Actualmente podríamos decir que hay tres o cuatro lenguajes predominantes en el marcado o etiquetado de la información, y podemos valernos de cualquiera e ellos (y de otros adicionales) para almacenar la información con la que trabajar en nuestros programas. Veamos algunos ejemplos y características importantes.
3.1. HTML¶
HTML (HyperText Markup Language) es el lenguaje por excelencia para la generación de contenido web. Todas las páginas que podemos consultar hoy en día muestran una información etiquetada utilizando este lenguaje. A través de sus etiquetas, podemos agrupar la información en diferentes secciones o áreas, y estructurarla en forma de listas, tablas, párrafos, etc.
<!DOCTYPE html>
<html lang="es">
<head>
<title>Asociación astronómica</title>
<meta charset="utf-8">
</head>
<body>
<header>
<img src="/images/logo.png">
<h1>Asociación astronómica de San Vicente del Raspeig</h1>
<nav>
<ul>
<li><a href="inicio.html">Inicio</a></li>
<li><a href="contacto.html">Contacto</a></li>
<li><a href="proyectos.html">Proyectos</a></li>
</ul>
</nav>
</header>
<main>
<section>
<h2> Noticias de actualidad </h2>
...
</section>
<section>
<h2> Astrofotografía </h2>
...
</section>
</main>
</body>
</html>
Hay que tener en cuenta que gran parte de la información con la que trabajan los modelos de IA, especialmente aquellos enfocados desde el aprendizaje profundo, está extraída de páginas web por todo Internet. Por tanto, disponer de mecanismos que procesen contenido web para extraer los datos almacenados va a ser de suma importancia en muchos modelos.
3.2. XML¶
XML (eXtended Markup Language) es un lenguaje de marcado general, del que derivan otros como el lenguaje xHTML, similar al HTML visto antes. Permite definir un conjunto de marcas o etiquetas personalizadas con las que estructurar y clasificar la información que queremos almacenar en un documento. Así, por ejemplo, podríamos almacenar datos de un catálogo de libros en un archivo XML.
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
<libro>
<titulo>El juego de Ender</titulo>
<autor>Orson Scott Card</autor>
<paginas>325</paginas>
<fechaPublicacion anyo="1985" />
</libro>
<libro>
<titulo>La tabla de Flandes</titulo>
<autor nacimiento="1951">Arturo Pérez Reverte</autor>
<paginas>384</paginas>
<fechaPublicacion anyo="1990" />
</libro>
...
</biblioteca>
Si bien es un lenguaje de marcado cada vez más en desuso, en algunos casos la información a la que podemos acceder estará etiquetada en XML, y conviene conocer su sintaxis y particularidades para poderla procesar.
3.3. JSON¶
A pesar de que los dos lenguajes anteriores son bastante populares (especialmente HTML, aplicado al desarrollo web), a la hora de almacenar información y poderla consultar o incluso enviar en comunicaciones por la red, desde hace varios años se está imponiendo un tercer lenguaje para este propósito, llamado JSON (JavaScript Object Notation). Su popularidad se debe fundamentalmente a su simplicidad y a lo compacto que resulta en comparación con los otros dos. Se necesitan muchos menos caracteres (y por tanto, mucha menos memoria) para estructurar la misma información, y ésta se almacena en un formato similar a los arrays de objetos en JavaScript.
[{"titulo":"El juego de Ender","autor":"Orson Scott Card",
"paginas":325, "fechaPublicacion":1985},
{"titulo":"La tabla de Flandes","autor":"Arturo Pérez Reverte",
"paginas":384, "fechaPublicacion":1990}, ...]
3.4. CSV¶
CSV es el acrónimo de Comma Separated Values y, como su nombre indica, permite representar información en un fichero de texto, separándola por comas. La idea es almacenar en estos ficheros un conjunto de registros, de modo que cada registro se almacena en una línea, separando sus campos por comas (u otro delimitador, como por ejemplo el punto y coma).
La primera línea del fichero suele contener (aunque no es obligatorio) los títulos o cabeceras de cada columna de datos y, a continuación cada fila representa un registro del conjunto, dando valor a cada columna. El ejemplo de los libros anterior podríamos almacenarlo así:
titulo,autor,paginas,fechaPublicacion
El juego de Ender,Orson Scott Card,325,1985
La tabla de Flandes,Arturo Pérez Reverte,384,1990
...
Este formato de archivos se utiliza mucho en procesos de machine y deep learning, como punto de entrada al modelo que desarrollemos; la información con la que queremos entrenar al modelo para que aprenda típicamente se le proporciona en archivos de este tipo, a partir de los cuales es muy sencillo extraer la tabla de datos con la que trabajar.