programminghistorian / ph-submissions

The repository and website hosting the peer review process for new Programming Historian lessons
http://programminghistorian.github.io/ph-submissions
136 stars 111 forks source link

Propuesta de lección: Uso de las colecciones del HathiTrust para el análisis de textos literarios en R #579

Open jenniferisasi opened 1 year ago

jenniferisasi commented 1 year ago

The Programming historian en español ha recibido una propuesta de lección con el título provisional "Uso de las colecciones del HathiTrust para el análisis de textos literarios en R" por @jose-eduardo. Los objetivos de la lección son:

  1. Cómo accesar los datos (y metadatos) disponibles en el sitio de HathiTrust a través de su API.
  2. Cómo utilizar R para transformar y manipular los datos obtenidos de manera que sea posible usarlos para la minería textual,
  3. Cómo crear las “colecciones” de metadatos en HathiTrust y su utilidad (y limitaciones) para avanzar la investigación en español.

La fecha aproximada para la entrega de la lección es el 31 de agosto de 2023. Si no se entrega para entonces, la editora manager contactará con el autor de la lección para sugerir otra fecha. Si no recibe noticias, el ticket se cerrará. Éste podrá abrirse en el futuro a petición del autor.

El principal contacto para esta lección es, por ahora, @jenniferisasi. Si se produce algún problema, el autor puede contactar con nuestra ’ombudsperson' (Silvia Gutiérrez de la Torre - http://programminghistorian.org/es/equipo-de-proyecto).

jenniferisasi commented 1 year ago

Acuso recibo del borrador de la lección de parte de @jose-eduardo. Como ME voy a darle una primera vuelta para asegurarme de que el markdown y demás son correctos para que funcione la previsualización.

En los próximos días pasaré los archivos a @anisa-hawes y estarán listos para que @JoshuaGOB dé inicio a la edición y revisión de la lección.

jenniferisasi commented 1 year ago

Notas para que @JoshuaGOB tenga en cuenta:

anisa-hawes commented 1 year ago

Hola @jenniferisasi,

Puedes encontrar los archivos clave aquí:

Y puedes revisar la vista previa de la lección aquí:

jenniferisasi commented 1 year ago

¡Gracias @anisa-hawes! Con esto, queda en manos de @JoshuaGOB para que inicie el proceso de edición y después de revisión por pares.

jose-eduardo commented 1 year ago

Ahora me doy cuenta de tantos errores. La "table" salió mal-- mi inexperiencia con Markdown es el culpable en este caso. Gracias!

anisa-hawes commented 1 year ago

Apologies, @jose-eduardo. I missed that, but I have fixed it now!

--

Mis disculpas, @jose-eduardo. Se me pasó, ¡pero ya lo he arreglado!

rivaquiroga commented 1 year ago

@jenniferisasi, si necesitas revisores para esta lección yo estoy disponible 👀

jose-eduardo commented 1 year ago

@anisa-hawes the R file "obtener_tokens.r" (for those using Windows) should be included in "assets" --I guess I forgot to include a link to that in the tutorial (sorry)

anisa-hawes commented 1 year ago

Dear @jose-eduardo. Apologies – I wrote myself a note to ask Jenn about this.

I've uploaded the file https://github.com/programminghistorian/ph-submissions/commit/878562a5cbaa567221fb49e6ba15b129204dc5ec and also added a link from line 457 https://github.com/programminghistorian/ph-submissions/commit/73286d50bac4be56be5d076d4a8d313d12394132. (Is this the right place for the link?)

jenniferisasi commented 1 year ago

Thank you @anisa-hawes! Yes, that is the correct placement on the link :)

JoshuaGOB commented 1 year ago

Saludos @jose-eduardo,

Quiero felicitarte por esta excelente lección. Es un aportación importantísima para el estudio de literatura a gran escala. Ya terminé la primera pasada y la semana que viene debo tener las sugerencias finales. Aquí apunto los detallitos que encontré en esta versión.

¡Gracias por su ayuda, @jenniferisasi y @anisa-hawes !

Estoy utilizando los números de párrafos que se encuentran en la previsualización de la lección

ggplot2, tmap, rnaturalearth, y sf.

#para manipular datos y archivos
>library(tidyverse)
>library(readr)
>library(readxl)
>library(stringr)

#para mapas y visualización
>library(rnaturalearth)
>library(ggplot2)
>library(tmap)
>library(sf)
jose-eduardo commented 1 year ago

Gracias por las correcciones @JoshuaGOB . Solo una pregunta, después que terminen con las correcciones, ¿cómo se procede?--¿yo hago las correcciones y les envío una copia por email? Gracias a todos

anisa-hawes commented 1 year ago

Hola @jose-eduardo,

We invite you to make the adjustments to the file, which is here: /es/borradores/originales/uso-las-colecciones-hathitrust-mineria-textual-R.md.

We don't use the Pull Request system during this Phase of the workflow, rather authors can make direct changes to their lesson. GitHub's agility for capturing successive versions of a file is a great asset to us in this Phase: Joshua will be able to review exactly what has been edited in the file's commit history.

Please ask me if you have any questions or uncertainties – I'm more than happy to help.

jose-eduardo commented 11 months ago

Made all the necessary changes. Not sure if there is anything else I need to do here.

anisa-hawes commented 11 months ago

Hola @jose-eduardo,

Thank you for your edits in response to Joshua's feedback. The next step is for @JoshuaGOB to review the revised version, then identify two peer reviewers who we will invite to respond to your lesson.

Very best wishes, Anisa

JoshuaGOB commented 11 months ago

Hola @jose-eduardo Disculpa la demora y gracias por tu paciencia.

Después de incorporar estas últimas sugerencias, la lección estaría lista para las revisoras.

Desde la línea 338 a 370, considera añadir comandos para ilustrar los datos antes y después de los cambios:

>metadatos$author[c(3,36,94)]<-sub("\\...*", "", metadatos$author[c(3,36,94)])
>filtro_regex <- metadatos[c(3, 36, 77, 94), "author"]
>print(filtro_regex)
"considerar también"
>print(paste("Después de modificar:", filtro_regex))

"considerar también:"

print(paste("Segunda modificación:", filtro_regex))

- [x] 557 - Parece que hay un corchete demás después de la barra vertical: 

ciudades_encontradas<-ciudades_encontradas |> group_by(GRUPO, prov) | > mutate(num_por_prov = sum(ocurrencias_por_50_mil))

Tan pronto estés listo, presentamos a las revisoras. Es una excelente lección y me encantó aprender tanto de R como de HathiTrust.

jose-eduardo commented 10 months ago

Ya está todo. He añadido además unos consejos en la última sección para los usuarios que estén trabajando con cientos y cientos de datos y el Rstudio no tenga la capacidad para manejar eso.

jenniferisasi commented 10 months ago

¡Súper, @jose-eduardo! Gracias por hacer los cambios sugeridos por @JoshuaGOB.

@JoshuaGOB, me dices si te puedo echar una mano en algo - solo estoy pasando por todos los tickets para estar al día.

JoshuaGOB commented 9 months ago

Saludos, @jose-eduardo Revisé los cambios y los consejos en la última sección me parecen perfectos.

La revisión de la lección está en las excelentes manos de @jenniferisasi y @rivaquiroga. Tan pronto tengamos sus sugerencias, la lección puede pasar al próximo paso.

rivaquiroga commented 9 months ago

¡Hola, @JoshuaGOB! Para la revisión seguimos ese orden? Es decir, primero @jenniferisasi hace su revisión y luego yo?

JoshuaGOB commented 9 months ago

Hola, @rivaquiroga: ¿Prefieres empezar tú? Entiendo que @jenniferisasi prefiere hacer su revisión un poco más tarde.

rivaquiroga commented 9 months ago

¡Hola! Podría hacer mi revisión después del 12 de diciembre (tengo que entregar mi tesis ese día 😬)

jenniferisasi commented 8 months ago

¡Hola! Vamos a ver si yo puedo hacer mi revisión antes de esa fecha entonces. @rivaquiroga, nos tendrás que contar de tu tesis :)

jenniferisasi commented 8 months ago

Estimados. Doy comienzo a mi revisión. Trataré de hacerlo de una pero si ven que faltan cosas, seguiré con ello pronto:

Hago pausa en la sección de analizar colecciones pero sigo pronto.

jose-eduardo commented 8 months ago

No sé si debo explicar ahora o esperar a que Jennifer termine su revisión (?).

Puedo aclarar por el momento que http://hdl.handle.net/2027/ es la dirección oficial para buscar los libros por ID. Sí, te redirige a "babel... etc...", pero si en el futuro Hathitrust decidiera cambiar de "babel" a otro sitio, te redirigiría al nuevo. (Véase para esto la lección https://programminghistorian.org/en/lessons/text-mining-with-extracted-features)

jenniferisasi commented 7 months ago

Hola @jose-eduardo. Disculpa la demora en responder - me desconecté lo más posible del trabajo durante las vacaciones.

Puedes esperar a que demos todas nuestras revisiones antes de hacer ningún cambio, para evitar darle demasiadas vueltas al texto/archivo. Como seguí las instrucciones de la lección para nuestro experimento en MLA, espero terminar de revisar y dejar mis comentarios aquí mañana mismo, viernes 12 de enero.

jenniferisasi commented 6 months ago

Listo. Perdón por el nuevo retraso.

Verifiqué dos veces que del párrafo 25 en adelante todo funciona y sí. Puede que @rivaquiroga, que enseña R de forma regular, tenga sugerencias extra.

Probé el código como uno de los 3 métodos que @JoshuaGOB y yo probamos para MLA. Este resultó el menos "limpio", por así decirlo, porque - cómo bien apuntas en las notas finales - al buscar lugares por token, se pierde el contexto y no se puede verificar si el lugar está en, no sé, México o Venezuela. Tampoco hicimos el mapa porque las novelas eran de muchos países, pero aquí funciona de maravilla por ser el tema estudiado la novela de Ecuador.

@rivaquiroga y @JoshuaGOB queda en vuestras manos :)

rivaquiroga commented 6 months ago

¡Hola! A fines de la próxima semana envío mi revisión 🤓

rivaquiroga commented 6 months ago

¡Hola, @jose-eduardo!

Muchas gracias por tu lección. Conocía hathiTrust, pero nunca había explorado con detalle como ahora sus funcionalidades. Quedé muy entusiasmada y con muchas ideas ✨. La lección permite hacerse una idea general de cómo funciona y de su potencial para hacer análisis exploratorios.

A continuación hay algunas sugerencias que se me han ocurrido luego de leer la lección y realizar los ejercicios propuestos. Primero hay un comentario general sobre el formato del código y luego comentarios más detallados por sección o párrafo. Como solo los párrafos de texto tienen número, a los de código hice referencia indicando el número del párrafo anterior.

Sugerencias generales

codigo-ancho

Si tienes todo el código en un script, la manera más rápida de resolver eso es con el paquete styler, que puede formatear todo el código de un archivo. No solo va a agregar los saltos de línea necesarios después de cada pipe, sino que también va a agregar espacios entre elementos del código (por ejemplo, antes y después de <-).

Sugerencias por sección/párrafo

Objetivos

Requisitos

Instalar y cargar paquetes

Obtener los atributos extraídos de un volumen

ggplot(tokens_maria, aes(page, num_tokens)) +
  geom_line(color = "blue") +
  geom_vline(xintercept = capitulos$page, color = "red") +
  labs(x = "páginas", y = "tamaño") +
  theme_classic()

Una mirada global a nuestro marco de datos

Trabajar con colecciones de HathiTrust

Crear tu propia colección

Geografía en la novela

metadatos <- left_join(metadatos, fechas) |> 
  select(-rights_date_used)

nas

iconv no suele dar resultados consistentes entre sistemas operativos. Sugiero utilizar la función stri_trans_general() del paquete stringi. Ese paquete se instala junto con el paquete stringr, así que puede utilizar llamando directamente la función:

metadatos$author <- stringi::stri_trans_general(str = metadatos$author, id = "Latin-ASCII")
metadatos %>%
  count(author, sort = TRUE) 

Obtener los atributos extraídos para el proyecto

Windows: Otra manera de construir el marco de datos

Análisis y visualización de datos

>table(ciud_unicas$GRUPO)

 1900-25  1925-50 Pre-1900 
      71      133       54 

En ella Pre-1900 queda después de 1900-25. Si bien en la lección esa es la única parte en que afecta, si alguien quisiera hacer algún gráfico que muestre comparaciones entre esos grupos le aparecerían en desorden también si es que la variable no se convierte a factor. La conversión se podría hacer dentro de case_when() usando el argumento .ptype.. El bloque de código podría quedar así:

metadatos <- metadatos %>%
  mutate(GRUPO = case_when(
    publicacion > 1860 & publicacion <= 1900  ~ "Pre-1900",
    publicacion > 1900 & publicacion <= 1925 ~ "1900-25",
    publicacion > 1925 & publicacion <= 1950 ~ "1925-50",
    .default = NA_character_,
    .ptype = factor(levels = c("Pre-1900", "1900-25", "1925-50"))
  )) 

Análisis y visualización de datos

duplicados

Como tenemos los datos de autor y título, uno tendría aquí la posibilidad de revisar y decidir a cuál de las dos corresponde a partir del conocimiento que se tiene de las obras. Y así se elimina el duplicado de manera informada. El argumento multiple tiene otras opciones: "first", "last" y "any". Eso da control sobre estos casos sobre si se quiere dejar la primera, la última, o cualquiera. La otra ventaja de usar un join es que cuando ocurre un caso como este en que el nombre abreviado de la ciudad no es único sino que aparece repetido, la función entrega un mensaje que informa sobre esto: Detected an unexpected many-to-many relationship between x and y. Esto nos permite saber que tenemos que revisar nuestro dataset para resolver la asignación de los nombres de las ciudades.

> mean(ciudades_encontradas$total_volumen)
[1] 72001.25

Y la mediana está más cerca de los 60000.

> summary(ciudades_encontradas$total_volumen)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   4922   45239   63941   72001   84480  184923 

Quizás sería bueno explicar cómo se decidió que 50000 era la mejor opción.

Limitaciones y recomendaciones


Eso es todo por ahora. ¡Cualquier consulta me avisan!

JoshuaGOB commented 6 months ago

Mil gracias por las revisiones tan detalladas y minuciosas, @jenniferisasi y @rivaquiroga

@jose-eduardo Ya que algunos de estos cambios requieren más tiempo que otros, podríamos fijar una fecha con suficiente tiempo para que puedas dialogar conmigo y con las revisoras. ¿Qué tal te parece el 18 de marzo? Sé que el proceso se ha retrasado(mea culpa) y me imagino que quieres terminar lo más pronto posible. Por favor déjame saber cómo puedo ayudar y te animo a aprovechar el expertise de las revisoras para aclarar cualquier duda.

Nuevamente, gracias por el trabajo excelentísimo de las revisoras.🤩 Es un privilegio trabajar con autores y revisores cómo ustedes.

jose-eduardo commented 5 months ago

Gracias a tod@s por el trabajo realizado. Ha sido excelente. La próxima semana ( a partir del sábado próximo) tenemos las breves vacaciones de primavera y entonces tendré tiempo para contestar preguntas y hacer las revisiones que se requieren.

jose-eduardo commented 4 months ago

Tengo que entregar un manuscrito en 4 de abril, pero una vez lo haga regreso a este proyecto. ¡No se me ha olvidado!

jenniferisasi commented 2 months ago

Estimados, ¿cómo siguen? @jose-eduardo ¿tienes una fecha estimada de cuándo completarás la revisión? Es nada más para yo calcular fechas de siguientes pasos en la revista. ¡Gracias!

jenniferisasi commented 1 month ago

Estimados @JoshuaGOB y @jose-eduardo, ¿cómo van? Paso nada más a preguntar si necesitan ayuda para los siguientes pasos de revisión final. Me encantaría publicar esta magnífica lección para primeros de septiembre, lo cual nos evitaría caer en un nuevo semestre (sabiendo lo que ello conlleva). ¡Gracias!

jose-eduardo commented 1 month ago

Gracias Jennifer, en estos días volveré a trabajar en esto. No necesito ayuda, solo..tiempo...Lo siento si se me he tardado más de lo debido. Estoy seguro que estará listo para septiembre.

jose-eduardo commented 1 month ago

@jenniferisasi Parece que la mejor solución para esos problemas que menciona Quiroga es eliminar la sección final, con los mapas, y ofrecer algo más sencillo que no necesite paquetes como tmap, sf y otros. Eso haré esta semana.

anisa-hawes commented 1 month ago

Gracias, @jose-eduardo!

I've double-checked that you have the Write access you need, but please let us know if you need any practical support with making these revisions 🙂

jose-eduardo commented 1 month ago

@jenniferisasi y @anisa-hawes acabo de terminar mis revisiones. Leyendo las excelentes sugerencias de @rivaquiroga me di cuenta que habían dos problemas principales con el tutorial: 1] falta de foco y 2] el uso de varios paquetes de R que pueden dejar de funcionar en el futuro lo que le restaría utilidad al tutorial a menos que se le actualizara. Al rehacerlo, seguí por eso las recomendaciones de @rivaquiroga de que la sección sobre novela mexicana se convirtiera en un primer paso hacia la creación del conjunto de novelas ecuatorianas y de esa manera habría un mejor flujo de una sección a otra. Para el enfoque también ayudó eliminar otras partes que no tenían nada que ver con el propósito principal: enseñar cómo usar los datos de Hathitrust para mineria textual.

Eliminados: varios paquetes que ahora son innecesarios como ggplot, sf, tmap, rnaturalearth, tidyverse. Siguiendo el consejo de Riva Quiroga, he eliminado el paquete "plyr" del código para Windows.

Finalmente, he eliminado las secciones de "limpiar" datos y crear mapas. Estaban desconectados con el tópico principal. Por último, tengo nuevas imágenes, y no sé cómo añadirlas al github (no quiero romper nada), así que se las puedo enviar por email, con indicaciones de donde colocarlas, a @jenniferisasi

anisa-hawes commented 1 month ago

Thank you, @jose-eduardo!

If you haven't already emailed the images to Jennifer, feel free to email the new images directly to me: admin[@]programminghistorian.org. I'd be happy to process and upload these for you.

It would be wonderful if you could either share line numbers from the Markdown file /es/borradores/originales/uso-las-colecciones-hathitrust-mineria-textual-R, or paragraph numbers within the lesson Preview https://programminghistorian.github.io/ph-submissions/es/borradores/originales/uso-las-colecciones-hathitrust-mineria-textual-R so that we know where you want these new figures to be located within your lesson.

jenniferisasi commented 1 month ago

¡Gracias @jose-eduardo! Me apunto re-leer la lección con un ojo atento a los cambios realizados. @JoshuaGOB cuando tengas un ratito, dinos también qué te parecen los cambios.

Y sobre las imágenes, como dijo Anisa, me las puedes enviar a mí o directamente a ella y nos encargamos de añadirlas.

Sé que estuviste ocupado: ¡Felicidades por la nueva doctora cornhusker!

charlottejmc commented 1 month ago

Hi @jose-eduardo and @jenniferisasi,

I've uploaded the new images to the lesson's image folder, and I've also inserted the liquid syntax at the indicated spots in the markdown file (see this commit).

@jose-eduardo, I would be very grateful if you could double-check that they are where you want them – feel free to make direct edits where needed.

Can I also ask that you provide the alt-text and figure caption for Figures 5-8? You can edit the liquid syntax directly in the file as well.

Muchas gracias ✨

jose-eduardo commented 3 weeks ago

Hi @charlottejmc and @jenniferisasi . I have changed the position of one of the images and everything looks perfect now and I added the captions-- you guys probably want to fix the image numbers for figures 5, 6 and 7 so they correspond to the number I am giving them on the tutorial (makes sense?). I think this is ready and now it is up to you guys to decide if more changes are needed.

best

JEG

charlottejmc commented 2 weeks ago

Hi @jose-eduardo, thank you for letting me know! I've updated the image numbers now for 5, 6 and 7, so it should display correctly.

anisa-hawes commented 2 weeks ago

Hola @jose-eduardo,

Thank you for your work on these revisions!

Next @JoshuaGOB and @jenniferisasi will read your lesson through, to confirm that it is ready to move onwards to the next phase of our workflow which is Phase 6: Sustainability + Accessibility. As this is an original lesson, the first part of that process will be copyediting.

I think we are on track to publish before the end of September ✨

jose-eduardo commented 2 weeks ago

Algo que he notado es que la previsualización todavía tiene un enlace al archivo "obtener_tokens.r" viejo. Estoy añadiendo aquí el nuevo, que no necesita usar el paquete "plyr". obtener_tokens.zip