Неверный ввод пакета R tm в utf8towcs - PullRequest
27 голосов
/ 09 марта 2012

Я пытаюсь использовать пакет 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

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

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

Ответы [ 13 ]

57 голосов
/ 01 апреля 2014

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

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

usableText=str_replace_all(tweets$text,"[^[:graph:]]", " ") 
24 голосов
/ 24 июля 2012

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

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

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

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

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

13 голосов
/ 08 сентября 2015

Я думаю, что к настоящему времени ясно, что проблема в том, что эмодзи не может понять Толовер

#to remove emojis
dataSet <- iconv(dataSet, 'UTF-8', 'ASCII')
10 голосов
/ 18 января 2013

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

Что я увидел, так это использование решения из FAQ

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 и прекрасно работает без необходимости перекомпиляции.

4 голосов
/ 08 августа 2013

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

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

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

Она работала как шарм

2 голосов
/ 23 ноября 2016

Прежние предложения не сработали для меня.Я исследовал больше и нашел тот, который работал в следующих 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 голосов
/ 10 марта 2012

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

Один не- R Чтобы исправить это, используйте текстовый редактор, чтобы найти и заменить все причудливые символы (например, с диакритическими знаками) в вашем тексте перед загрузкой его в R (или используйте gsub в R).Например, вы будете искать и заменять все экземпляры O-umlaut в Ö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

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

1 голос
/ 20 апреля 2018

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

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

1 голос
/ 06 мая 2013

Официальный 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)
1 голос
/ 23 августа 2012

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

# 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)
...