r utf-8 iconv text-mining

Entrada inválida del paquete rm en ''utf8towcs''



utf-8 iconv (13)

A menudo me he encontrado con este problema y esta publicación de desbordamiento de pila es siempre lo que aparece primero. He usado la solución principal antes, pero puede eliminar los caracteres y reemplazarlos con basura (como convertirlos a it''s ).

¡He encontrado que en realidad hay una solución mucho mejor para esto! Si instala el paquete stringi , puede reemplazar tolower() con stri_trans_tolower() y luego todo debería funcionar bien.

Estoy tratando de usar el paquete tm en R para realizar un análisis de texto. Até lo siguiente:

require(tm) dataSet <- Corpus(DirSource(''tmp/'')) dataSet <- tm_map(dataSet, tolower) Error in FUN(X[[6L]], ...) : invalid input ''RT @noXforU Erneut riesiger (Alt-)�lteppich im Golf von Mexiko (#pics vom Freitag) http://bit.ly/bw1hvU http://bit.ly/9R7JCf #oilspill #bp'' in ''utf8towcs''

El problema es que algunos caracteres no son válidos. Me gustaría excluir del análisis los caracteres no válidos desde R o antes de importar los archivos para su procesamiento.

Intenté usar iconv para convertir todos los archivos a utf-8 y excluir todo lo que no se puede convertir de la siguiente manera:

find . -type f -exec iconv -t utf-8 "{}" -c -o tmpConverted/"{}" /;

como se señaló aquí. Conversión por lotes de archivos latin-1 a utf-8 usando iconv

Pero sigo teniendo el mismo error.

Apreciaría cualquier ayuda.


Acabo de encontrarme con este problema. ¿Por casualidad estás usando una máquina con OSX? Estoy y parece que he rastreado el problema hasta la definición del conjunto de caracteres con el que se compila R en este sistema operativo (consulte https://stat.ethz.ch/pipermail/r-sig-mac/2012-July/009374.html )

Lo que estaba viendo es que usando la solución de las Preguntas Frecuentes

tm_map(yourCorpus, function(x) iconv(enc2utf8(x), sub = "byte"))

me estaba dando esta advertencia:

Warning message: it is not known that wchar_t is Unicode on this platform

Esto se remonta a la función enc2utf8 . La mala noticia es que este es un problema con mi sistema operativo subyacente y no con R.

Así que aquí está lo que hice como una solución:

tm_map(yourCorpus, function(x) iconv(x, to=''UTF-8-MAC'', sub=''byte''))

Esto obliga a iconv a usar la codificación utf8 en el Macintosh y funciona bien sin la necesidad de volver a compilar.


Creo que ya está claro que el problema se debe a los emojis que tolower no puede entender.

#to remove emojis dataSet <- iconv(dataSet, ''UTF-8'', ''ASCII'')


El FAQ oficial parece no estar funcionando en mi situación:

tm_map(yourCorpus, function(x) iconv(x, to=''UTF-8-MAC'', sub=''byte''))

Finalmente lo hice usando la función for & Encoding:

for (i in 1:length(dataSet)) { Encoding(corpus[[i]])="UTF-8" } corpus <- tm_map(dataSet, tolower)


Este es un problema común con el paquete tm ( 1 , 2 , 3 ).

Una forma no R de solucionarlo es usar un editor de texto para encontrar y reemplazar todos los caracteres sofisticados (es decir, aquellos con signos diacríticos) en su texto antes de cargarlo en R (o usar gsub en R ). Por ejemplo, buscaría y reemplazaría todas las instancias de la O-umlaut en Öl-Teppich. 3 han tenido éxito con esto (yo también), pero si tiene miles de archivos de texto individuales, obviamente esto no es bueno.

Para una solución R , encontré que usar VectorSource lugar de DirSource parece resolver el problema:

# I put your example text in a file and tested it with both ANSI and # UTF-8 encodings, both enabled me to reproduce your problem # tmp <- Corpus(DirSource(''C://...//tmp/'')) tmp <- tm_map(dataSet, tolower) Error in FUN(X[[1L]], ...) : invalid input ''RT @noXforU Erneut riesiger (Alt-)Öl–teppich im Golf von Mexiko (#pics vom Freitag) http://bit.ly/bw1hvU http://bit.ly/9R7JCf #oilspill #bp'' in ''utf8towcs'' # quite similar error to what you got, both from ANSI and UTF-8 encodings # # Now try VectorSource instead of DirSource tmp <- readLines(''C://...//tmp.txt'') tmp [1] "RT @noXforU Erneut riesiger (Alt-)Öl–teppich im Golf von Mexiko (#pics vom Freitag) http://bit.ly/bw1hvU http://bit.ly/9R7JCf #oilspill #bp" # looks ok so far tmp <- Corpus(VectorSource(tmp)) tmp <- tm_map(tmp, tolower) tmp[[1]] rt @noxforu erneut riesiger (alt-)öl–teppich im golf von mexiko (#pics vom freitag) http://bit.ly/bw1hvu http://bit.ly/9r7jcf #oilspill #bp # seems like it''s worked just fine. It worked for best for ANSI encoding. # There was no error with UTF-8 encoding, but the Ö was returned # as ã– which is not good

Pero esto parece un poco de una suerte de coincidencia. Debe haber una manera más directa al respecto. ¡Háganos saber lo que funciona para usted!


Esto es de las preguntas más frecuentes de tm:

reemplazará los bytes no convertibles en yourCorpus con cadenas que muestran sus códigos hexadecimales.

Espero que esto ayude, para mi lo hace.

tm_map(yourCorpus, function(x) iconv(enc2utf8(x), sub = "byte"))

http://tm.r-forge.r-project.org/faq.html


He estado ejecutando esto en Mac y para mi frustración, tuve que identificar el registro de faltas (ya que estos eran tweets) para resolver. Desde la próxima vez, no hay garantía de que el registro sea el mismo, usé la siguiente función

tm_map(yourCorpus, function(x) iconv(x, to=''UTF-8-MAC'', sub=''byte''))

como se sugirió anteriormente.

Funcionó a las mil maravillas


La solución de Chad no estaba funcionando para mí. Tenía esto incrustado en una función y estaba dando un error acerca de que iconv necesitaba un vector como entrada. Entonces, decidí hacer la conversión antes de crear el corpus.

myCleanedText <- sapply(myText, function(x) iconv(enc2utf8(x), sub = "byte"))


Las sugerencias anteriores no funcionaron para mí. Investigué más y encontré el que funcionó en el siguiente https://eight2late.wordpress.com/2015/05/27/a-gentle-introduction-to-text-mining-using-r/

#Create the toSpace content transformer toSpace <- content_transformer(function(x, pattern) {return (gsub(pattern," ", x))}) # Apply it for substituting the regular expression given in one of the former answers by " " your_corpus<- tm_map(your_corpus,toSpace,"[^[:graph:]]") # the tolower transformation worked! your_corpus <- tm_map(your_corpus, content_transformer(tolower))



Pude arreglarlo convirtiendo los datos de nuevo a formato de texto simple usando esta línea de código

corpus <- tm_map(corpus, PlainTextDocument)

gracias al usuario https://.com/users/4386239/paul-gowder

por su respuesta aquí

https://.com/a/29529990/815677


Si está bien ignorar las entradas no válidas, podría usar el manejo de errores de R. p.ej:

dataSet <- Corpus(DirSource(''tmp/'')) dataSet <- tm_map(dataSet, function(data) { #ERROR HANDLING possibleError <- tryCatch( tolower(data), error=function(e) e ) # if(!inherits(possibleError, "error")){ # REAL WORK. Could do more work on your data here, # because you know the input is valid. # useful(data); fun(data); good(data); # } })

Hay un ejemplo adicional aquí: http://gastonsanchez.wordpress.com/2012/05/29/catching-errors-when-using-tolower/


Siga los siguientes pasos:

# First you change your document in .txt format with encoding UFT-8 library(tm) # Set Your directoryExample ("F:/tmp"). dataSet <- Corpus(DirSource ("/tmp"), readerControl=list(language="english)) # "/tmp" is your directory. You can use any language in place of English whichever allowed by R. dataSet <- tm_map(dataSet, tolower) Inspect(dataSet)