Анализ данных в Твиттере - Ошибка в матрице срочных документов
Попытка сделать некоторый анализ данных щебета. Скачал твиты и создал корпус из текста твитов, используя ниже
# Creating a Corpus
wim_corpus = Corpus(VectorSource(wimbledon_text))
При попытке создать TermDocumentMatrix, как показано ниже, я получаю сообщение об ошибке и предупреждения.
tdm = TermDocumentMatrix(wim_corpus,
control = list(removePunctuation = TRUE,
stopwords = TRUE,
removeNumbers = TRUE, tolower = TRUE))
Error in simple_triplet_matrix(i = i, j = j, v = as.numeric(v), nrow = length(allTerms), : 'i, j, v' different lengths
In addition: Warning messages:
1: In parallel::mclapply(x, termFreq, control) :
all scheduled cores encountered errors in user code
2: In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
3: In TermDocumentMatrix.VCorpus(corpus) : invalid document identifiers
4: In simple_triplet_matrix(i = i, j = j, v = as.numeric(v), nrow = length(allTerms), :
NAs introduced by coercion
Кто-нибудь может указать, что указывает на эту ошибку? Может ли это быть связано с пакетом tm?
Библиотека tm была импортирована. Я использую версию R: R 3.0.1 и RStudio: 0.97
6 ответов
У меня была такая же проблема, и оказалось, что это проблема с совместимостью пакетов. Попробуйте установить
install.packages("SnowballC")
и загрузить с
library(SnowballC)
перед вызовом DocumentTermMatrix.
Это решило мою проблему.
Я думаю, что ошибка связана с некоторыми "экзотическими" символами в сообщениях твита, которые не может обработать функция tm. Я получил ту же ошибку при использовании твитов в качестве источника корпусов. Может быть, поможет следующий обходной путь:
# Чтение некоторых твитов (здесь из текстового файла) в вектор
rawTweets <- readLines(con = "target_7_sample.txt", ok = TRUE, warn = FALSE, encoding = "utf-8")
# Конвертировать текст твита явно в utf-8
convTweets <- iconv(rawTweets, to = "utf-8")
# Приведенное выше преобразование оставляет вам векторные записи "NA", то есть те твиты, которые не могут быть обработаны. Удалите записи "NA" с помощью следующей команды:
tweets <- (convTweets[!is.na(convTweets)])
Если удаление некоторых твитов не является проблемой для вашего решения (например, создать облако слов), тогда этот подход может сработать, и вы можете продолжить, вызвав функцию Corpus пакета tm.
С уважением - Альберт
Я нашел способ решить эту проблему в статье о ТМ.
Пример, в котором ошибка приведена ниже:
getwd()
require(tm)
# Importing files
files <- DirSource(directory = "texts/",encoding ="latin1" )
# loading files and creating a Corpus
corpus <- VCorpus(x=files)
# Summary
summary(corpus)
corpus <- tm_map(corpus,removePunctuation)
corpus <- tm_map(corpus,stripWhitespace)
corpus <- tm_map(corpus,removePunctuation)
matrix_terms <- DocumentTermMatrix(corpus)
Warning messages: In TermDocumentMatrix.VCorpus(x, control) : invalid document identifiers
Эта ошибка возникает из-за того, что вам нужен объект класса Vector Source для выполнения вашей матрицы документов, но предыдущие преобразования преобразуют ваш набор текстов в символ, следовательно, изменяя класс, который не принимается функцией.
Однако, если вы добавите еще одну команду перед использованием функции Term Document Matrix, вы можете продолжать.
Ниже следует код с новой командой:
getwd()
require(tm)
files <- DirSource(directory = "texts/",encoding ="latin1" )
# loading files and creating a Corpus
corpus <- VCorpus(x=files)
# Summary
summary(corpus)
corpus <- tm_map(corpus,removePunctuation)
corpus <- tm_map(corpus,stripWhitespace)
corpus <- tm_map(corpus,removePunctuation)
# COMMAND TO CHANGE THE CLASS AND AVOID THIS ERROR
corpus <- Corpus(VectorSource(corpus))
matriz_terms <- DocumentTermMatrix(corpus)
Поэтому у вас не будет больше проблем с этим.
Как предложил Альберт, преобразование кодировки текста в "utf-8" решило проблему для меня. Но вместо удаления всего твита с проблемными символами, вы можете использовать опцию sub в iconv, чтобы удалить только "плохие" символы в твите и оставить остальные:
tweets <- iconv(rawTweets, to = "utf-8", sub="")
Это больше не приводит к образованию НК, и дальнейшая стадия фильтрации не требуется.
Я думаю, что эта проблема возникает из-за некоторых странных символов в тексте. Вот мое решение:
wim_corpus = tm_map(wim_corpus, str_replace_all,"[^[:alnum:]]", " ")
tdm = TermDocumentMatrix(wim_corpus,
control = list(removePunctuation = TRUE,
stopwords = TRUE,
removeNumbers = TRUE, tolower = TRUE))
Были некоторые немецкие умлаутские буквы и некоторые специальные шрифты, которые вызывали ошибки. Я не мог удалить их в R.. даже преобразовав его в utf-8. (Я новый пользователь R), поэтому я использовал Excel, чтобы удалить немецкие буквы, а затем не было ошибок после..