Анализ данных в Твиттере - Ошибка в матрице срочных документов

Попытка сделать некоторый анализ данных щебета. Скачал твиты и создал корпус из текста твитов, используя ниже

# 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, чтобы удалить немецкие буквы, а затем не было ошибок после..

Другие вопросы по тегам