R Paquet tm entrée invalide dans 'utf8towcs'
j'essaye d'utiliser le paquet tm dans R pour effectuer une analyse de texte. J'ai fait le lien suivant:
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 invalides de l'analyse soit de L'intérieur de R ou avant d'importer les fichiers pour le traitement.
j'ai essayé d'utiliser iconv pour convertir tous les fichiers en utf-8 et exclure tout ce qui ne peut pas être converti en cela comme suit:
find . -type f -exec iconv -t utf-8 "{}" -c -o tmpConverted/"{}" ;
comme indiqué ici Convertissez par lots les fichiers latins-1 en utf-8 en utilisant iconv
Mais j'obtiens toujours la même erreur.
j'apprécierais toute aide.
13 réponses
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 simple
usableText=str_replace_all(tweets$text,"[^[:graph:]]", " ")
ceci est de la faq tm:
il remplacera les octets non convertibles dans yourCorpus par des chaînes montrant leurs codes hexagonaux.
j'espère que ça va aider, pour moi si.
tm_map(yourCorpus, function(x) iconv(enc2utf8(x), sub = "byte"))
je pense qu'il est clair maintenant que le problème est en raison de l'émoticône que tolower n'est pas capable de comprendre
#to remove emojis
dataSet <- iconv(dataSet, 'UTF-8', 'ASCII')
je viens de fuir ce problème. Par hasard utilisez-vous une machine tournant sous OSX? Je suis et semble avoir tracé le problème à la définition du jeu de caractères que R est compilé contre sur ce système d'exploitation (voir https://stat.ethz.ch/pipermail/r-sig-mac/2012-July/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 tracé jusqu'à la fonction enc2utf8
. La mauvaise nouvelle est qu'il s'agit d'un problème avec mon OS sous-jacent et non R.
alors voici ce que j'ai fait comme un travail autour:
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 très bien sans avoir besoin de recompiler.
j'ai lancé ceci sur Mac et à ma grande frustration,j'ai dû identifier le record de faute (comme ce sont des tweets) pour 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.
Il a travaillé comme un charme
il S'agit d'une question courante avec le paquet tm
( 1 , 2 , 3 ).
une façon non- R
de le corriger est d'utiliser un éditeur de texte pour trouver et remplacer tous les caractères fantaisistes (i.e. ceux avec des diacritiques) dans votre texte avant de le charger dans R
(ou utiliser gsub
dans R
). Par exemple, vous chercherez et remplacerez toutes les instances de L'o-umlaut dans Öl-Teppich. autres ont eu du succès avec ceci (j'ai aussi), mais si vous avez des milliers de fichiers de texte individuels évidemment ce n'est 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 ressemble un peu à une coïncidence chanceuse. Il doit y avoir une façon plus directe à ce sujet. Faites-nous savoir ce qui fonctionne pour vous!
les premières suggestions n'ont pas fonctionné pour moi. J'ai cherché plus et j'ai trouvé celui qui a fonctionné dans le suivant 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))
suivre 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)
si vous pouvez ignorer les entrées invalides, vous pouvez utiliser la gestion des erreurs de R. e.g:
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 autre exemple ici: http://gastonsanchez.wordpress.com/2012/05/29/catching-errors-when-using-tolower /
la FAQ officielle 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)
la solution de Chad ne marchait pas pour moi. J'avais ceci intégré dans une fonction et il donnait une erreur à propos de iconv
nécessitant un vecteur comme entrée. Donc, j'ai décidé de faire la conversion avant de créer le corpus.
myCleanedText <- sapply(myText, function(x) iconv(enc2utf8(x), sub = "byte"))
j'ai pu le corriger en convertissant les données de nouveau au format de texte simple 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
j'ai souvent rencontré ce problème et ce post de débordement de pile est toujours ce qui vient en premier. J'ai utilisé la solution top avant, mais il peut enlever des caractères et les remplacer par des ordures (comme convertir it’s
en it’s
).
j'ai trouvé qu'il y est en fait une bien meilleure solution pour cela! Si vous installez le paquet stringi
, vous pouvez remplacer tolower()
par stri_trans_tolower()
et alors tout devrait fonctionner correctement.