sentimientos - como usar r studio
Detectar el idioma del texto en R (6)
tl; dr :
cld2
es el más rápido por lejos (cld3
x 22 ,textcat
x 118 , solución hecha a mano x 252 )
Se ha discutido mucho sobre la precisión aquí, lo cual es comprensible para los tweets. Pero ¿qué pasa con la velocidad?
Aquí hay un punto de referencia de cld2
, cld3
y textcat
.
Incluí también alguna función ingenua que escribí, contando las ocurrencias de palabras clave en el texto (usa tm::stopwords
).
Pensé que para textos largos podría no necesitar un algoritmo sofisticado, y probar varios idiomas podría ser perjudicial. Al final, mi enfoque termina siendo el más lento (lo más probable es que los enfoques empaquetados estén en bucle en C
.
Lo dejo aquí para que pueda dedicar tiempo a aquellos que tengan la misma idea. Espero que la solución de Tyler Rinker
también sea lenta (probar solo un idioma, pero hay muchas más palabras para probar y un código similar).
detect_from_sw <- function(text,candidates){
sapply(strsplit(text,''[ [:punct:]]''),function(y)
names(which.max(sapply(candidates,function(x) sum(tm::stopwords(x) %in% y))))
)
}
El punto de referencia
data(reuters,package = "kernlab") # a corpus of articles in english
length(reuters)
# [1] 40
sapply(reuters,nchar)
# [1] 1311 800 511 2350 343 388 3705 604 254 239 632 607 867 240
# [15] 234 172 538 887 2500 1030 538 2681 338 402 563 2825 2800 947
# [29] 2156 2103 2283 604 632 602 642 892 1187 472 1829 367
text <- unlist(reuters)
microbenchmark::microbenchmark(
textcat = textcat::textcat(text),
cld2 = cld2::detect_language(text),
cld3 = cld3::detect_language(text),
detect_from_sw = detect_from_sw(text,c("english","french","german")),
times=100)
# Unit: milliseconds
# expr min lq mean median uq max neval
# textcat 212.37624 222.428824 230.73971 227.248649 232.488500 410.576901 100
# cld2 1.67860 1.824697 1.96115 1.955098 2.034787 2.715161 100
# cld3 42.76642 43.505048 44.07407 43.967939 44.579490 46.604164 100
# detect_from_sw 439.76812 444.873041 494.47524 450.551485 470.322047 2414.874973 100
Nota sobre la inexactitud del texto.
No puedo comentar sobre la precisión de cld2
frente a cld3
(@giocomai afirmó que cld2
fue mejor en su respuesta), pero confirmo que el textcat
parece muy poco confiable (está incluido en varios lugares de esta página). Todos los textos fueron clasificados correctamente por todos los métodos anteriores, excepto este clasificado como español por textcat
:
"La producción de crudo argentino se redujo en 10.8% en enero de 1987 a 12.32 millones de barriles, de 13.81 millones de barriles en enero de 1986. Yacimientos Petroliferos Fiscales / n dijo. / N Enero de 1987 la producción de gas natural ascendió a 1,15 mil millones de cúbicos, 3,6% más De 1.100 millones de metros cúbicos producidos / nin enero de 1986, agregó Yacimientos Petroliferos Fiscales. / n Reuter "
En RI tengo una lista de tweets y me gustaría mantener solo los que están en inglés.
Me pregunto si alguno de ustedes conoce un paquete R que proporcione una forma sencilla de identificar el idioma de una cadena.
Saludos, z
El paquete cldr
en una respuesta anterior ya no está disponible en CRAN y puede ser difícil de instalar. Sin embargo, las bibliotecas cld
Google (Chromium) ahora están disponibles en R a través de otros paquetes dedicados, cld2
y cld3
.
Después de probar con algunos miles de tweets en varios idiomas europeos, puedo decir que entre las opciones disponibles, textcat
es, con mucho, el menos confiable. Con textcat
también recibo con bastante frecuencia los tweets detectados erróneamente como "middle_frisian", "rumantsch", "sanskrit" u otros idiomas inusuales. Puede ser relativamente bueno con otros tipos de textos, pero creo que textcat
es bastante malo para los tweets.
cld2
parece ser en general aún mejor que cld3
. Si desea una forma segura de incluir solo los tweets en inglés, aún puede ejecutar cld2
y cld3
y mantener solo los tweets que ambos reconocen como inglés.
Aquí hay un ejemplo basado en una búsqueda de Twitter que generalmente ofrece resultados en muchos idiomas diferentes, pero siempre incluye algunos tweets en inglés.
if (!require("pacman")) install.packages("pacman") # for package manangement
pacman::p_load("tidyverse")
pacman::p_load("textcat")
pacman::p_load("cld2")
pacman::p_load("cld3")
pacman::p_load("rtweet")
punk <- rtweet::search_tweets(q = "punk") %>% mutate(textcat = textcat(x = text), cld2 = cld2::detect_language(text = text, plain_text = FALSE), cld3 = cld3::detect_language(text = text)) %>% select(text, textcat, cld2, cld3)
View(punk)
# Only English tweets
punk %>% filter(cld2 == "en" & cld3 == "en")
Finalmente, tal vez debería agregar lo obvio si esta pregunta está relacionada específicamente con los tweets: Twitter proporciona a través de la API su propia detección de idioma para los tweets, y parece ser bastante preciso (comprensiblemente menos con los tweets muy cortos). Entonces, si ejecuta rtweet::search_tweets(q = "punk")
, verá que el data.frame resultante incluye una columna "lang". Si obtiene sus tweets a través de la API, probablemente pueda confiar en el propio sistema de detección de Twitter más que en las soluciones alternativas sugeridas anteriormente (que siguen siendo válidas para otros textos).
No estoy seguro de R, pero hay varias bibliotecas para otros idiomas. Puedes encontrar algunos de ellos recogidos aquí:
http://www.detectlanguage.com/
También un proyecto interesante reciente:
http://blog.mikemccandless.com/2011/10/language-detection-with-googles-compact.html
Usando esta biblioteca se produjo el mapa de idiomas de Twitter:
http://www.flickr.com/photos/walkingsf/6277163176/in/photostream
Si no encuentra una biblioteca para R, sugiero considerar el uso de un detector de idioma remoto a través del servicio web.
Pruebe http://cran.r-project.org/web/packages/cldr/ que lleva la detección de idioma de Google Chrome a R.
#install from archive
url <- "http://cran.us.r-project.org/src/contrib/Archive/cldr/cldr_1.1.0.tar.gz"
pkgFile<-"cldr_1.1.0.tar.gz"
download.file(url = url, destfile = pkgFile)
install.packages(pkgs=pkgFile, type="source", repos=NULL)
unlink(pkgFile)
# or devtools::install_version("cldr",version="1.1.0")
#usage
library(cldr)
demo(cldr)
Un enfoque en R sería mantener un archivo de texto de palabras en inglés. Tengo varios de estos, uno de ellos, de http://www.sil.org/linguistics/wordlists/english/ . Después de obtener el archivo .txt, puede usar este archivo para hacer coincidir cada tweet. Algo como:
lapply(tweets, function(x) EnlishWordComparisonList %in% x)
Usted querría tener algún porcentaje de umbral para cortar para determinar si es inglés (elegí arbitrariamente .06).
EnglishWordComparisonList<-as.vector(source(path to the list you downloaded above))
Englishinator<-function(tweet, threshold = .06) {
TWTS <- which((EnlishWordComparisonList %in% tweet)/length(tweet) > threshold)
tweet[TWTS]
#or tweet[TWTS,] if the original tweets is a data frame
}
lapply(tweets, Englishinator)
Realmente no he usado esto porque uso la lista de palabras en inglés de manera muy diferente en mi investigación, pero creo que esto funcionaría.
El paquete textcat
hace esto. Puede detectar 74 ''lenguajes'' (más apropiadamente, combinaciones de lenguaje / codificación), más con otras extensiones. Detalles y ejemplos están en este artículo disponible gratuitamente:
Hornik, K., Mair, P., Rauch, J., Geiger, W., Buchta, C., y Feinerer, I. El paquete textcat para la categorización de texto basada en n-Gram en R. Journal of Statistical Software, 52, 1-17.
Aquí está el resumen:
La identificación del idioma utilizado normalmente será el primer paso en la mayoría de las tareas de procesamiento de lenguaje natural. Entre la amplia variedad de métodos de identificación de lenguaje discutidos en la literatura, los que emplean el enfoque de Cavnar y Trenkle (1994) para la categorización de texto basada en frecuencias de caracteres n-gram han sido particularmente exitosos. Este documento presenta el paquete de extensión R textcat para la categorización de texto basada en n-gramas que implementa tanto el enfoque de Cavnar y Trenkle como un enfoque reducido de n-gramas diseñado para eliminar las redundancias del enfoque original. Se utiliza un corpus multilingüe obtenido de las páginas de Wikipedia disponibles en una selección de temas para ilustrar la funcionalidad del paquete y el rendimiento de los métodos de identificación de idiomas proporcionados.
Y aquí está uno de sus ejemplos:
library("textcat")
textcat(c(
"This is an English sentence.",
"Das ist ein deutscher Satz.",
"Esta es una frase en espa~nol."))
[1] "english" "german" "spanish"