Explorando la investigación sobre la igualdad de género con NLP y Elicit

Exploring gender equality research with NLP and Elicit.

Introducción

El procesamiento del lenguaje natural (NLP, por sus siglas en inglés) nos puede ayudar a comprender grandes cantidades de datos de texto. En lugar de revisar manualmente una gran cantidad de documentos y leerlos uno por uno, podemos utilizar estas técnicas para acelerar nuestra comprensión y llegar rápidamente a los mensajes principales. En esta publicación de blog, profundizaremos en la posibilidad de utilizar marcos de datos de panda y herramientas de NLP en Python para tener una idea de lo que la gente escribió cuando investigaba sobre la igualdad de género en Afganistán utilizando Elicit. Estos conocimientos podrían ayudarnos a comprender qué funcionó y qué no funcionó para avanzar en la igualdad de género durante las últimas décadas en un país que se considera uno de los lugares más difíciles para ser una mujer o una niña (Foro Económico Mundial, 2023).

Objetivo de Aprendizaje

  • Adquirir competencia en el análisis de texto en archivos CSV.
  • Obtener conocimientos sobre cómo realizar procesamiento del lenguaje natural en Python.
  • Desarrollar habilidades en visualización efectiva de datos para la comunicación.
  • Obtener información sobre cómo ha evolucionado la investigación sobre la igualdad de género en Afganistán a lo largo del tiempo.

Este artículo fue publicado como parte del Data Science Blogathon.

Uso de Elicit para Revisiones de Literatura

Para generar los datos subyacentes, utilizo Elicit, una herramienta impulsada por inteligencia artificial para revisiones de literatura (Elicit). Le pido a la herramienta que genere una lista de artículos relacionados con la pregunta: ¿Por qué fracasó la igualdad de género en Afganistán? Luego descargo una lista resultante de artículos (considero un número aleatorio de más de 150 artículos) en formato CSV. ¿Cómo se ve estos datos? ¡Echemos un vistazo!

Análisis de Datos CSV de Elicit en Python

Primero leeremos el archivo CSV como un marco de datos de pandas:

import pandas as pd

#Identificar ruta y archivo CSV
file_path = './elicit.csv'

#Leer archivo CSV
df = pd.read_csv(file_path) 

#Forma del CSV
df.shape

#Salida: (168, 15)

#Mostrar las primeras filas del marco de datos
df.head()

El comando df.head() nos muestra las primeras filas del marco de datos de pandas resultante. El marco de datos consta de 15 columnas y 168 filas. Generamos esta información con el comando df.shape. Primero exploremos en qué año se publicaron la mayoría de estos estudios. Para explorar esto, podemos aprovechar la columna que informa el año de publicación de cada artículo. Hay varias herramientas para generar gráficos en Python, pero aquí confiaremos en la biblioteca seaborn y matplotlib. Para analizar en qué año se publicaron la mayoría de los artículos, podemos aprovechar un llamado countplot, y también personalizar las etiquetas y marcas del eje para que se vea bien:

Análisis de la Distribución de Tiempo de los Artículos Publicados

import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

#Establecer el tamaño de la figura
plt.figure(figsize=(10,5))

#Producir un countplot
chart = sns.countplot(x=df["Year"], color='blue')

#Establecer etiquetas
chart.set_xlabel('Año')
chart.set_ylabel('Número de artículos publicados')

#Cambiar el tamaño de las marcas del eje x
# Obtener texto de etiqueta
_, xlabels = plt.xticks()

# Establecer las etiquetas del eje x
chart.set_xticklabels(xlabels, size=5)

plt.show()

Los datos muestran que el número de artículos aumentó con el tiempo, probablemente también debido a una mayor disponibilidad de datos y mejores posibilidades para realizar investigaciones en Afganistán después de que los talibanes tomaron el poder en 2001.

Análisis del Contenido de los Artículos

Número de Palabras Escritas

Aunque esto nos brinda una primera visión de la investigación realizada sobre la igualdad de género en Afganistán, estamos principalmente interesados en lo que los investigadores realmente escribieron. Para tener una idea del contenido de estos artículos, podemos aprovechar el resumen que Elicit amablemente incluyó para nosotros en el archivo CSV que generó la herramienta. Para hacer esto, podemos seguir los procedimientos estándar para el análisis de texto, como el que describe Jan Kirenz en una de sus publicaciones de blog. Comenzamos simplemente contando el número de palabras en cada resumen utilizando un método lambda:

#Dividir el texto de los resúmenes en una lista de palabras y calcular la longitud de la lista
df["Número de Palabras"] = df["Abstract"].apply(lambda n: len(n.split()))

#Imprimir las primeras filas
print(df[["Abstract", "Número de Palabras"]].head())

#Output:

                                            Abstract  Número de Palabras
0  Como sociedad tradicional, Afganistán siempre ...              122
1  El índice de desigualdad de género de Afganistá...              203
2  Las prácticas culturales y religiosas son fact...              142
3  RESUMEN La equidad de género puede ser un tema...              193
4  El colapso del régimen talibán a fines de la dé...              357

#Describir la columna con el número de palabras
df["Número de Palabras"].describe()

count     168.000000
mean      213.654762
std       178.254746
min        15.000000
25%       126.000000
50%       168.000000
75%       230.000000
max      1541.000000

Genial. La mayoría de los resúmenes parecen estar llenos de palabras. Tienen en promedio 213.7 palabras. Sin embargo, el resumen mínimo consiste en solo 15 palabras, mientras que el resumen máximo tiene 1,541 palabras.

¿Sobre qué escriben los investigadores?

Ahora que sabemos que la mayoría de los resúmenes son ricos en información, preguntemos sobre qué escriben principalmente. Podemos hacerlo mediante la creación de una distribución de frecuencia para cada palabra escrita. Sin embargo, no nos interesan ciertas palabras, como las palabras vacías. En consecuencia, necesitamos realizar un procesamiento de texto:

# Primero, convertir todo a minúsculas
df['Abstract_lower'] = df['Abstract'].astype(str).str.lower()
df.head(3)#importar csv

# Tokenicemos la columna
from nltk.tokenize import RegexpTokenizer

regexp = RegexpTokenizer('\w+')

df['text_token']=df['Abstract_lower'].apply(regexp.tokenize)

#Mostrar las primeras filas del nuevo conjunto de datos
df.head(3)

# Eliminar las palabras vacías
import nltk

nltk.download('stopwords')

from nltk.corpus import stopwords

# Crear una lista de palabras vacías en inglés
stopwords = nltk.corpus.stopwords.words("english")

# Ampliar la lista con tus propias palabras vacías personalizadas
my_stopwords = ['https']
stopwords.extend(my_stopwords)

# Eliminar las palabras vacías con la función lambda
df['text_token'] = df['text_token'].apply(lambda x: [item for item in x if item not in stopwords])

#Mostrar las primeras filas del conjunto de datos
df.head(3)

# Eliminar palabras poco frecuentes (palabras con menos de o igual a dos letras)
df['text_string'] = df['text_token'].apply(lambda x: ' '.join([item for item in x if len(item)>2]))

#Mostrar las primeras filas del conjunto de datos
df[['Abstract_lower', 'text_token', 'text_string']].head()

Lo que hacemos aquí es primero convertir todas las palabras en minúsculas y luego tokenizarlas mediante herramientas de procesamiento de lenguaje natural. La tokenización de palabras es un paso crucial en el procesamiento de lenguaje natural y significa dividir el texto en palabras individuales (tokens). Utilizamos RegexpTokenizer y tokenizamos el texto de nuestros resúmenes en función de características alfanuméricas (indicadas por ‘ \w+ ‘). Almacenamos los tokens resultantes en la columna text_token . Luego, eliminamos las palabras vacías de esta lista de tokens utilizando el diccionario de la biblioteca de procesamiento de lenguaje natural nltk , la biblioteca de herramientas de lenguaje natural de Python NLTK (Natural Language Toolkit). Eliminamos las palabras que tienen menos de dos letras. Este tipo de procesamiento de texto nos ayuda a centrar nuestro análisis en términos más significativos.

Generar una nube de palabras

Para analizar visualmente la lista resultante de palabras, generamos una lista de cadenas a partir del texto que procesamos y tokenizamos esta lista y luego generamos una nube de palabras:

from wordcloud import WordCloud

# Crear una lista de palabras
all_words = ' '.join([word for word in df['text_string']])

# Nube de palabras
wordcloud = WordCloud(width=600, 
                     height=400, 
                     random_state=2, 
                     max_font_size=100).generate(all_words)

plt.figure(figsize=(10, 7))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off');

La nube de palabras muestra que las palabras mencionadas con más frecuencia son aquellas que también forman parte de nuestra consulta de búsqueda: Afganistán, género, igualdad de género. Sin embargo, otras palabras que son sinónimos también forman parte de la lista de palabras más mencionadas: mujeres y hombres. Estas palabras en sí mismas no son muy informativas, pero otras sí lo son: dentro de la investigación sobre la igualdad de género en Afganistán, los investigadores parecen estar muy preocupados por la educación, los derechos humanos, la sociedad y el estado. Sorprendentemente, Pakistán también forma parte de la lista. Esto podría significar que los resultados generados para la consulta de búsqueda son imprecisos y también incluyen investigaciones sobre la igualdad de género en Afganistán, aunque no lo hayamos solicitado. Alternativamente, podría significar que la igualdad de género de las mujeres afganas también es un tema de investigación importante en Pakistán, tal vez debido a que muchos afganos se establecen en Pakistán como resultado de la difícil situación en su país de origen.

Analizar el Sentimiento de los Autores

Idealmente, la investigación sería neutral y libre de emociones u opiniones. Sin embargo, es parte de nuestra naturaleza humana tener opiniones y sentimientos. Para investigar en qué medida los investigadores reflejan sus propios sentimientos en lo que escriben, podemos realizar un análisis de sentimiento. El análisis de sentimiento es un método para analizar si un conjunto de texto es positivo, neutral o negativo. En nuestro ejemplo, utilizaremos la Herramienta de Análisis de Sentimiento VADER. VADER significa Valence Aware Dictionary and Sentiment Reasoner, y es una herramienta de análisis de sentimiento basada en reglas y léxico.

La forma en que funciona la herramienta de análisis de sentimiento VADER es que utiliza un léxico de sentimientos preconstruido que consiste en una gran cantidad de palabras con sentimientos asociados. También considera reglas gramaticales para detectar la polaridad de sentimiento (positivo, neutral y negativo) de textos cortos. La herramienta arroja un puntaje de sentimiento (también llamado puntaje compuesto) basado en el sentimiento de cada palabra y las reglas gramaticales en el texto. Este puntaje varía de -1 a 1. Los valores por encima de cero son positivos y los valores por debajo de cero son negativos. Dado que la herramienta se basa en un léxico de sentimientos preconstruido, no requiere modelos de aprendizaje automático complejos ni modelos extensos.

# Acceso al léxico requerido que contiene los puntajes de sentimiento para las palabras
nltk.download('vader_lexicon')

# Inicializa el objeto analizador de sentimientos
from nltk.sentiment import SentimentIntensityAnalyzer

# Calcula los puntajes de polaridad de sentimiento con el analizador
analyzer = SentimentIntensityAnalyzer()

# Método de puntaje de polaridad: asigna los resultados a la columna de polaridad
df['polarity'] = df['text_string'].apply(lambda x: analyzer.polarity_scores(x))
df.tail(3)

# Cambia la estructura de datos: concatena el conjunto de datos original con las nuevas columnas
df = pd.concat(
    [df, 
     df['polarity'].apply(pd.Series)], axis=1)

# Muestra la estructura de la nueva columna
df.head(3)

# Calcula el valor promedio del puntaje compuesto
df.compound.mean()

# Salida: 0.20964702380952382

El código anterior genera un puntaje de polaridad que varía de -1 a 1 para cada resumen, aquí denominado como puntaje compuesto. El valor promedio está por encima de cero, por lo que la mayoría de la investigación tiene una connotación positiva. ¿Cómo ha cambiado esto con el tiempo? Podemos simplemente trazar los sentimientos por año:

# Gráfico de líneas
g = sns.lineplot(x='Año', y='compound', data=df)

# Ajustar etiquetas y título
g.set(title='Sentimiento del Resumen')
g.set(xlabel="Año")
g.set(ylabel="Sentimiento")

# Agregar una línea gris para indicar cero (el puntaje neutral) y dividir los puntajes positivos y negativos
g.axhline(0, ls='--', c = 'grey')

Interesante. La mayoría de la investigación fue positiva a partir de 2003. Antes de eso, los sentimientos fluctuaban de manera más significativa y eran más negativos, en promedio, probablemente debido a la difícil situación de las mujeres en Afganistán.

Conclusión

El Procesamiento del Lenguaje Natural puede ayudarnos a generar ideas valiosas sobre grandes cantidades de texto. Lo que aprendimos aquí de casi 170 documentos es que la educación y los derechos humanos fueron los temas más importantes en los documentos de investigación recopilados por Elicit, y que los investigadores comenzaron a escribir de manera más positiva sobre la igualdad de género en Afganistán a partir de 2003, poco después de que los talibanes asumieran el poder en 2001.

Conclusiones Clave

  • Podemos utilizar herramientas de Procesamiento del Lenguaje Natural para obtener rápidamente información sobre los principales temas estudiados en un determinado campo de investigación.
  • Las nubes de palabras son excelentes herramientas de visualización para comprender las palabras más comúnmente utilizadas en un texto.
  • El análisis de sentimiento muestra que la investigación puede no ser tan neutral como se espera.

Espero que hayas encontrado este artículo informativo. No dudes en contactarme en LinkedIn. ¡Conéctate y trabajemos juntos para aprovechar los datos para el bien!

Preguntas Frecuentes

Referencias

  • Foro Económico Mundial. Informe Global de la Brecha de Género 2023.
  • Elicit. Enlace: ¿Por qué fracasó la igualdad de género en Afganistán | Búsqueda | Elicit
  • Jan Kirenz. Minería de Texto y Análisis de Sentimiento con NLTK y pandas en Python.
  • Hutto, C.J. & Gilbert, E.E. (2014). VADER: Un modelo basado en reglas parsimonioso para el análisis de sentimiento de texto en redes sociales. Octava Conferencia Internacional sobre Blogs y Medios Sociales (ICWSM-14). Ann Arbor, MI, junio de 2014.

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.