Анализ текста R с помощью quanteda

У меня есть набор данных (сообщения в Facebook) (через netvizz), и я использую пакет quanteda в R. Вот мой код R.

# Load the relevant dictionary (relevant for analysis)
liwcdict <- dictionary(file = "D:/LIWC2001_English.dic", format = "LIWC")

# Read File
# Facebooks posts could be generated by  FB Netvizz 
# https://apps.facebook.com/netvizz
# Load FB posts as .csv-file from .zip-file 
fbpost <- read.csv("D:/FB-com.csv", sep=";")

# Define the relevant column(s)
fb_test <-as.character(FB_com$comment_message) #one column with 2700 entries
# Define as corpus
fb_corp <-corpus(fb_test)
class(fb_corp)

# LIWC Application
fb_liwc<-dfm(fb_corp, dictionary=liwcdict)
View(fb_liwc)

Все работает до тех пор, пока:

> fb_liwc<-dfm(fb_corp, dictionary=liwcdict)
Creating a dfm from a corpus ...
   ... indexing 2,760 documents
   ... tokenizing texts, found 77,923 total tokens
   ... cleaning the tokens, 1584 removed entirely
   ... applying a dictionary consisting of 68 key entries
Error in `dimnames<-.data.frame`(`*tmp*`, value = list(docs = c("text1",  : 
  invalid 'dimnames' given for data frame

Как бы вы интерпретировали сообщение об ошибке? Есть предложения по решению проблемы?


person Daniel    schedule 24.06.2015    source источник
comment
Трудно сказать, поскольку у меня нет файлов для ввода текста, но что, если вы попробуете просто dfm(inaugTexts, dictionary = liwcdict), что произойдет? У меня есть файл LIWC2001_English.dic, и команда dfm отлично работает в моей системе с inaugTexts, хотя она медленная и ее нужно переписать для ее оптимизации (следующая в моем списке).   -  person Ken Benoit    schedule 01.07.2015
comment
Теперь это исправлено в ветке dev, которую вы можете установить в соответствии с ответом ниже.   -  person Ken Benoit    schedule 01.07.2015


Ответы (1)


В quanteda версии 0.7.2 была ошибка, из-за которой dfm() не работал при использовании словаря, когда один из документов не содержал функций. Ваш пример не работает, потому что на этапе очистки некоторые из «документов» сообщений Facebook в конечном итоге удаляют все свои функции на этапах очистки.

Это не только исправлено в 0.8.0, но также мы изменили базовую реализацию словарей в dfm(), что привело к значительному увеличению скорости. (LIWC по-прежнему является большим и сложным словарем, и регулярные выражения по-прежнему означают, что его гораздо медленнее использовать, чем просто индексировать токены. Мы будем работать над его оптимизацией.)

devtools::install_github("kbenoit/quanteda")
liwcdict <- dictionary(file = "LIWC2001_English.dic", format = "LIWC")
mydfm <- dfm(inaugTexts, dictionary = liwcdict)
## Creating a dfm from a character vector ...
##    ... indexing 57 documents
##    ... lowercasing
##    ... tokenizing
##    ... shaping tokens into data.table, found 134,024 total tokens
##    ... applying a dictionary consisting of 68 key entries
##    ... summing dictionary-matched features by document
##    ... indexing 68 feature types
##    ... building sparse matrix
##    ... created a 57 x 68 sparse dfm
##    ... complete. Elapsed time: 14.005 seconds.
topfeatures(mydfm, decreasing=FALSE)
## Fillers   Nonfl   Swear      TV  Eating   Sleep   Groom   Death  Sports  Sexual 
##       0       0       0      42      47      49      53      76      81     100 

Это также будет работать, если документ не содержит функций после токенизации и очистки, что, вероятно, нарушает старую dfm, которую вы используете со своими текстами в Facebook.

mytexts <- inaugTexts
mytexts[3] <- ""
mydfm <- dfm(mytexts, dictionary = liwcdict, verbose = FALSE)
which(rowSums(mydfm)==0)
## 1797-Adams 
##          3 
person Ken Benoit    schedule 01.07.2015