web-dev-qa-db-fra.com

R tm package invalid input in 'utf8towcs'

J'essaie d'utiliser le paquet tm dans R pour effectuer une analyse de texte. J'ai attaché ce qui suit:

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'

Le problème est que certains caractères ne sont pas valides. Je voudrais exclure les caractères non valides de l'analyse soit depuis R, soit avant d'importer les fichiers pour traitement.

J'ai essayé d'utiliser iconv pour convertir tous les fichiers en utf-8 et d'exclure tout ce qui ne peut pas être converti comme suit:

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

comme indiqué ici convertir par lots des fichiers latin-1 en utf-8 en utilisant iconv

Mais je reçois toujours la même erreur.

J'apprécierais toute aide.

27
maiaini

Aucune des réponses ci-dessus n'a fonctionné pour moi. La seule façon de contourner ce problème était de supprimer tous les caractères non graphiques ( http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html ).

Le code est aussi simple que cela

usableText=str_replace_all(tweets$text,"[^[:graph:]]", " ") 
57
David

Ceci est de la faq tm:

il remplacera les octets non convertibles de yourCorpus par des chaînes montrant leurs codes hexadécimaux.

J'espère que cela aide, pour moi ça le fait.

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

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

24
user1374611

Je pense qu'il est clair maintenant que le problème est dû aux emojis que tolower n'est pas capable de comprendre

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

Je viens de courir contre ce problème. Par hasard, utilisez-vous une machine exécutant OSX? Je suis et semble avoir tracé le problème à la définition du jeu de caractères contre lequel R est compilé sur ce système d'exploitation (voir https://stat.ethz.ch/pipermail/r-sig-mac/2012 -Juillet/009374.html )

Ce que je voyais, c'est qu'en utilisant la solution de la FAQ

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

me donnait cet avertissement:

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

Je l'ai retracée au enc2utf8 une fonction. La mauvaise nouvelle est que c'est un problème avec mon système d'exploitation sous-jacent et non R.

Voici donc ce que j'ai fait en guise de solution:

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

Cela oblige iconv à utiliser l'encodage utf8 sur le Macintosh et fonctionne correctement sans avoir besoin de recompiler.

10
Kenton

J'ai couru cela sur Mac et à ma frustration, j'ai dû identifier le mauvais dossier (car il s'agissait de tweets) à résoudre. Depuis la prochaine fois, il n'y a aucune garantie que l'enregistrement soit le même, j'ai utilisé la fonction suivante

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

comme suggéré ci-dessus.

Ça a marché comme sur des roulettes

4
Krishna Vedula

J'ai souvent rencontré ce problème et ce message Stack Overflow est toujours ce qui arrive en premier. J'ai déjà utilisé la meilleure solution, mais elle peut supprimer les caractères et les remplacer par des ordures (comme convertir it’s En it’s).

J'ai trouvé qu'il existe en fait une bien meilleure solution pour cela! Si vous installez le package stringi, vous pouvez remplacer tolower() par stri_trans_tolower() et alors tout devrait fonctionner correctement.

2
Jacqueline Nolis

Il s'agit d'un problème courant avec le package tm ( 1 , 2 , ).

Une façon nonR de le corriger consiste à utiliser un éditeur de texte pour rechercher et remplacer tous les caractères fantaisie (c'est-à-dire ceux avec des signes diacritiques) dans votre texte avant de le charger dans R (ou utiliser gsub dans R). Par exemple, vous rechercheriez et remplaceriez toutes les instances du O-tréma dans Öl-Teppich. Autres ont réussi avec ça (moi aussi), mais si vous avez des milliers de fichiers texte individuels, ce n'est évidemment pas bon.

Pour une solution R, j'ai trouvé que l'utilisation de VectorSource au lieu de DirSource semble résoudre le problème:

# 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

Mais cela semble être un peu une heureuse coïncidence. Il doit y avoir un moyen plus direct à ce sujet. Faites-nous savoir ce qui vous convient!

2
Ben

Les anciennes suggestions n'ont pas fonctionné pour moi. J'ai enquêté plus et trouvé celui qui a fonctionné dans ce qui suit 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))
2
vicarizmendi

L'officiel FAQ ne semble pas fonctionner dans ma situation:

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

Enfin, je l'ai fait en utilisant la fonction for & Encoding:

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

Suivez les étapes suivantes:

# 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)
1
Ashutosh Agrahari

S'il est correct d'ignorer les entrées non valides, vous pouvez utiliser la gestion des erreurs de R. par exemple:

  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);
     # }
  }) 

Il y a un exemple supplémentaire ici: http://gastonsanchez.wordpress.com/2012/05/29/catching-errors-when-using-tolower/

1
Rose Perrone

La solution de Chad ne fonctionnait pas pour moi. Je l'avais intégré dans une fonction et cela donnait une erreur sur iconv nécessitant un vecteur en entrée. J'ai donc décidé de faire la conversion avant de créer le corpus.

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

J'ai pu le réparer en reconvertissant les données au format texte en utilisant cette ligne de code

corpus <- tm_map(corpus, PlainTextDocument)

merci à l'utilisateur https://stackoverflow.com/users/4386239/paul-gowder

pour sa réponse ici

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

0
Krishna Bandhakavi