• No se han encontrado resultados

ANEXO 1- Detalle de funcionamiento del programa

N/A
N/A
Protected

Academic year: 2023

Share "ANEXO 1- Detalle de funcionamiento del programa"

Copied!
53
0
0

Texto completo

(1)

ANEXO 1- Detalle de funcionamiento del programa

El ingreso de los documentos exportados de los SIR en formato .txt (para WoS y para SciELO CI) y .csv (para Scopus) al programa permite correr el Script

“baseDatos” donde se realiza la recolección, limpieza e indexación a DataFrames de los datos almacenados en los documentos. Una vez terminado este proceso, el programa procede a crear el modelo entidad-relación mediante el Script “Modelo”

para tener los datos más claros y organizados, una vez se tiene el modelo es necesaria la creación de una conexión entre la base de datos y el programa, para ello se crea el Script “consultas” el cual permite la realización de consultas SQL dentro de la base de datos.

1. Recolección de datos

Para la creación de este programa se tuvo en cuenta el uso de tres bases de datos principales: Web of Science, Scielo y Scopus. Estas bases brindan la posibilidad de exportar a un archivo .csv o .txt los metadatos de cada documento recuperado en una búsqueda específica. Es importante que la exportación de estos archivos se haga tal y como se explica a continuación ya que serán esos documentos los que se importarán al programa para que se puedan procesar y crear tanto la base de datos como todas sus funcionalidades.

El primer paso será la realización de la ecuación de búsqueda dentro de las bases de datos, para este trabajo de grado cuya articulación se hizo con _____ la ecuación para Web of Science y Scielo fue la siguiente:

(WC=(Psychology)) AND (PY== ("2021" OR "2020" OR "2019" OR "2018" OR

"2017") AND CU==("ARGENTINA" OR "BRAZIL" OR "CHILE" OR "COLOMBIA" OR

"MEXICO" OR "PERU" OR "CUBA" OR "ECUADOR" OR "URUGUAY" OR "COSTA RICA" OR "VENEZUELA" OR "DOMINICAN REP" OR "PANAMA" OR

"GUATEMALA" OR "BOLIVIA" OR "EL SALVADOR" OR "NICARAGUA" OR

"HONDURAS" OR "PARAGUAY"))

(2)

Mientras que para Scopus fue:

AFFILCOUNTRY ("ARGENTINA" OR "BRAZIL" OR "CHILE" OR "COLOMBIA"

OR "MEXICO" OR "PERU" OR "CUBA" OR "ECUADOR" OR "URUGUAY"

OR "COSTA RICA" OR "VENEZUELA" OR "DOMINICAN REP" OR "PANAMA"

OR "GUATEMALA" OR "BOLIVIA" OR "EL SALVADOR" OR "NICARAGUA"

OR "HONDURAS" OR "PARAGUAY") AND (LIMIT-TO (SUBJAREA, "PSYC"))

Una vez se tienen los resultados de las consultas se procederá a la exportación de los datos, para ello será necesario seguir los pasos que se describen a continuación, es importante aclarar que si no se realiza la exportación tal y como se explica en este documento el programa no va a funcionar.

Para Web of Science y Scielo:

(3)

Lo primero tras realizar la búsqueda será exportar los metadatos de los documentos, para ello en la página de resultados se encuentra la pestaña “Export” donde se despliegan los múltiples formatos de exportación, dentro de ellas se selecciona la opción “Tab delimited file” como se muestra en la figura 1, tras esta acción será necesario seleccionar aquellos metadatos a exportar, para ello se ingresa a la opción “Record Content” donde se despliega la opción “Custom Selection”, la base

(4)

de datos por defecto tiene seleccionados 11 metadatos, para cambiar esta configuración se ingresa a “Edit”(2).

Tras este ejercicio, aparecerán todos los metadatos de cada documento, para el programa será importante tener marcadas todas las casillas que se muestran en la imagen (3), luego se guarda la selección “Save selections”.

(5)

Y el último paso será exportar el .txt y guardarlo en el dispositivo.

Para Scopus:

Tras realizar la búsqueda se exportarán los metadatos de los documentos, para ello en la página de resultados se encuentra la pestaña “Export” (1)

(6)

Tras esto se selecciona la opción “CSV” para tener los datos en un archivo separado por comas .csv (2), en la misma ventana aparece la opción para seleccionar cuáles metadatos se desean exportar, para el correcto funcionamiento del programa y obtener todas sus funcionalidades se recomienda marcar todos los metadatos, posteriormente se exportan y se guarda el archivo en el dispositivo.

2. Selección de los datos

Una vez se han descargado los archivos se procede a la importación de ellos al programa, al ingresar cualquiera de los archivos el programa ejecuta el Script “baseDatos” desde donde pide seleccionar el archivo y llama a un método para que pueda pasar la información que almacena en este archivo a un DataFrame y de esta forma facilitar la manipulación de los datos.

Python tiene una librería especializada para la manipulación y análisis de los datos denominada

“Pandas” la cual permite la creación de DataFrames que son objetos para almacenar y manipular datos tabulados en filas (cada registro) y columnas (atributos de cada registro). Estas tablas contienen un índice único para

(7)

cada uno de los registros permitiendo ordenar, filtrar, modificar, analizar, agrupar y cambiar los datos. (Pandas, 2022)

Una gran ventaja de utilizar la librería “Pandas” es que posibilita la lectura de los datos almacenados en diferentes formatos como libros de Excel (.xlsx), archivos separados por coma (.csv), archivos separados por tab (.txt) y consultas SQL realizadas en la base de datos. Estas opciones serán utilizadas a lo largo del programa para poder manipular todos los datos que se hayan importado en la primera fase.

Al ingresar el archivo el programa, el primer proceso que ejecuta es la selección de aquellas columnas que contienen los metadatos necesarios para que puedan ser procesados posteriormente, esta selección se realiza basada en la siguiente tabla donde: en la primera columna se encuentra el nombre del atributo; en la segunda los atributos que pueden ser extraídos de cada cadena de texto encontrada en las base de datos, es importante aclarar que los nombres de estos atributos son los nombres de las columnas utilizadas dentro del código; y en las restantes se encuentran los nombres de aquellas columnas en las bases de datos que contiene los metadatos que necesita el programa.

Atributo Datos en el programa

Wos Scielo Scopus

Título Titulo TI TI Title

Autor Nombre_autor AU AU Authors

Palabras clave autor

Autor_keyword DE DE Author

Keywords Palabras clave

base de datos

BD_keyword ID EC* Index

Keywords Categorías Nombre_categoria &

Nombre_subcategoria

SC SC* [No

disponible]

(8)

Fuente Nombre_fuente SO SO Source title

Resumen Resumen AB AB Abstract

Citas recibidas Citas_recibidas Z9 Z9 Cited by Instituciones Nombre_institucion C1 C1 Affiliations

Editorial Editorial PU PU Publisher

Países Nombre_pais C1 C1 Affiliations

ISSN ISSN SN SN ISSN

eISSN eISSN EI [No

disponible]

[No

disponible]

ISBN ISBN BN [No

disponible]

ISBN

DOI DOI DI DI DOI

Información de financiamiento

Institucion & Acronimo (financiamiento)

FU [No

disponible]

Funding Details, Sponsors

Open Access Tipo_oa OA OA Open Access

Año Anio PY PY Year

Idioma Idioma LA LA Language of

Original Document

Base de datos Base_de_datos WE C2 Source

Número de acceso

Num_acceso UT UT EID

(9)

Tipo de documento

Tipo_de_documento DT DT Document

Type

*SC se tomó este en vez del EC para la normalización de las categorías, resulta que el EC pertenece solo a Scielo mientras que el SC también hace parte de WoS.

Cabe resaltar que este proceso de selección de las columnas fue diferente en cada base de datos. Para Web of Science fue un proceso simple ya que tiene todos los metadatos que se toman en cuenta dentro del programa, para Scielo se tuvo que agregar manualmente la columna de financiamiento llenándola con "[No disponible]"

ya que esta información no es proporcionada por la base de datos y finalmente para Scopus el proceso fue mucho más complejo ya que sus datos eran muy diferentes a comparación de las otras bases de datos.

Por un lado, tras la selección de columnas que se evidencian en la tabla para Scopus se procede a arreglar los datos. Para el metadato “Información de financiamiento” se evidencia que la información está en dos columnas diferentes 'Funding Details' y 'Sponsors' así que se fusionan en un solo campo separados por ' | ' para así poder analizarlos de una forma más controlada en las siguientes fases.

Por otro lado, al exportar los datos de Scopus no se descargan las categorías así que, al igual que en Scielo, se crea una nueva columna llamada 'categorias' la cual se llena con "[No disponible]".

Este proceso interno se realiza cada vez que el usuario selecciona el archivo que desea ingresar. El usuario al terminar de elegir los archivos va a seleccionar el botón

“Continuar”. En ese momento el programa procede a concatenar estas tablas de cada base de datos en el siguiente orden: “Web of Science”, “Scielo” y “Scopus”, creando un DataFrame llamado “baseDatos.completo” que contiene todos los registros de las tablas. Tras unificar todos los registros empieza el proceso de limpieza donde se reinicia el índice (número único para cada registro), se llenan los datos sin información o vacíos de la columna de Citas_recibidas con 0.0 y finalmente se llenan todos los espacios vacíos de las con "[No disponible]".

(10)

Una vez realizados esos procesos se continua con la creación de las tablas, cada uno de los metadatos será limpiado y almacenado en una tabla diferente dependiendo del modelo de datos entidad-relación, este modelo es necesario para la creación de la base de datos la cual tiene una gran importancia para el funcionamiento del programa ya que allí se almacenará toda la información de los documentos.

3. Particularidades del modelo entidad relación

Dentro del modelo se encuentra la relación de uno a muchos entre las entidades

“ARTICULO” y “FUENTE”, ya que un documento solo tiene una revista mientras que una revista puede tener uno o más artículos. En la imagen se puede evidencia que la relación se realiza mediante el identificador de la entidad “FUENTE” y el atributo

“ID_fuente” de la entidad “ARTICULO”. En la base de datos este identificador es un número, entiéndase que es el equivalente a poner el nombre de la revista dentro de los atributos de los documentos.

Otro ejemplo de la relación de uno a muchos se evidencia entre las entidades

“INSTITUCION” y “PAIS”, donde una institución puede tener solo un país adscrito, mientras que un país puede tener una o más instituciones. Al igual que en la relación anterior, la tabla que contiene la información de las instituciones tiene como atributo el ID_pais mediante el cual se pueden relacionar las dos tablas.

Mayoría de las relaciones del modelo fueron de muchos a muchos, para poder relacionar estas entidades en un modelo físico es necesaria la creación de una tabla paso, de acuerdo con Bagui & Earp, para el mapeo de estos atributos con múltiples valores se forma una tabla separada que donde cada fila contendrá la clave de las instancias que se relacionan entre ellas. Así pues, la llave de esta nueva tabla será la concatenación de las llaves. (2011)

Para entender mejor esta relación usaremos la entidad “ARTICULO” y “AUTOR”

donde un autor puede tener varias publicaciones y una publicación varios autores, para poder crear esta relación se necesita tener una “tabla paso” la cual permite tener relaciones de muchos a muchos, esta tabla “AUTOR_ARTICULO” va a tener

(11)

como atributos, aparte de su propio identificador, los ID de la tabla “ARTICULO” y los ID de la tabla “AUTOR”, así pues, existirá un registro diferente por cada combinación posible, para ilustrarlo mejor se tiene la siguiente imagen:

En este ejemplo, la tabla paso “AUTOR_ARTICULO” muestra que el artículo cuyo ID es 0, como se ve en la columna “ID_art”, fue escrito por 7 autores diferentes cuyo ID es igual a los mostrados en la columna “ID_au”. Estos ID serán las mismas llaves o claves de las instancias.

En esta imagen se muestra de una forma mucho más clara el funcionamiento de una tabla paso ya que muestra que el título del artículo es igual y el nombre de los autores varía según el identificador que tiene cada uno.

(12)

Cabe resaltar que las tablas paso del modelo entidad-relación no tienen estos metadatos de texto adicionales como atributos de cada entidad. Para ilustrar mejor el uso de para este ejemplo se desarrolló una consulta en SQL. De acuerdo con Microsoft, SQL es un lenguaje de computación que permite trabajar con conjuntos de datos y las relaciones entre ellos. Facilita la recuperación de estos datos dentro de una base de datos. (2022).

Se crearon tablas paso para las entidades cuyas relaciones son de muchos a muchos, esto ocurrió con la relación de la entidad “ARTICULO” con las palabras clave del autor, los tipos de acceso abierto, el financiamiento, las instituciones, las palabras clave de la base de datos o Keyword Plus y las categorías a las que pertenecen.

Para la creación de la base de datos relacional del programa se utiliza la librearía de Python SQLAlchemy la cual es una herramienta para tener un poder total y flexible de SQL, donde se adapta a Python el uso de SQL. (SQLAlchemy, 2022).

4. Limpieza de los datos y creación de las tablas

Una vez se tiene claro el funcionamiento del modelo entidad-relación y la necesidad de cada una de las entidades presentadas, se procede a explicar cómo el programa limpia los datos y crea las tablas del modelo para luego poder pasarlas a la base de datos.

La limpieza de los datos y la creación de las tablas ase realiza dentro del Script baseDatos.py, dentro, se encuentra una clase llamada baseDatos. Las clases, dentro de la programación orientada a objetos, hace referencia a la definición de un tipo de dato donde se encuentran atributos y métodos. Un atributo, al igual que en el modelo entidad-relación hace referencia a una característica propia de la clase, en esta ocasión, serán variables con valores diferentes. Existen los atributos de clase, aquellos que pueden ser accedidos desde otros scripts u otras clases y los atributos de métodos, aquellos que solo se pueden acceder dentro de la misma clase.

(13)

Además de los atributos se encuentran los métodos, un método o función es una parte del código diseñada para hacer una función específica, los métodos tienen 3 partes principales: 1) un nombre, mediante este nombre se puede acceder a la función desde cualquier parte del programa. 2) parámetros, los parámetros serán aquellos datos o valores que se le pasan a la función para que la misma pueda utilizarlos dentro de la consulta. 3) el return, una vez el programa ha terminado de ejecutar el método, la a retornar algún valor que se desea, es importante aclarar que este último elemento no es necesario. Para entenderlo mejor, se presenta un ejemplo. Se tiene la función “suma” (ese sería el nombre de la función), esta función recibe dos números (estos serían los parámetros), dentro del método, el programa suma ambos valores y devuelve el resultado (este sería el return de la función).

Dentro del modelo entidad-relación se encuentra la entidad “FUENTE” la cual contiene la información de las revistas a las que están indexados los documentos, el primer paso para crear la tabla es la selección de las columnas 'Nombre_fuente', 'ISSN', 'eISSN', 'ISBN' pertenecientes al DataFrame “baseDatos.completo” (aquel que tiene los datos de las tres bases concatenados), de allí toma y elimina aquellas revistas con los nombres duplicados, luego ordena los valores de forma alfabética y vuelve a poner los índices los cuales serán renombrados como 'ID_fuente' y serán usados para poder generar las relaciones ya que la tabla “ARTICULO” va a crear su relación mediante este número.

Para la tabla “ARTICULO” se seleccionaron las columnas: 'Titulo', 'Resumen', 'Citas_recibidas', 'DOI', 'Editorial', 'Base_de_datos', 'Idioma', 'Anio', 'Num_acceso' y 'Tipo_de_documento’ del DataFrame “baseDatos.completo”. Una vez obtenidas las columnas se indexan al DataFrame “baseDatos.ARTICULO”, está tabla tendrá la información de todos los documentos donde cada uno de los registros o filas de la tabla será uno completamente diferente.

Como se explicó en el anterior capitulo, la relación entre la entidad “ARTICULO” y

“FUENTE” es de una a muchos y dentro de los metadatos de “ARTICULO” se encuentra el ID_fuente. Para obtener la información de este atributo, se crea una

(14)

lista vacía “indices” la cual contendrá los datos del ID_fuente para cada uno de los artículos. Una vez se tiene creada la lista se procede a iterar la columna

“Nombre_fuente” del DataFrame “baseDatos.completo”, este paso se realiza mediante el for donde la j tendrá el valor de cada nombre de la revista. Dentro del for se pide que ingrese a la lista “indices” la posición o el ID del nombre de la revista, de la tabla “FUENTE”. Esta acción se realizará únicamente si este nombre es igual a j.

Una vez se ha terminado de ingresar todos los datos a la lista “indices”, se procede a crear una nueva columna al DataFrame “baseDatos.ARTICULO” con todos los datos recolectados para así poder crear la relación más adelante.

De la tabla “ARTICULOS” se despliegan muchas relaciones con más entidades, una de ellas es la entidad “AUTOR” donde se necesita una tabla paso para poder crear esta relación de muchos a muchos. Primero se empezará la explicación con la creación de de la tabla “baseDatos.AUTOR_ARTICULO” la cual es la tabla paso.

Lo primero es la creación de una lista basada en la columna de “Nombre_autor”

para poder manejar los datos de una mejor forma. Luego se creará una lista

“tabAut”la cual contendrá la información de los autores y el artículo para luego

(15)

indexarla a la tabla “AUTOR_ARTICULO”. También se necesitará un contador para saber el índice, llave o clave de la instancia de la tabla "ARTICULO”.

Como no todas las bases de datos pertenecen a la misma compañía, cada base de datos maneja la información de forma diferente por esta razón es necesario tratarlas diferentes, especialmente a Scopus, en este caso una vez se tienen los datos dentro de la lista simplemente se recorren y se analiza uno por uno. Lo primero es identificar la base de datos a la que pertenecen, así si es para WoS o Scielo se dividen los autores por "; ", mientras que si son en Scopus se dividen por ", ".

Una vez se hallan separado cada uno de los autores se ingresan a una lista auxiliar denominada “aux” la cual será iterada posteriormente para poder limpiar cada uno de los datos, dado que no todas las bases de datos ni artículos tienen todos los nombres de los autores normalizados es necesario limpiarlos así que se usa la librería regex también denominada “Regular expression operations”, la cual se utiliza para strings y sirve para la limpieza de los datos, permitiendo eliminar todos los caracteres especiales; dentro de estos caracteres se encuentran los asteriscos (*), las comas (,), los signos de interrogación (¿?) y entre otros caracteres que pueden llegar a hacer ruido en la información. Esto permitirá normalizar un poco más los autores, sin embargo, no se podrán normalizar en un 100%.

Cuando ya se han limpiado los datos de los autores se procederá a indexar a la matriz bidimensional “tabAut” la llave o clave de cada instancia que se encuentra en la variable cont y el nombre de cada autor que se encuentra en la variable j. Una vez ha terminado de iterar e ingresar todos los datos a la matriz se procederá a

(16)

indexar esta información al DataFrame “AUTOR_ARTICULO” y renombrar las columnas para tenerlas normalizadas a la hora de pasar a la base de datos.

Una vez se tiene este DataFrame de “AUTOR_ARTICULO” completo, se procede a crear la tabla “AUTOR” la cual simplemente va a tener los nombres de los autores.

Para eso, se pasan esos valores a una lista, se transforma en un diccionario el cual elimina los duplicados de los nombres y vuelve a pasarlo a una lista para poder crear un DataFrame ya con los valores únicos llamado “baseDatos.AUTOR”. Una vez se tiene el DataFrame completo, se ordenan los datos alfabéticamente y se vuelven a poner los índices que serán la llave de la tabla y se renombrará la columna como ‘ID_au’.

Como se explicó anteriormente, las tablas paso solo contienen los ID de las instancias que se relacionan, así que ahora se debe añadir una columna más a AUTOR_ARTICULO para incluir el ID de los autores, esta parte se realiza igual a como se hizo en la relación de las entidades ARTICULO y FUENTE. Una vez se ha añadido el ID del autor a la tabla, el programa procede a eliminar la columna que contenía el nombre de los autores y renombra el ID de la nueva tabla como

‘ID_art_au’.

Este mismo proceso se realiza con las tablas “AUKEY_ARTICULO”,

“AU_KEYWORD” que contienen la información de las palabras claves de los autores y la tabla paso de estas e igual con las tablas “BDKEY_ARTICULO” y

“BDKEYWORD”. Para ingresar los datos de las entidades “OPEN_ACCESS” y

“OA_ARTICULO” es exactamente el mismo proceso con la diferencia de que en ellas se ponen en letras mayúsculas todos los datos y se unifica el tipo de acceso abierto “GREEN”.

(17)

Para las tablas “baseDatos.CATEGORIA_ARTICULO”, “baseDatos.CATEGORIA” y

“baseDatos.SUB_CATEGORIA” el procedimiento varía un poco, si el nombre de la categoría es diferente a "[No disponible]" significará que existe así luego se verificará si dentro del String existe la coma para obtener de este modo la subcategoría a la cual pertenece la revista, una vez se tienen los dos datos de la categoría y la subcategoría se indexan a la matriz “tabCatego” la cual luego se convertirá en la tabla “baseDatos.CATEGORIA_ARTICULO” y permitirá crear tanto la tabla de categoría como la de subcategoría. De ahí en adelante el procedimiento es igual a las anteriores.

Para la tabla FINANCIAMIENTO fue un proceso más largo, para entenderlo mejor será necesario ver algunos ejemplos de cómo venían los datos:

Scopus (columna Funding Details)

2019-1089; Illinois Arts Council, IAC; Universidad de Santander, UDES: EXT01-19;

Instituto Colombiano de Bienestar Familiar, ICBF; Universitat Oberta de Catalunya, UOC: 031, 11/22/2018, CBU-FT002-UDES

WoS (columna FU)

James S. McDonnell Foundation [220020300]; National Science Foundation (Education Core Research Grant) [DRL-1459625]

(18)

Como se puede evidenciar no todos los datos contienen la misma información siempre, Web of Science tiene sus datos más ordenados donde el acrónimo de la institución se encuentra entre los paréntesis redondos y el número entre los paréntesis cuadrados, sin embargo, Scopus, no tiene la información tan ordenada.

Como se puede evidenciar a veces solo se encuentra el número, otras veces solo el nombre de la institución otras veces todo completo. El tema con que Scopus tenga los datos tan desordenados impide que el programa pueda recuperar toda la información con claridad.

A pesar de estos impedimentos se procura obtener la mayor parte de la información tratando de limpiar los datos. Para Web of Science el procedimiento es mucho más simple, al igual que en las ocasiones anteriores se recorre la lista que contiene la información, en este caso financiamiento, una vez dentro se verifica si el dato pertenece a la base de datos WoS, de ser así, se dividen las instituciones con el “;

“y posteriormente se itera esta lista donde la variable i tendrá como valor toda la información de la institución que ha financiado el documento. Posteriormente tomará la información entre los paréntesis cuadrados y lo guardará en la variable

“num”, para luego eliminará esta subcadena de la variable i, hace el mismo proceso con el acrónimo (“acro”) que se encuentra entre paréntesis redondos y finalmente se tendrá en la variable i unicamente el nombre de la institución. Una vez las tres variables se hayan llenado con los datos correspondientes a cada una, se indexarán a la matriz “finan” para luego crear el DataFrame

“baseDatos.FINANCIAMIENTO_ARTICULO”

(19)

En el caso de Scopus el proceso será más complejo ya que no siempre los datos están en la misma posición ni se encuentran ordenados tal y como se vio en los ejemplos anteriores.

El primer paso es separar por ‘|’ cada una de las instituciones, esto se realiza porque al inicio se combinaron las dos columnas de financiamiento con patrocinadores separándolos con este símbolo. Así pues, dentro de sponsor[0] se encontrará la información de financiamiento y en sponsor[1] la del patrocinador.

Ahora se recorre la lista de sponsor, si la posición es igual a 0 significará que es la información de financiamiento, esta información se pasará a la variable f, con ella lo primero que se realiza es eliminar los caracteres extraños de los datos para luego dividir todas las posibles instituciones que aparezcan.

(20)

Ahora se dividen los datos justo donde se encuentren los dos puntos ya que después de los mismos está el número, sin embargo, este dato se va a descartar ya que varía dependiendo el proyecto y no siempre se encuentra la información, por esta razón ahora n tendrá la información únicamente de la institución.

Si solo hay un registro dentro del string primero se verificará cuál tipo de registro es, si es un acrónimo o un número se va a descartar, para realizar esta validación se vuelve a utilizar la librería regex, la cual permite saber si un texto está siempre en mayúsculas "[A-Z]+", en cuyo caso sería un acrónimo, o si tiene letras en mayúsculas, números y caracteres como guiones y slash "[A-Z0-9-/_‐. ]+", en cuyo caso sería el número. Si encuentra cualquiera de estos dos el programa simplemente pasará a la siguiente institución y descartará estos datos. De lo contrario, si no encuentra ninguno de estos dos quiere decir que muy probablemente sea el nombre de la institución, así que se agregará esta información a la matriz

“finan”.

Si, de lo contrario, hay más de un metadato dentro del string, significará que hay más datos, para determinar a qué categoría pertenece cada uno de los datos, lo primero será separar por comas la información, luego iterar esta información y revisar, si cumple esta condición "[A-Z0-9-/ ]+" o esta otra "[A-Z]+", entonces será la información del acrónimo y se guardará este dato en la variable “acro”, de lo contrario si es el dato que se encuentra en la primera posición entonces, probablemente, será el nombre. Cuando ya se han diligenciado estos datos se procede a rectificar que efectivamente la institución si tenga un nombre, lo cual significará que se puede indexar a la matriz “finan”.

(21)

Ahora si el dato ingresado no se encontraba ni en WoS ni en Scopus entonces quiere decir que era de Sciel la cual no tiene esta información de financiamiento.

Por esta razón se va a ingresar un registro a la matriz con la información del contador y de resto queda como '[No disponible]'. El proceso que sigue a continuación es el mismo que se ha mostrado antescon las tablas paso.

La limpieza de los datos para la creación de las tablas INSTITUCION y PAIS fue diferente y más complicada, para explicar el por qué, lo primero será revisar como vienen los datos originales de cada base de datos:

Scielo (columna C1)

● [Jiménez-Figueroa, Giomar] Universidad Simón Bolívar, Colombia; [Restrepo de Mejía, Francia] Universidad Autónoma de Manizales, Colombia; [Vidarte Claros, José Armando] Universidad Autónoma de Manizales, Colombia Web of Science (columna C1)

● [Arana Medina, Claudia Marcelo; Alvis Rizzo, Alexander] Univ Catolica Luis Amigo, Medellin, Colombia; [Arana Medina, Claudia Marcelo; Hoyos Zuluaga,

(22)

Elizabeth] Univ San Buenaventura, Bogota, Colombia; [Restrepo Botero, Juan Carlos] Corp Univ Lasallista, Caldas, Colombia

Scopus (Columna Affiliations)

● Department of Social Psychology, Faculty of Psychology, University of Seville, Sevilla, Spain; Federal University of Minas Gerais, Belo Horizonte, Brazil; National University of Colombia, Bogotá, Colombia

● Faculty of Psychology, University of Valencia, Valencia, 46010, Spain;

INTRAS (Research Institute on Traffic and Road Safety), University of Valencia, Spain; Faculty of Economic and Administrative Sciences, El Bosque University, Colombia; Department of Technology, ESIC Business and Marketing School, Spain; Spanish Foundation for Road Safety (FESVIAL), Spain

Como se puede evidenciar en los ejemplos tanto Web of Science y Scielo tienen los datos ordenados donde los autores se encuentran entre paréntesis cuadrados, cada institución se separa con punto y coma y al final, mayoría de veces, se encuentra el país.

Sin embargo, para Scopus es muy diferente esta organización, como se puede ver el nombre de la universidad no siempre se encuentra en la misma posición, a veces se encuentra en la primera parte del texto y en otras en la mitad. Con el país también es un dato que varía, mayoría de veces se encuentra al final del texto, sin embargo, a veces este dato es inexistente. El tema que tenga los datos tan desordenados es un problema para la correcta recuperación de los datos. Aun así, mediante el siguiente código se logra obtener la mayoría de los resultados de una forma eficiente.

(23)

Lo primero es pasar a una lista toda la información sobre las instituciones a una lista, nótese que la información de los países hace parte de las instituciones y ambos datos se encuentran en el mismo campo así que se toma la columna “países”. Una vez se tiene la lista se empiezan a recorrer los datos, la primera validación se hace para aquellos datos que son de WoS y de Scielo, donde, como se puede ver en los ejemplos, se encuentran los autores dentro de los paréntesis cuadrados, no es necesario volver a recuperar la información de los autores así que se puede eliminar, para hacerlo primero se cuenta la cantidad de paréntesis que hay para proceder a eliminar todos los caracteres que se encuentran dentro de ellos.

Una vez se han eliminados estos datos se procede a separar las instituciones, como se ve en los ejemplos, en las tres bases se separan con punto y coma así que simplemente se crea la variable “full” que será una lista con la información de cada institución, lista que se itera para volver a separar por comas la información dado que, como se evidencia en los ejemplos, cada uno de los metadatos de las instituciones se encuentran separado por comas. Los metadatos de estas instituciones serán guardados en la la variable “ins”.

Tras realizar este proceso se debe validar el origen de la base de datos de cada institución, si es de WoS o de Scielo simplemente se agrega de la siguiente forma a la matriz tabla_art_ins:

(24)

Si solamente se tiene un registro (que la cadena de texto donde se encuentra la institución no tenga comas) entonces se indexa el “cont” (índice del artículo), el nombre de la institución (el único registro que se encuentra en la primera posición) y ya que no tiene información del país se agrega el string '[No disponible]'.

Si, de lo contrario, tiene más de un registro (una o más comas), quiere decir que hay más metadatos sobre la institución, para el programa lo que importa es el nombre de la institución, la cual siempre se encuentra en la primera posición y el país, encontrado en la última posición, esta información se indexa igual que la anterior solo que en esta ocasión se incluirá la variable “país” la cual se inicializó con el string que retorna la función “busca_pais” explicada más adelante.

Ahora se presenta el proceso de Scopus, como se pudo evidenciar en los ejemplos, la información en Scopus no se encuentra normalizada así que para buscar la institución se tuvo que utilizar varias palabras claves para encontrarla entre tantos metadatos.

Primero se tiene la variable “pais” con la información que retorna la función

“busca_pais”, luego se inicializa la variable “aux1” con la cantidad de registros que tiene la matriz “tabla_art_ins”. Tras realizar esto se iteran los metadatos de cada institución para obtener aquel con el nombre de la institución, primero se busca si es una universidad y de serlo se agrega la información a la matriz añadiendo cont (el índice del artículo), la institución y el país. Este proceso lo realiza con las demás palabras claves y si al final el tamaño de la matriz es igual a “aux1” significará que ninguna de estas subcadenas se encuentra en los metadatos así que se añadirá la información de la institución donde se incluirá el primer metadato a la matriz, esta acción no será 100% exacta ya que en la primera posición puede estar el nombre

(25)

de la facultad o cualquier otro dato que no sea el nombre de la institución, pero se realiza para asegurar que la información de esa institución no se pierda.

Lo siguiente es añadir los datos de la matriz “tabla_art_ins” a la tabla

“INSTITUCION_ARTICULO” donde se almacenará toda la información mientras se crean las tablas de PAIS e INSTITUCIÓN. El proceso para la creación de estas tablas y los índices es igual a los anteriores con la diferencia que PAIS e INSTITUCIÓN tienen una relación de uno a muchos así que INSTITUCION tendrá los ID de PAIS.

5. Función busca_pais

Para poder obtener la información de los países y poder representar la cantidad de artículos en un mapa coroplético fue necesaria la creación de esta función, la misma se basa en la siguiente tabla:

Por Esp Country Code

(26)

Afeganistão Afganistán Afghanistan AFG Ilhas Aland Islas Aland Åland Islands ALA

Albânia Albania Albania ALB

Argélia Argelia Algeria DZA

Samoa Americana

Samoa Americana

American Samoa

ASM

Andorra Andorra Andorra AND

Angola Angola Angola AGO

Enguia Anguila Anguilla AIA

(Véase completa en el Anexo 2)

La tabla completa se encuentra en un archivo de Excel, para realizar la lectura del mismo se crea el atributo de clase df_paises donde se tendrá un DataFrame con la información de todos los países, en la primera columna se encuentra el nombre del país en portugués, en la segunda en español, en la tercera en inglés y la cuarta columna contiene el Alpha-3 code.

Como no todos los nombres de los países se encuentran normalizados mediante la tabla se pretende normalizarlos teniendo como referencia los nombres de los países en los 3 idiomas más populares. Con su respectivo código, para cada institución se va a usar el siguiente método para obtener la información de cada país:

(27)

La función recibe como parámetro el nombre del país, luego empieza a recorrer el DataFrame buscando si el nombre del país se encuentra en alguna de las columnas, de estarlo retorna un string con el código, seguido por un punto y coma y el nombre del país en inglés. Si no se encuentra en ninguna parte de la tabla retornara un “[No disponible]”.

6. Creación de .db

Ya se han llenado todos los DataFrame con la información de las tablas para la base de datos, ahora solo resta ingresar estos datos a las entidades correspondientes, para ello se creó la función descargas donde se importa al script Modelo y se crea un motor para poder trabajar con la base de datos posteriormente.

A penas se importa el Script el programa empieza a ejecutarlo, la principal función del Modelo.py es la creación del modelo entidad-relación, para realizarlo, se utiliza la librería SQLAlchemy la cual permite la interacción entre SQL y Python, para poder hacer el modelo, se crearon clases diferentes para cada una de las tablas que se evidencian en el modelo entidad-relación.

Lo primero que se necesita es importar la librería sqlalchemy de donde se obtienen las clases “declarative_base” y “create_engine y los atributos necesarios para poder crear los atributos de cada tabla y sus respectivas relaciones.

(28)

El primer paso es la creación de “Base” la cual es una instancia de la clase

“declarative_base”, este objeto permitirá la creación de las tablas y sus respectivas relaciones dentro del modelo entidad-relación presentado anteriormente.

Para la creación de cada tabla simplemente se crea una clase que hereda de

“Base”, en el ejemplo se puede ver la creación de la tabla “ARTICULO” la cual tiene como llave primaria “ID_art”, también existe la relación con un atributo de otra tabla mediante “ID_fuente”, nótese que esta relación se logra con “ForeingKey” donde se pide que se realice directamente con el atributo de la tabla FUENTE llamado

“ID_fuente”; y para finalizar se encuentran los atributos con sus respectivos tipos de datos los Integer como números enteros y los String como cadenas de texto.

Este mismo procedimiento se realiza con las demás tablas del modelo entidad- relación, una vez ha terminado de compilar cada una de las clases, se ejecutará el siguiente proceso donde se le solicita al usuario guardar la base de datos donde desee para que pueda revisar los datos posteriormente si así lo desea, crea el motor para tener poder acceder a la base de datos desde el programa más adelante y crea la base de datos basándose en todas las clases que hayan heredado de “Base”.

(29)

Ahora el programa regresará al script baseDatos.py donde añadirá cada una de las tablas que se crearon a cada entidad del modelo entidad relación, esta acción se realiza de la siguiente manera utilizando pandas y el motor que servirá para realizar la conexión entre el programa y la base de datos:

Una vez finalizado este proceso el usuario tendrá en su dispositivo un archivo con extensión .db el cual es indispensable para que el programa pueda funcionar, lamentablemente este tipo de documentos no se puede abrir con Access ni Excel, por esta razón es necesario instalar un programa que permita leerlas.

Para poder ver los resultados del código, se utilizó el programa SQL browser ya que es una herramienta visual y abierta para crear diseñar y editar bases de datos compatibles con SQLite, permite la navegación entre las tablas y posibilita ejecutar comandos complejos en lenguaje SQL. (DB Browser for SQLite, 2022).

7. Las consultas

Una vez el programa ya ha descargado el archivo .db, procede a crear los gráficos y las funcionalidades del programa. Para ello lo primero que necesitará es poder

(30)

interactuar con la base de datos. Esta conexión se realizará mediante un motor, el cual, para el programa, será el creado en el atributo de la clase baseDatos.

Una vez se tiene una conexión establecida se necesitará un lugar para poder realizar las consultas, así que se crea el script consultas.py, donde se encontrará un solo método de la clase consulta llamado df_consulta, esta función se encarga de hacer una consulta en la base de datos y mediante la librería pandas lee la consulta y la convierte en un DataFrame el cual es retornado para que pueda ser procesado con mayor facilidad.

8. Tratamiento de los datos

Todo el proceso anterior se empezó a desarrollar una vez el usuario ingresó al botón

“Continuar”, una vez se finaliza todo este proceso, se llama al método inicializa () de la clase Programa, clase que se encuentra en el script Interfaz.py.

(31)

Tal y como se puede evidenciar en la imagen, el primer proceso que ejecuta es importar las clases del script Funcionalidades.py, una vez ha terminado de importarlas procede a compilar el script el script Funcionalidades.py, el cual, apenas se llama, ejecuta los siguientes métodos:

A continuación, se va a explicar una a una las clases que contiene este script, sus respectivos métodos y atributos y cuál es la utilidad de cada uno de ellos dentro del programa.

9. Clase gráficos:

(32)

La clase gráficos consta de 7 métodos los cuales permiten crear todas las imágenes para graficar los resultados obtenidos de los documentos importados. Todos estos gráficos, excepto las nubes de palabras, se realizaron mediante la utilización de la librería Plotly, la cual es una librería gráfica interactiva que permite la creación de gráficos interactivos y de alta calidad. (Plotly, 2022).

Lamentablemente, dado que se utilizó una librería un poco limitada para la creación de la interfaz, las interacciones que brinda Plotly a sus gráficos no se pudo añadir al programa, por ende, dentro de la interfaz solamente aparecerán las imágenes estáticas de los gráficos. Dadas estas limitaciones, se propuso entonces que cada uno de los métodos exportara una imagen .jpg y un archivo en formato HTML que puede ser leído por cualquier navegador web. Así, si el usuario desea tener las interacciones con los gráficos, simplemente dentro de la interfaz tendrá que dar clic en cada uno de los gráficos, esta acción abrirá el archivo HTML se abra en el navegador web. Para evitar posibles inconvenientes, se recomienda tener como programa predeterminado para abrir los HTML a Microsoft Edge o Google Chrome.

(33)

Para ilustrar el funcionamiento de los métodos se presenta la función barchart, la cual permite la creación de los diagramas de barras, esta recibe como parámetro una lista con los valores y una lista con la información a la que pertenece cada valor o etiquetas, ahora se crea un DataFrame con esta información para, posteriormente crear el diagrama utilizando la función de plotly.express llamada bar() la cuál pide como parámetro un DataFrame y la información para añadir al eje y y al eje x. Una vez se tiene El gráfico en la variable fig, se procede a quitar las leyendas del gráfico y exportar tanto el .jpg como el .html, el nombre de estos archivos será el mismo que recibió por parámetro. Estos documentos exportados se encontrarán en la misma carpeta del dispositivo donde se tiene el proyecto. Sin embargo, dentro de la interfaz se puede interactuar con todos los gráficos sin problema alguno.

Este método es similar a las funciones: treemap () para crear un mapa de árbol o treemap el cual permitirá visualizar los valores numéricos de cada una de las etiquetas mediante rectángulos, así pues, entre mayor sea el área de estos, mayor será el valor numérico; el método líneas () que crea un diagrama de líneas para visualizar los valores de cada etiqueta dentro de un eje x con los nombres de las etiquetas y un eje y que contendrá los valores numéricos; y, para finalizar la función pie () la cual genera un gráfico circular o de torta para ilustrar los datos dentro de proporciones. Las siguientes gráficas se explicarán más adelante cuando las otras clases necesiten utilizarla.

10. Clase autores y sus métodos:

Esta clase será encargada de manejar toda la información relacionada con los autores que han escrito los documentos que se están analizando, dentro de sus métodos, se encuentra: uno para la realización del gráfico donde se evidencian a

(34)

los autores con mayor productividad, otro que permite visualizar la ley de Lotka e identificar los autores élite de la temática que se está analizando.

Lo más importante de esta clase será el DataFrame que contiene las citas recibidas, el nombre de los autores y los títulos de los documentos. Por esta razón como atributo de clase se tiene este DataFrame, creado mediante la siguiente consulta SQL:

La razón por la cual se están utilizando atributos de clase es para que cuando se quiera acceder a estas variables desde otro script u otra clase pueda hacerse sin ningún problema. El script Interfaz.py, va a necesitar acceder a estos DataFrames para poder mostrar las tablas, permitir filtrar los artículos y exportar las tablas a un Excel.

Ya con la información completa en el DataFrame, se procede a generar el primer gráfico que realizará será un mapa de árbol o treemap el cual permitirá la visualización de los autores más productivos, para crearlo simplemente se llama al método treemap de la clase gráficos, clase que fue explicada anteriormente.

Como atributo de clase se tiene el DataFrame “df_au_pro”, para llenar la información sobre cuántos artículos tiene cada autor se utiliza la función de pandas “groupby” la cual permitirá agrupar los nombres de los autores y contar cuántas repeticiones tienen dentro del DataFrame original, así pues, si un autor aparece 5 veces en diferentes posiciones o registros del DataFrame, entonces quiere decir que el autor

(35)

ha publicado 5 artículos. Una vez se ha terminado de llenar “df_au_pro”, se crea un auxiliar que tendrá la información de los 10 autores con mayor producción para crear un gráfico que se pueda entender con mayor facilidad.

Ejemplo del gráfico con los autores más productivos.

Una vez se ha creado este gráfico, se procede a graficar la ley de Lotka, esta ley fue creada por Alfred Lotka en 1926, Lotka quería saber cuáles eran los investigadores que más contribuían a la ciencia, así tomo unos datos y mientras revisaba esta información se dio cuenta de que la distribución era desigual, esto

(36)

porque notó que la mayoría de los artículos están concentrados en una pequeña porción de autores, los cuales son altamente productivos. (Urbizagástegui, 1996) Esta ley es muy útil para identificar a los autores élite que son aquellos con mayor producción de documentos, sin embargo, para que sea más exacta es necesario que el corpus documental que se está analizando tenga una cohesión disciplinar clara. La identificación de estos investigadores permitirá tener claridad sobre los expertos de la temática que se está analizando, dentro de este proyecto se le proponen al usuario dos aplicaciones prácticas: 1) hacer colaboraciones con los autores élite para aumentar su visibilidad. 2) Si va a escribir un artículo, se le recomienda citar a alguno de estos autores ya que son los más expertos en esta disciplina.

Para graficarla es necesario poder agrupar la cantidad de artículos, dato que se tiene en “df_au_pro” y de ahí sacar la cantidad de autores que han x cantidad de artículos. Esta información se almacenará en el DataFrame “df_lotka”, que al igual que la anterior es un atributo de clase. Una vez se tiene completa esta tabla, se procede a pasar los datos al gráfico mediante el método lotka() de la clase gráfico:

En el eje y se va a tener la cantidad de autores que han escrito cierta cantidad de trabajos, y en el eje x la cantidad de trabajos. Para graficarlo simplemente se utilizó la librería plotly.graph_objects la cual permite tener más de dos líneas en simultáneo especificando los ejes de cada uno de los datos.

(37)

En este ejemplo tenemos que 6554 autores han escrito 1 trabajo y 893 autores han escrito 2 trabajos. Como se puede evidenciar, son muchos los autores que escriben pocos trabajos, sin embargo, según Lotka, los autores élite serán aquellos que se encuentran después de que las dos líneas se cruzan.

Para poder hallar estos datos se necesita pasar a lista la cantidad de artículos y la cantidad de autores, esto se realiza para poder iterar ambas filas e ir restando la cantidad de autores con la cantidad de trabajos. Esto se hace para saber donde las dos líneas se encuentran, el resultado más cercano a 0 será donde se cruzan, este

(38)

valor determinará a partir de qué cantidad de trabajos empiezan los autores élite.

Una vez se tiene claro a partir de que número de trabajos empiezan los autores élite, se procede a seleccionar solo aquellos autores con igual o mayor cantidad a los trabajos obtenidos en el anterior paso. Ahora se llena el DataFrame

“df_au_elite”, un atributo de clase, con esta información para así poder manipular de mejor forma los datos, el primer paso es eliminar aquellas filas vacías, luego simplemente se ordena de mayor a menor la cantidad de trabajos que han escrito los autores, dejando de primeras los más productivos, y para finalizar, se vuelven a poner los índices de la tabla.

(39)

Para este ejemplo, si se realiza un zoom en la gráfica se puede notal que los autores élite serán aquellos con más de 9.5 trabajos. El programa aproxima a la cifra menor más cercana, así que, para este conjunto de datos, el programa entiende que los autores élite serán aquellos con 9 o más trabajos publicados.

De acuerdo con Urbizagástegui, Lotka propuso que se puede saber la cantidad de autores que han publicado ciertos trabajos utilizando la siguiente fórmula (1999).

𝐴𝑛 =𝐴1 𝑛2

(40)

Así que para el programa se implementó la “calculadora de Lotka”, la cual se encuentra dentro del método calculo_lotka y recibe como parámetro 𝑛, la cantidad de trabajos para los que se desea conocer cuántos autores hay según lo propuesto por Lotka.

La función y el método funcionan de la siguiente manera: 𝐴1 hace referencia a la cantidad de autores que han publicado solo un artículo, así que la variable aux tendrá DataFrame de Lotka filtrado con los trabajos que sean igual a 1. Ahora 𝐴 que es la cantidad de autores (variable “a” en el código) tendrá el valor de la cantidad de autores que han publicado solo un trabajo.

Ahora solo se necesita ejecutar la formula, donde la variable “a” se divide entre la variable “n” al cuadrado. Este método retorna un string, que se mostrará en la interfaz, donde se dirá que para n trabajos hay x autores.

Este cálculo no es 100% exacto, así que dentro de la interfaz se le explica al usuario cómo que para que sean mucho más exactos se prefiere que los datos que se van a ingresar pertenezcan a una temática específica.

Para finalizar la clase de autores, se explicará el funcionamiento del método filtro(), dentro del programa se permite que el usuario pueda filtrar aquellos artículos de investigación que ha publicado un autor en específico, esta acción se realiza a penas el usuario da doble clic en un nombre del autor, donde script Interfaz.py, llama a este método ingresando como parámetro el nombre al que el usuario ingresó.

Dentro de esta función, se realiza una consulta SQL donde se filtra el nombre del autor por aquel que se ingresa en la función y se llena el atributo de clase

“filtrado_df” con el DataFrame resultante.

(41)

11. Clase revistas y sus métodos:

Esta clase será encargada de manejar toda la información relacionada con las revistas que han publicado los documentos que se están analizando, dentro de sus métodos, se encuentra: uno para la realización del gráfico donde se evidencian a las revistas con mayor productividad, otro para el gráfico donde están las revistas con mayor citación, otro que permite hallar los datos de la ley de Bradford, otro para filtrar los artículos de cada zona y finalmente uno para filtrar los artículos de cada revista.

Al igual que la anterior clase, esta necesitará realizar una consulta SQL para obtener la información sobre las revistas, artículos y citas recibidas. Una vez se ha generado la consulta, estos datos se almacenan en un DataFrame para poder obtener los datos de una forma más eficiente en los siguientes métodos, al igual que antes, se utilizan los atributos de clase para poder acceder a los mismos desde cualquier otro Script.

El primer método se llama “revistas_mas_citados()”, dentro de este método se seleccionan solo las columnas con el nombre de la fuente y las citas recibidas de los artículos, luego los datos de las citas se transforman en un número (float, o decimal, ya que los datos venían en ese formato), para posteriormente agrupar los datos según el nombre de la revista y sumar las citas recibidas. Una vez realizado este proceso simplemente se ordenan los valores de mayor a menos para luego crear un gráfico de árbol o treemap con los datos obtenidos.

(42)

El método de las revistas más productivas es el mismo a los autores más productivos, con la principal diferencia de que, en vez de hacer un mapa de árbol, se graficó la productividad con un diagrama de barras. Una vez el programa termina de crear este gráfico, llama al método bradford().

Mediante el método bradford() se pretende presentar la ley de Bradford, esta ley busca demostrar que la distribución de artículos en las revistas es altamente desigual, de un lado, la mayoría de los artículos se encuentran concentrado en una pequeña población de revistas (zona 1 o núcleo), y del otro lado, una pequeña población de artículos se encuentra dispersa en una gran cantidad de revistas (zonas 2 y 3). (Urbizagástegui , 1996)

Dentro de la zona 1 o zona núcleo, se encontrarán las revistas dedicadas a la temática que se está analizando, dentro del programa se proponen tres usos de la información brindada con respecto a Bradford: 1) permite al usuario conocer aquellas revistas que más publican sobre el tema, por ende, permitirá dar una orientación para saber en cuál de las fuentes es más viable publicar su artículo de investigación. 2) Permite reconocer de qué revistas pueden sacar los artículos de investigación más acordes con su temática. 3) Es útil para realizar análisis bibliométricos sobre la temática que se está revisando.

Para saber cómo hallar la ley de Bradford, Urbizagástegui explica que se deben ordenar las revistas científicas de forma decreciente en cuanto a la productividad de artículos dentro de la temática que se está analizando. Una vez ordenadas, se procede a crear 3 grupos diferentes donde todos contengan la misma cantidad aproximada de artículos (1996).

(43)

Dentro del programa en el método de las revistas más productivas, ya se ha ordenado de mayor a menor la productividad de las revistas, así pues, solo resta encontrar las 3 zonas. Para ello se divide entre 3 la cantidad total de revistas, luego se redondea a un valor exacto y se procede a identificar las revistas de cada una de las zonas. Cada una de las zonas tendrá una cantidad de artículos publicados aproximada al resultado de la división.

Para encontrar las zonas, se itera la columna que tiene la cantidad de artículos publicados en cada revista, esta información se encuentra en la variable “cant”, así que se recorre la lista, ahora el programa procede a contar la cantidad de artículos, este procedimiento lo hará mientras que el total de artículos que ya ha pasado sea inferior al resultado de la división. El programa empieza llenando la zona 1 o zona núcleo, cuando ya ha pasado a la siguiente zona, se reinician los contadores y se llena una lista que contiene la información de cada una de las zonas.

Cada vez que el ciclo pasa a la siguiente revista, la variable “r” va a ir almacenando la información con la cantidad de revistas que se encuentra en cada una de las zonas. Cuando se llena la lista con la información de las zonas, se va a ingresar: el total de revistas en la zona, el porcentaje de revistas que se encuentra en esta zona, el total de artículos de la zona y, finalmente, el porcentaje de artículos que se encuentran en esta zona. Esta información será importante para la interfaz donde se encontrarán los botones con la información de cada una de las zonas.

(44)

Una vez se ha terminado de recolectar los datos sobre la ley de Bradford, los siguientes métodos serán filtros para que el usuario pueda seleccionar cada vez que desee revisar: 1) las revistas dentro de cada una de las zonas, acción que se realizará cada vez que el usuario seleccione cualquiera de los botones existentes en la página de Bradford. 2) los artículos publicados en cada una de las revistas existentes. No se explicará la creación de estos filtros ya que es el mismo proceso que se siguió con la clase autores.

12. Clase instituciones y sus métodos:

Esta clase será encargada de manejar toda la información relacionada con las instituciones a las cuales se encuentran adscritos los investigadores que han escrito los documentos que se están analizando, esta clase solo tiene dos métodos: uno para las instituciones más productivas y otro para el filtro de las instituciones.

Al igual que en las anteriores clases, el primer paso es obtener la información necesaria para hacer los análisis de estos datos. Para ello se realizó una consulta SQL para obtener el nombre de la institución y los títulos de los documentos. Una vez se tiene el DataFrame, el siguiente paso es crear un atributo de clase que contenga esta información.

Ahora, se va a obtener la informacion sobre las instituciones más productivas, para ello se agrupa el DataFrame por el nombre de las instituciones y se obtiene la cantidad de documentos que están adscritos a cada una de ellas. Una vez se tiene esta información en el DataFrame ”df_ins_pro”, se procede a seleccionar las 10 instituciones con mayor cantidad de documentos, posteriormente, se grafica esta información en un gráfico de barras.

Finalmente, se tiene al último método el cual permite filtrar la información, este método se explicó en la clase de autores y el proceso es muy similar.

(45)

13. Clase palabras y sus métodos:

Esta clase será encargada de manejar todas las palabras clave de los artículos.

Dentro de estas palabras se encuentran las dadas por los autores y las dadas por la base de datos, estas últimas también se conocen como “Keyword Plus”. La clase es compuesta por dos métodos diferentes: uno para crear las nubes de palabras basadas en las palabras clave, este gráfico se realiza con el método graficos(), y otro para filtrar todos los artículos que contengan una palabra en específico.

El método gráficos() solo contiene dos líneas de código, mediante estas líneas se llama al método nubes_palabras() de la clase “graficos”, este método recibe como parámetros: 1) el DataFrame que contiene la información de las palabras clave, en este caso se toman los DataFrame BDKEYWORD y AUKEYWORD de la clase

“baseDatos”. 2) Nombre de la columna de cada uno de los DataFrame. 3) El nombre del gráfico. Una vez termina de ejecutarse el método, los atributos de clase

“BD_keyword” y “autor_keyword” quedaran con los valores de los DataFrame que retorna la función tal y como se muestra en la imagen:

Ahora dentro de la clase “gráficos” se encuentra el método nubes_palabras() cuyo principal objetivo es crear las nubes de palabras, exportarlas y retornar un DataFrame con las repeticiones de cada una de ellas. El primer paso de este método es crear un texto, para ello se recorre la columna y se separa cada una de las palabras con un espacio en blanco. Una vez se tiene el texto completo se procede a determinar los “stopwords” o “palabras vacías” en español, estas palabras serán aquellas que no se quieren tener en la nube de palabras ya que carecen de significado por si solas. Para este programa, se tuvieron en cuenta las palabras vacías de dos idiomas: español e inglés.

Ahora se llama al método “WordCloud” de la librería “wordcloud” donde se ingresan las stopwords, el color de fondo, las dimensiones de la imagen y el texto. Una vez se ha creado el gráfico, se quitan los ejes, se aumenta el tamaño y se guarda la imagen con formato .png.

(46)

Ahora solo resta llenar el DataFrame con cada una de las palabras, para ello se agregan a la lista cada una de las palabras que se encuentran en la nube de palabras, luego se pasa a un DataFrame y se agrupa con las palabras, obteniendo una columna con la información sobre cuántas veces aparece la misma palabra. A continuación, se presenta el desarrollo de este método:

14. Clase país y sus métodos:

Esta clase será encargada de manejar todos aquellos datos relacionados con los países, tanto sus nombres como su código. Esta clase está compuesta por cuatro métodos diferentes: uno para la creación del mapa coroplético donde se podrá visualizar la producción por país, otro para obtener la información de colaboración de cada uno de los artículos y otros dos para filtrar tanto por colaboración como por país los títulos de los documentos.

Al igual que las clases anteriores, la clase países necesita un atributo de clase donde se tendrá la información completa sobre cada uno de los países, la consulta SQL será la siguiente:

(47)

Esta consulta es más larga que las demás ya que para conectar los países con los artículos se necesita pasar por la tabla de instituciones y la tabla paso entre las instituciones y los artículos. Adicionalmente, se le pide a la consulta que recupere todos aquellos países que tienen información.

Una vez se ha llenado el DataFrame, se procederá a agrupar los datos por el código y el nombre del país, como resultado, se obtendrá un DataFrame con la información de cada país con su respectivo código y la cantidad de documentos que se relacionan con él. Es importante resaltar que los autores escriben los documentos, cada autor está adscrito a una institución y, que cada institución, se encuentra ubicada en un país.

Una vez se tiene toda la información es el DataFrame, se llama al método mapa_paises() de la clase gráficos. Esta clase, como se evidencia en la siguiente imagen, pide como parámetro el DataFrame que contiene la información de los países, una vez dentro, se crea una figura utilizando la librería de Plotly para generar el mapa coroplético. Esta función recibe como parámetro: 1) la ubicación, la cual, por configuración de la librería, para que el programa sepa dónde ubicar cada uno de los artículos es necesario utilizar los códigos de países ALPHA-3, por esta razón, en este parámetro (locations) se pasan los códigos. 2) Dentro del parámetro color se incluirá la cantidad de artículos de cada país, ya que al ser un mapa de color cambiará dependiendo que tantos documentos se encuentren asociados con cada país. 3) El parámetro “hover_name” hace referencia a las etiquetas de cada país, por esta razón se pasa la columna “Nombre_pais”.

Cuando ya se tiene el gráfico dentro de la variable “fig”, se procede a guardar la figura en un archivo .jpg, figura que se expondrá en la interfaz y en un archivo .html el cual permitirá la interacción del usuario con el programa.

(48)

El siguiente método se llama colaboración, el mismo se compone de dos partes tal y como lo muestra la imagen, el principal objetivo de este método es determinar la colaboración que existió en cada uno de los documentos, esta colaboración puede ser internacional (si hay más de un país involucrado), nacional (si todos los autores son del mismo país) y la última sin colaboración (si el documento fue escrito solo por un autor).

La primera parte del método consiste en tomar del DataFrame “df_pais_articulo” (el mismo que se creó y modificó en el anterior método) y agruparlo por el título de los documentos, de esta forma se obtiene la cantidad de países que se encuentran relacionados con el artículo. Esta información queda almacenada en el DataFrame

“df_colaboración” en la columna llamada “Cantidad_Paises”, con la cual se va a llenar la nueva columna de colaboración, para ingresar los datos simplemente se pone un condicional donde se dice que, si la cantidad de países es mayor que 1 entonces la colaboración es internacional, de lo contrario será nacional.

Al terminar el proceso ya se ha diferenciado lo nacional de lo internacional, sin embargo, aún no se sabe si los nacionales son con o sin colaboración, para ello en la segunda parte del método se realiza la siguiente consulta de SQL:

En ella se está pidiendo que solo obtenga aquellos artículos que fueron escritos por solo una persona, ya con esta información dentro del DataFrame, se procede a buscar cada uno de los títulos alojados en esta nueva tabla dentro de

“df_colaboración”, para que, de esta forma, cada vez que el programa encuentre

(49)

una coincidencia, cambie la información de colaboración y la reemplace por el texto

“Sin colaboración”.

Una vez ha terminado de diligenciar toda la columna de colaboración, se procederá a generar un gráfico de torta para poder evidenciar de una mejor forma, la proporción de cada ítem.

15. Clase general y sus métodos:

Esta clase se llama “general” dado que crea muchos gráficos sobre los siguientes metadatos: producción por año, tipo de documento, idioma, acceso abierto, categorías, financiamiento y las citas recibidas por los documentos según año de publicación. Esta clase contiene once métodos diferentes que se explicarán de una forma breve a continuación.

Los gráficos sobre las publicaciones por año, el idioma y el tipo de documento serán las más fáciles de hacer, para ello solo se toma la columna correspondiente a cada metadato dentro del DataFrame “ARTICULO” de la clase “baseDatos”. Con esta información se procede a agrupar cada uno de los metadatos para así obtener la información de cuantos documentos por ítem se encuentran. Una vez se tiene toda esta información en los respectivos DataFrames, se procede a graficar de la siguiente forma:

Para los años se creó un diagrama de líneas donde se puede ver el avance de la literatura conforme pasan los años, para los idiomas se creó un diagrama de barras para poder comparar y encontrar en qué idiomas se escribe más sobre la temática, finalmente, para el tipo de documento se creó otro diagrama de barras para obtener la información de en cuales tipos de documentos se publica mayor frecuencia.

Para el método oa (OpenAccess) se realizó una consulta SQL donde se obtiene la información sobre el tipo de acceso que tiene cada uno de los documentos, una vez se tiene estos datos en un DataFrame, se procede a cambiar aquellos datos cuya información de acceso abierto sea “[No disponible]” por “Revistas por suscripción”.

(50)

Ahora se agrupan los datos con el tipo de acceso, para obtener cantidad de artículos en cada tipo y se termina generando un diagrama de torta con estos datos.

El método financiamiento se realiza de una forma muy parecida al de oa, la única diferencia es que se utiliza el gráfico de árbol, para el método de categoría, el proceso también es muy similar, con la diferencia de que cuando se va a graficar se realiza en un mapa de árbol donde, a diferencia de los vistos anteriormente, permite unas subdivisiones en cada rectángulo tal y como se muestra en la siguiente imagen. Es importante aclarar que este gráfico se realizó tomando los datos únicamente de la base de datos Web of Science.

El método citas_articulo permitirá crear el gráfico de citas recibidas por los documentos según año de publicación el cual, se realiza mediante un diagrama de líneas con doble eje, donde se tendrá la información de los artículos y citas en los dos ejes verticales y en el eje horizontal los años, esta gráfica permite conocer de forma simultánea el avance de las citas y los artículos conforme han pasado los años.

Para finalizar, se tienen los diferentes filtros que serán útiles para que el usuario pueda acceder a los artículos con algún metadato en específico. Estos procesos serán diferentes a los anteriores. Como se puede evidenciar en la imagen, la función

Referencias

Documento similar