Cargado Emojis y caracteres Unicode en BBDD Oracle con Python

Una codificación de caracteres no es otra cosa que la forma en la que una computadora asocia una secuencia de bits a cada carácter para su representación interna.

 

Con la consolidación de las arquitecturas basadas en 8 bit-s y la popularización del estándar US-ASCII (que utilizaba 7 bits) a comienzos de los años 70, era posible representar hasta 128 caracteres (2^7). Esto cubría perfectamente los textos escritos en inglés, pero dejaba fuera los caracteres propios de otros idiomas como los del alfabeto latino y era directamente incompatible con otros como el cirílico o el japonés.

 

Algunas organizaciones como la ISO, en colaboración con la IEC, llegaron a desarrollar extensiones de ASCII aprovechando el octavo bit, como es el caso de la serie ISO/IEC 8859. Sin embargo, todos estos códigos de caracteres seguían siendo incompatibles entre sí, problema que se puso de manifiesto con la llegada de Internet a comienzos de los 90 cuando, para enviar texto de una a otra parte del globo, era necesario acordar de antemano la codificación de caracteres a utilizar.

 

Bajo este contexto y con los objetivos de universalidad, uniformidad y unicidad, surgió el Consorcio Unicode, del que Oracle forma parte, para crear la Norma Unicode que define un conjunto de caracteres universal y su correspondencia con code points. Estos, a su vez, pueden codificarse en secuencias de bytes únicas a través de losUnicode Transformation Format de los que cuales, UTF-8 se ha convertido en el dominante con un 94.7% de la WWW, además de ser la codificación por defecto en la mayoría de los sistemas Unix. Buena parte de su éxito reside en haber sido diseñado como un superconjunto de US-ASCII, de forma que fuese retrocompatible.

 

Desde Octubre de 2010, Unicode también incorpora los emojis como caracteres ideográficos, repertorio que se han ido ampliando con las subsecuentes revisiones del estándar (la última hace tan solo unos meses). Estos pueden ser de interés de cara al análisis de sentimiento.

 

En la base de datos relacional de Oracle disponemos de los tipos de datos NCHAR y NVARCHAR2, que nos permiten almacenar texto Unicode independientemente del juego de caracteres utilizado en la BBDD. Según el uso que queramos hacer de nuestros datos, puede ser más conveniente emplear bases de datos no relacionales como la Oracle No-SQL, pero en este artículo nos centraremos en la primera.

 

A continuación veremos cómo podemos cargar texto que haga uso de esta codificación, con ayuda del controlador para Python cx_oracle y un par de bibliotecas de obligado conocimiento para cualquiera que realice tratamiento de datos con este lenguaje: pandas y sqlalchemy.

 

Pandas se diseñó como extensión de Numpy y supone un estándar de facto como marco de tratamiento de datos en Python, mientras que sqlalchemy es un “Object-relational mapping toolkit” para el mismo lenguaje.

 

Como requisito previo, debemos tener instalado Python 3.6.1 o superior y Oracle Instant Client (si necesitas más detalle de cómo instalar este último, consulta: “Instalación Oracle Instant Client (multiplataforma: Windows, Debian & Oracle Linux y Docker) paso a paso”)

También debemos instalar los paquetes Python necesarios. Mediante pip:

 

pip install -y pandas sqlalchemy cx_Oracle

 

Para este ejemplo vamos a usar una extracción de datos de la red social Twitter:

 

 

Ajustaremos los parámetros “USER”, “PASS”, “HOST”, “PORT” y “SERVICENAME” en la cadena de conexión a nuestra BBDD, acto seguido, ejecutaremos la siguiente pieza de código:

 

 

import os
import pandas as pd 
from sqlalchemy import create_engine, types
   

# Inicializar variable de entorno 'NLS_LANG'
os.environ["NLS_LANG"] = 'SPANISH_SPAIN.AL32UTF8'


# Crear el motor de comunicación de BBDD 
DBengine = create_engine('oracle+cx_oracle://USER:PASS@HOST:PORT/?service_name=SERVICENAME') 


# Leer el fichero CSV 
data = pd.read_csv('tweets.csv', encoding='utf-8')


# Seleccionar las columnas deseadas
data = data[[data.columns[0], data.columns[2], data.columns[9]]]  


# Renombrar las columnas
data.columns = ['id', 'text', 'likes']

#Definir los tipos de datos 
datatypes = {'id': types.NUMERIC, 'text': types.NVARCHAR(2000), 'likes': types.NUMERIC} 


# Cargar el resultado en BBDD
data.to_sql('tweets', DBengine, index=False, index_label='ID', dtype=datatypes)

 

 

Tras ejecutar el script podemos comprobar que el contenido del fichero se ha cargado correctamente en nuestra base de datos:

 

 

Ten en cuenta que, para visualizar correctamente los emojis desde Oracle SQLDeveloper, es necesario utilizar una Fuente que soporte Unicode:

 

 

Referencias:

Twitter
LinkedIn
Evolución, innovación y transformación
18 Service Expertise avalados por Oracle 
Nuestra propuesta de valor
Posts 100% Oracle
Sigue nuestro día a día