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.

24
demandé sur Community 2012-03-09 20:10:20

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:]]", " ") 
48
répondu David 2014-04-01 19:29:37

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"))

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

23
répondu user1374611 2012-07-24 14:54:20

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')
11
répondu Saurabh Yadav 2015-09-08 09:11:46

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.

10
répondu Kenton 2013-01-18 16:10:26

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

4
répondu Krishna Vedula 2014-02-11 13:00:28

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!

2
répondu Ben 2012-03-10 07:12:22

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))
2
répondu vicarizmendi 2016-11-23 16:07:35

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)
1
répondu Ashutosh Agrahari 2012-09-05 01:18:34

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 /

1
répondu Rose Perrone 2012-10-31 15:56:03

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)
1
répondu pudding 2013-05-06 10:21:26

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"))
0
répondu Francisco Marco-Serrano 2015-08-27 08:40:21

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

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

0
répondu Krishna Bandhakavi 2018-02-05 23:32:05

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.

0
répondu Jonathan 2018-04-19 22:20:57