El Procesamiento del Lenguaje Natural (PLN) tiene un importante papel en la inteligencia artificial (IA) al permitir que las máquinas comprendan y respondan al lenguaje humano. Las aplicaciones de estas tecnologías son muy variadas y muchas están aún por desarrollar. En el campo de los SIG, la IA se puede utilizar de muchas formas, aquí nos centraremos en desarrollar una aplicación del PLN a webmapping.

Planteamiento del problema
Una de las herramientas que podemos utilizar en un mapa web es el Geocoding que consiste en buscar una ubicación de una dirección o lugar utilizando una base de datos como Nominatim, la base de datos de OpenStreetMap. En Leaflet tenemos algunos plugins que pueden realizar esta función. Podemos ver cómo funciona en esta demo.
En este ejemplo, si escribimos una ubicación como «Sevilla» nos muestra la ubicación en el mapa. ¿pero qué sucede si el usuario escribe algo como «Me gusta viajar por Sevilla»? El resultado es que obtendremos un error.

La cuestión es por tanto, si podemos hacer algo para extraer una localización de un texto y de esa forma poder utilizarlo en un mapa para obtener la Geolocalización.
Procesamiento Natural del Lenguaje
El procesamiento de lenguaje natural PLN (o NLP por sus siglas en inglés), es un campo de las ciencias de la computación, de la inteligencia artificial y de la lingüística que estudia las interacciones entre las computadoras y el lenguaje humano. Hay varias herramientas de NLP, simples que nos permiten realizar la tarea que nos hemos planteado. Una opción es Compromise.
Compromise es una biblioteca de JavaScript para el procesamiento de lenguaje natural (NLP). Está diseñada para trabajar de forma rápida y sencilla con texto, siendo liviana y fácil de usar. Su sencillez es sin duda una ventaja, pero eso tiene el inconveniente de que sus resultados no son muy eficientes, por lo que optaremos por utilizar otra herramienta como es spaCy:
spaCy es una biblioteca gratuita y de código abierto para el procesamiento avanzado del lenguaje natural en Python. spaCy está diseñado específicamente para su uso en producción y nos ayuda a crear aplicaciones que procesan y «entienden» grandes volúmenes de texto. Puede utilizarse para crear sistemas de extracción de información o de comprensión del lenguaje natural, o para preprocesar texto para el aprendizaje profundo.
spaCy
Vemos un ejemplo, en que utilizaremos los cuadernos de Google Colab porque nos permite utilizar Python de forma sencilla.
Lo primero es instalar spaCy y descargar el idioma español:
# Instalar spaCy !pip install spacy # Descargar el modelo de idioma español !python -m spacy download es_core_news_md
A continuación escribimos un texto y lo procesamos con spaCy:
import spacy
# Cargar el modelo de idioma español
nlp = spacy.load("es_core_news_md")
# Ejemplo de texto
texto = "En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lantejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda."
# Procesar el texto
doc = nlp(texto)
# Extraer entidades de tipo ubicación (LOC, GPE)
lugares = [ent.text for ent in doc.ents if ent.label_ in ["LOC", "GPE"]]
print("Lugares identificados:", lugares)
print("Frases nominales:", [chunk.text for chunk in doc.noun_chunks])
print("Verbos:", [token.lemma_ for token in doc if token.pos_ == "VERB"])
# Entidades, frases y conceptos
for entity in doc.ents:
print(entity.text, entity.label_)
El resultado que obtenemos es el siguiente:
- Lugares identificados: [‘la Mancha’].
- Frases nominales: [‘un lugar’, ‘la Mancha’, ‘cuyo’, ‘un hidalgo’, ‘lanza’, ‘astillero’, ‘, adarga antigua’, ‘, rocín flaco’, ‘galgo’, ‘Una olla’, ‘algo’, ‘que’, ‘las más noches’, ‘, duelos’, ‘quebrantos’, ‘los sábados’, ‘los viernes’, ‘algún palomino’, ‘los domingos’, ‘las tres partes’, ‘su hacienda’].
- Verbos: [‘querer’, ‘acordar yo’, ‘vivir’, ‘carnero’, ‘salpicón’, ‘consumir’].
- la Mancha LOC.
- Una olla de algo más vaca MISC.
Como podemos ver, spaCy es capaz de discriminar lugares, frases nominales o verbos (aunque aquí con dificultades). En este ejemplo se lo hemos puesto difícil pues estamos utilizando un texto de la novela «Don Quijote de la Mancha» que no utiliza el castellano moderno y por tanto, el modelo etiqueta incorrectamente ‘carnero’ o ‘salpicón’ como verbos, debido a las limitaciones en el contexto o al entrenamiento del modelo.
Vemos también que «la Mancha» está etiquetada como LOC y «Una olla de algo más vaca» como MISC. SpaCy utiliza etiquetas para clasificar los términos. LOC se refiere a lugares geográficos y MISC a la categoría de «Miscelanea».
Obtener nombres de los lugares
Ahora que ya hemos visto cómo funciona spaCy vamos a utilizarlo para extraer los lugares de un texto:
import spacy
# Cargar el modelo de idioma español
nlp = spacy.load("es_core_news_md")
# Ejemplo de texto
texto = "Me gusta viajar por Sevilla y visitar la Alhambra en Granada."
# Procesar el texto
doc = nlp(texto)
# Extraer entidades de tipo ubicación (LOC, GPE)
lugares = [ent.text for ent in doc.ents if ent.label_ in ["LOC", "GPE"]]
print("Lugares identificados:", lugares)
En el código anterior vemos que hace referencia a dos tipos de etiquetas «LOC» y «GPE». Como explicamos antes, LOC se usa para ubicaciones puramente geográficas mientras que GPE incluye entidades políticas o administrativas, como países, ciudades o estados.
El resultado que obtenemos es:
Lugares identificados: [‘Sevilla’, ‘la Alhambra’, ‘Granada’]
Integrar spaCy en Folium
Folium es una biblioteca de Python que permite la la visualización de datos en un mapa Leaflet interactivo. Folium podemos utilizarlo dentro del entorno de Google Colab pero también podemos exportarlo para obtener un archivo HTML, con el que publicar el mapa web.
Para entender mejor el código vamos a dividirlo en secciones.
Primero. Importamos las herramientas que vamos a necesitar:
import spacy
import requests
import folium
import time
from requests.utils import quote
# Cargar el modelo en español de spaCy
nlp = spacy.load("es_core_news_md")
Segundo. Creamos una función para buscar las coordenadas de los lugares usando la API de Nominatim.
def obtener_coordenadas(lugar):
url = f"https://nominatim.openstreetmap.org/search?q={quote(lugar)}&format=json"
headers = {
"User-Agent": "mi-aplicacion-de-ejemplo"
}
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
if data:
return float(data[0]['lat']), float(data[0]['lon'])
else:
print(f"No se encontraron resultados para: {lugar}")
return None
else:
print(f"Error en la API para {lugar}: {response.status_code}")
return None
except Exception as e:
print(f"Error al buscar {lugar}: {e}")
return None
finally:
time.sleep(1)
Tercero. Procesamos el texto con spaCy para obtener los nombres con los lugares:
texto = "Me gusta viajar por Sevilla y visitar la Alhambra en Granada." # Procesar el texto con spaCy doc = nlp(texto) # Extraer entidades relacionadas con ubicaciones (LOC y GPE) lugares = [ent.text for ent in doc.ents if ent.label_ in ["LOC", "GPE"]]
mapa = folium.Map(location=[40.0, -3.7], zoom_start=6)
print("Lugares identificados:", lugares)
# Buscar cada lugar identificado y agregarlo al mapa
for lugar in lugares:
coords = obtener_coordenadas(lugar)
if coords:
folium.Marker(
location=coords,
popup=lugar,
icon=folium.Icon(color="blue", icon="info-sign")
).add_to(mapa)
else:
print(f"No se pudieron agregar coordenadas para: {lugar}")
# Mostrar el mapa
mapa
El resultado es que vemos el mapa con las ubicaciones de los lugares incluidos en el texto:

En consecuencia, podemos ver que algunas herramientas de la inteligencia arficial, como es el caso del Procesamiento del lenguaje podemos aplicarlas en webmapping. Aquí hemos trabajado con un ejemplo muy simple que únicamente pretende servir como una aproximación a este interesante tema.
Tutor del curso online de Análisis GeoEspacial con Python y de los cursos online de webmapping. Echa un vistazo a todos nuestros cursos de SIG online.