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.
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:]]", " ")
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"))
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')
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.
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
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.
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!
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))
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)
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)
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/
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"))
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