Неверный ввод пакета R tm в «utf8towcs»

Я пытаюсь использовать пакет tm в R для выполнения анализа текста. Я связал следующее:

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'

Проблема в том, что некоторые символы недействительны. Я хотел бы исключить недопустимые символы из анализа либо в R, либо перед импортом файлов для обработки.

Я попытался использовать iconv, чтобы преобразовать все файлы в utf-8 и исключить все, что не может быть преобразовано в это, следующим образом:

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

как указано здесь Пакетное преобразование файлов latin-1 в utf -8 с помощью iconv

Но я все еще получаю ту же ошибку.

Буду признателен за любую помощь.


person maiaini    schedule 09.03.2012    source источник


Ответы (14)


Ни один из приведенных выше ответов не помог мне. Единственный способ обойти эту проблему — удалить все неграфические символы (http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html).

Код такой простой

usableText=str_replace_all(tweets$text,"[^[:graph:]]", " ") 
person David    schedule 01.04.2014
comment
Это должно быть помечено как решение. Это работает и популярно в течение многих лет, но ОП не стал отмечать это как правильное. - person Hack-R; 16.07.2017
comment
в качестве альтернативы, используя базу r, вы можете попробовать: usableText <- iconv(tweets$text, "ASCII", "UTF-8", sub="") - person Agile Bean; 19.03.2018

Это из часто задаваемых вопросов ТМ:

он заменит неконвертируемые байты в вашем корпусе строками, показывающими их шестнадцатеричные коды.

Я надеюсь, что это поможет, для меня это так.

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

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

person user1374611    schedule 24.07.2012

Я думаю, уже ясно, что проблема в смайликах, которые tolower не может понять.

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

Я только что столкнулся с этой проблемой. Случайно вы используете машину под управлением OSX? Я, кажется, проследил проблему до определения набора символов, с которым R скомпилирован в этой операционной системе (см. https://stat.ethz.ch/pipermail/r-sig-mac/2012-July/009374.html)

То, что я видел, это то, что использование решения из часто задаваемых вопросов

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

давал мне это предупреждение:

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

Это я проследил до функции enc2utf8. Плохая новость заключается в том, что это проблема моей базовой ОС, а не R.

Итак, вот что я сделал в качестве обходного пути:

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

Это заставляет iconv использовать кодировку utf8 на Macintosh и отлично работает без необходимости перекомпиляции.

person Kenton    schedule 17.01.2013

Я часто сталкивался с этой проблемой, и этот пост о переполнении стека всегда появляется первым. Раньше я использовал лучшее решение, но оно может удалять символы и заменять их мусором (например, преобразование it’s в it’s).

Я обнаружил, что на самом деле есть гораздо лучшее решение для этого! Если вы устанавливаете пакет stringi, вы можете заменить tolower() на stri_trans_tolower(), и тогда все должно работать нормально.

person Jacqueline Nolis    schedule 19.04.2018

Я запускал это на Mac, и, к моему разочарованию, мне пришлось идентифицировать грязную запись (поскольку это были твиты), чтобы решить. Поскольку в следующий раз нет гарантии, что запись будет такой же, я использовал следующую функцию

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

как было предложено выше.

Оно работало завораживающе

person Krishna Vedula    schedule 08.08.2013

Это распространенная проблема с пакетом tm (1). , 2, 3).

Один не-R способ исправить это — использовать текстовый редактор для поиска и замены всех причудливых символов (т. е. с диакритическими знаками) в вашем тексте перед его загрузкой в ​​R (или использовать gsub в R). Например, вы должны искать и заменять все экземпляры О-умляут в Öl-Teppich. Другим это удалось (у меня тоже), но если у вас есть тысячи отдельных текстовых файлов, очевидно, это нехорошо.

Для решения R я обнаружил, что использование VectorSource вместо DirSource, похоже, решает проблему:

# 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

Но это похоже на счастливое совпадение. Должен быть более прямой путь к этому. Дайте нам знать, что работает для вас!

person Ben    schedule 10.03.2012
comment
Спасибо за ваш ответ Бен! По какой-то причине та же самая строка кода, которая у меня не удалась, теперь работает. Не знаю, очередное ли это счастливое стечение обстоятельств :) Я ничего не менял, просто перезапустил и на этот раз работает без сбоев. - person maiaini; 15.03.2012

Прежние предложения не работали для меня. Я исследовал больше и нашел тот, который работал в следующем 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))
person vicarizmendi    schedule 23.11.2016

Используйте следующие шаги:

# 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)
person Ashutosh Agrahari    schedule 23.08.2012

Если вы можете игнорировать недопустимые входные данные, вы можете использовать обработку ошибок R. например:

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

Здесь есть дополнительный пример: http://gastonsanchez.wordpress.com/2012/05/29/catch-errors-when-using-tolower/

person Rose Perrone    schedule 22.03.2012

Официальный FAQ, кажется, не работает в моей ситуации:

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

Наконец, я сделал это, используя функцию for & Encoding:

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

Решение Чада не сработало для меня. У меня это было встроено в функцию, и она выдавала ошибку о том, что iconv нужен вектор в качестве входных данных. Итак, я решил сделать конвертацию перед созданием корпуса.

myCleanedText <- sapply(myText, function(x) iconv(enc2utf8(x), sub = "byte"))
person Francisco Marco-Serrano    schedule 27.08.2015

Я смог исправить это, преобразовав данные обратно в обычный текстовый формат, используя эту строку кода.

corpus <- tm_map(corpus, PlainTextDocument)

благодаря пользователю https://stackoverflow.com/users/4386239/paul-gowder

за его ответ здесь

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

person Krishna    schedule 05.02.2018

У меня была такая же проблема на моем Mac, решенная с помощью приведенного ниже решения.

raw_data <- read.csv(file.choose(), stringsAsFactors = F,  encoding="UTF-8")

raw_data$textCol<- iconv(raw_data$textCol, "ASCII", "UTF-8", sub="byte")

data_corpus <- VCorpus(VectorSource(raw_data$textCol))

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

corpus_clean <- tm_map(data_corpus, content_transformer(tolower))
person smsivaprakaash    schedule 06.06.2020