Estoy trabajando con un corpus de documentos de texto (almacenados como una cadena de caracteres cada uno) que están predominantemente en inglés, pero incluyen algunos documentos en español y algunos que repiten la misma información tanto en inglés como en español. Usé los paquetes cld2 y cld3 (que implementan la funcionalidad de detección de idioma de Chrome en R) para estimar los idiomas contenidos en cada cadena del corpus. Mi objetivo es procesar todas las cadenas que contienen texto tanto en inglés como en español, de modo que las partes en inglés se conserven y las partes en español se eliminen.

Aquí hay un ejemplo de tres de las cadenas con las que estoy trabajando:

mixed.language.strings <- c("Department of Cultural Affairs and Special Events: Today will be the First Annual Mariachi and Folklorico Festival! Local groups begin at 1:00pm and world renowned headliners start at 3:00pm. It will be located in Millennium Park. Invite your friends, family, and neighbors to participate in this FREE event! \nEnjoy the weather on this beautiful Sunday! \n ************** \n Departamento de Asuntos Culturales y Eventos Especiales: Hoy será el Primer Festival Anual de Mariachi y Balet Folklórico! Los grupos locales comienzan a las 1:00 pm y los grupos de renombre mundial empiezan a las 3:00 pm. Será en el Millennium Park. Inviten a su familia, amigo@s, y vecin@s a este evento completamente GRATIS!", 
"Call or walk into our office for information on the Emergency Heating Repair Program which provides eligible low-income, owner-occupied homes grants for a new heating system.\n\nLlame o visite nuestra oficina para más información sobre un programa de la Ciudad ofreciendo dinero hacía la reparación o instalación de sistemas de calefacción. Dueños de casa de ingresos bajos son elegibles.   \n\n 3476 S. Archer Ave. \n (773) 523-8250", 
"Join me and other local elected officials for a workshop on appealing your property taxes. Homes in West & South townships of Cook County are currently eligible to appeal. See flier for more info, or call my office at 773-523-8250.\n\nLos invito a un taller sobre el proceso de apalear sus impuestos de propiedad. Hogares en los West y East “townships” del Condado de Cook son elegibles ahora para apalear sus impuestos. Por favor refiéranse al volante añadido a este mensaje, o llame mi oficina al 773-523-8250, para más información."
)

Por lo que he podido determinar, cld2 y cld3 pueden estimar los idiomas contenidos en una cadena, pero no pueden extraer partes de la cadena según el idioma.

¿Existe un paquete diferente en R que pueda usar para identificar las partes de cada cadena que están en cada idioma y dividir la cadena en dos en base a eso?

¡Gracias! Lo siento si esto no está claro; es la primera vez que publico.

2
Kumar 23 feb. 2018 a las 01:43

2 respuestas

La mejor respuesta

Aquí hay una implementación del enfoque que sugerí en mi comentario, que funcionará si espera nuevas líneas entre los idiomas en sus cadenas. (Este es el caso en todos sus ejemplos. Si no es cierto en general, tal vez podría intentar dividir en líneas nuevas, puntos, exclamaciones y signos de interrogación)

library('cld2')

list.of.strings <- strsplit(mixed.language.strings, '\n')
ExtractEnglishSubstrings <- function(string.vector) {
  return(string.vector[which(detect_language(string.vector) == 'en')])
}

lapply(list.of.strings, ExtractEnglishSubstrings)

Esto

[[1]]
[1] "Department of Cultural Affairs and Special Events: Today will be the First Annual Mariachi and Folklorico Festival! Local groups begin at 1:00pm and world renowned headliners start at 3:00pm. It will be located in Millennium Park. Invite your friends, family, and neighbors to participate in this FREE event! "
[2] "Enjoy the weather on this beautiful Sunday! "                                                                                                                                                                                                                                                                         

[[2]]
[1] "Call or walk into our office for information on the Emergency Heating Repair Program which provides eligible low-income, owner-occupied homes grants for a new heating system."

[[3]]
[1] "Join me and other local elected officials for a workshop on appealing your property taxes. Homes in West & South townships of Cook County are currently eligible to appeal. See flier for more info, or call my office at 773-523-8250."

Si prefiere que las cadenas se unan nuevamente y se devuelvan en un vector en lugar de como una lista de vectores, esta modificación debería hacer eso ...

ExtractEnglishSubstrings <- function(string.vector) {
  english.vector <- string.vector[which(detect_language(string.vector) == 'en')]
  reassembled.string <- paste0(english.vector, collapse=' ')
  return(reassembled.string)
}

unlist(lapply(list.of.strings, ExtractEnglishSubstrings))

Devuelve

[1] "Department of Cultural Affairs and Special Events: Today will be the First Annual Mariachi and Folklorico Festival! Local groups begin at 1:00pm and world renowned headliners start at 3:00pm. It will be located in Millennium Park. Invite your friends, family, and neighbors to participate in this FREE event!  Enjoy the weather on this beautiful Sunday! "
[2] "Call or walk into our office for information on the Emergency Heating Repair Program which provides eligible low-income, owner-occupied homes grants for a new heating system."                                                                                                                                                                                    
[3] "Join me and other local elected officials for a workshop on appealing your property taxes. Homes in West & South townships of Cook County are currently eligible to appeal. See flier for more info, or call my office at 773-523-8250."   
1
HarlandMason 22 feb. 2018 a las 23:02

Para cualquier otra persona que esté abordando un problema similar, hice algunas modificaciones al excelente código que ofrecía HardlandMason.

El código debajo mantiene subcadenas , similar a lo que ofreció HarlandMason, con dos cambios: (1) en lugar de tomar un vector de cadenas de caracteres como entrada, toma una sola cadena de caracteres y genera una sola cadena de caracteres; y (2) le permite ingresar el idioma de las subcadenas que le gustaría mantener (en el formato requerido por la función cld2::detect_language).

KeepSubstrings.bylanguage <- function(string, language) {
string.vector <- unlist(strsplit(string, '\n'))
cut.vector <- string.vector[which(cld2::detect_language(string.vector) == language)]
reassembled.string <- paste0(cut.vector, collapse=' ')
return(reassembled.string)
}

El código siguiente es similar, pero elimina las subcadenas de un determinado idioma en lugar de retener solo las subcadenas de un determinado idioma (esto es útil si algunas de las subcadenas son muy cortas y, por lo tanto, plantean problemas para {{X0} } función, y preferiría tener más cuidado al retener subcadenas sobre las cuales la función es incierta):

RemoveSubstrings.bylanguage <- function(string, language) {
string.vector <- unlist(strsplit(string, '\n'))
cut.vector <- string.vector[which(cld2::detect_language(string.vector) != language)]
reassembled.string <- paste0(cut.vector, collapse=' ')
return(reassembled.string)
}

Ambos se pueden aplicar sobre un vector de cadenas de caracteres usando lapply o sapply como se sugiere en la respuesta anterior.

0
Kumar 23 feb. 2018 a las 15:35