2016-03-23 6 views
3

Ich habe ein dfmSparse-Objekt (groß, mit 2,1 GB), die Token ist und mit Ngrammen (Unigramme, Bigramme, Trigramme und viergrams), und möchte ich konvertieren es zu einem Datenrahmen oder einem Datentabellenobjekt mit den Spalten: Inhalt und Häufigkeit.Convert dfmSparse aus Quanteda-Paket in Data Frame oder Datentabelle in R

Ich habe versucht, aufzulösen ... aber hat nicht funktioniert. Ich bin neu in NLP, und ich weiß nicht mit der Methode zu verwenden, ich bin ohne Ideen und habe keine Lösung hier oder mit Google gefunden.

Einige Informationen über die Daten:

>str(tokfreq) 
Formal class 'dfmSparse' [package "quanteda"] with 11 slots 
    [email protected] settings :List of 1 
    .. ..$ : NULL 
    [email protected] weighting : chr "frequency" 
    [email protected] smooth  : num 0 
    [email protected] ngrams  : int [1:4] 1 2 3 4 
    [email protected] concatenator: chr "_" 
    [email protected] Dim   : int [1:2] 167500 19765478 
    [email protected] Dimnames :List of 2 
    .. ..$ docs : chr [1:167500] "character(0).content" "character(0).content" "character(0).content" "character(0).content" ... 
    .. ..$ features: chr [1:19765478] "add" "lime" "juice" "tequila" ... 
    [email protected] i   : int [1:54488417] 0 75 91 178 247 258 272 327 371 391 ... 
    [email protected] p   : int [1:19765479] 0 3218 3453 4015 4146 4427 4637 140665 140736 142771 ... 
    [email protected] x   : num [1:54488417] 1 1 1 1 5 1 1 1 1 1 ... 
    [email protected] factors  : list() 

>summary(tokfreq) 
     Length   Class   Mode 
3310717565000  dfmSparse   S4 

Dank!

EDITED: Dies ist, wie ich den Datensatz aus einem Korpus erstellt:

# tokenize 
tokenized <- tokenize(x = teste, ngrams = 1:4) 
# Creating the dfm 
tokfreq <- dfm(x = tokenized) 
+0

Ich versuche auch, die Daten mit Aussicht() zu sehen, aber ich bin ein Fehler ist, „zu groß“ –

Antwort

5

Dies sollte es tun, wenn ich über Ihre Frage verstanden, was Sie mit „Inhalt“ bedeutet und „Frequency“. Beachten Sie, dass der data.frame bei diesem Ansatz nicht größer als die Sparse-Matrix ist, da Sie nur die Gesamtanzahl aufzeichnen und die Dokumentzeilenverteilungen nicht speichern.

myDfm <- dfm(data_corpus_inaugural, ngrams = 1:4, verbose = FALSE) 
head(myDfm) 
## Document-feature matrix of: 57 documents, 314,224 features. 
## (showing first 6 documents and first 6 features) 
##     features 
## docs    fellow-citizens of the senate and house 
## 1789-Washington    1 71 116  1 48  2 
## 1793-Washington    0 11 13  0 2  0 
## 1797-Adams     3 140 163  1 130  0 
## 1801-Jefferson    2 104 130  0 81  0 
## 1805-Jefferson    0 101 143  0 93  0 
## 1809-Madison     1 69 104  0 43  0 

# convert to a data.frame 
df <- data.frame(Content = featnames(myDfm), Frequency = colSums(myDfm), 
       row.names = NULL, stringsAsFactors = FALSE) 
head(df) 
##   Content Frequency 
## 1 fellow-citizens  39 
## 2    of  7055 
## 3    the  10011 
## 4   senate  15 
## 5    and  5233 
## 6   house  11 
tail(df) 
##       Content Frequency 
## 314219   and_may_he_forever   1 
## 314220  may_he_forever_bless   1 
## 314221  he_forever_bless_these   1 
## 314222 forever_bless_these_united   1 
## 314223 bless_these_united_states   1 
## 314224  these_united_states_of   1  

object.size(df) 
## 25748240 bytes 
object.size(myDfm) 
## 29463592 bytes 

hinzugefügt 2018-02-25

In quanteda> = 1.0.0 gibt es eine Funktion, die die textstat_frequency() data.frame produzieren, die Sie wollen, zum Beispiel

textstat_frequency(data_dfm_lbgexample) %>% head() 
# feature frequency rank docfreq group 
# 1  P  356 1  5 all 
# 2  O  347 2  4 all 
# 3  Q  344 3  5 all 
# 4  N  317 4  4 all 
# 5  R  316 5  4 all 
# 6  S  280 6  4 all 
+0

Ja! Das ist es! Hat sehr gut funktioniert, ohne Speicherprobleme und sehr schnell. Die Größe beträgt 1561 MB, mehr als 500 MB weniger als die DFM. Vielen Dank! Eine einfache Lösung, aber ich hatte keine Idee, wie ich ohne Ihre Hilfe auskommen könnte. –

+0

Ich freue mich, Ihnen zu helfen und freue mich über alle Erfahrungen/Probleme/Wünsche für ** Quanteda **. –

+0

Hallo, das ist sehr doof für den Korpus mit nur einem Dokument. Ich frage mich, gibt es eine einfache Möglichkeit, wie dies auf Multi-Dokument Corpus dfm erstreckt? Vielen Dank. – Simon

0

Apropos „zu groß“, Sie in den Speichern Probleme laufen können. Nehmen wir zum Beispiel:

library(quanteda) 
mydfm <- dfm(subset(inaugCorpus, Year>1980)) 
class(mydfm) 
# [1] "dfmSparse" 
# attr(,"package") 
# [1] "quanteda" 
print(object.size(mydfm), units="KB") 
# 273.6 Kb 

Sie konnten die Sparse Matrix-Transformation (die für die Daten mit vielen Nullen komprimiert/effizienten Speichermethoden verwendet) in einen langen Datenrahmen wie folgt aus:

library(reshape2) 
df <- melt(as.matrix(mydfm)) 
head(df) 
#   docs features value 
# 1 1981-Reagan senator  2 
# 2 1985-Reagan senator  4 
# 3 1989-Bush senator  2 
# 4 1993-Clinton senator  0 
# 5 1997-Clinton senator  0 
# 6 2001-Bush senator  0 
print(object.size(df), units="KB") 
# 619.2 Kb 

Wie Sie sehen können , der neue Datentyp erfordert viel mehr RAM (und die Konvertierung selbst kann auch zusätzliche erfordern). Die Sparsität/Prozentzahl von 0 s ist sum(mydfm==0)/length(mydfm) = 0.759289 hier.


Mit Bezug auf Ihre Kommentare, hier ist ein reproduzierbares Beispiel:

dfm <- dfm(inaugCorpus, ngrams = 1L:16L) 
print(object.size(dfm), units="MB") 
# 254.1 Mb 

library(reshape2) 
df <- melt(as.matrix(dfm)) 
print(object.size(df), units="MB") 
# 1884.6 Mb 

memory.size() 
# [1] 3676.43 
memory.size(TRUE) 
# [1] 3858.12 
memory.limit() 
# [1] 8189 
+0

Dank! Ich habe versucht mit Ihrem Vorschlag mit reshape2, mit einem Teil meiner Daten (144MB) und trotzdem, erhalte ich: 'teste <- schmelzen (as.matrix (tokfreq1))' 'Fehler in asMethod (Objekt): Cholmod Fehler 'Problem zu groß' in Datei ../Core/cholmod_dense.c, Zeile 105 Fehler während der Nachbearbeitung: kann die Verbindung nicht öffnen ' –

+0

Was ist Ihre 'memory.size()' und 'memory.limit()'? Genug Festplattenplatz (vielleicht verwenden einige Routinen temporäre Dateien? Ich habe nicht viel Erfahrung in Code-Profilierung und Blick auf das, was unter Rs Haube passiert) – lukeA

+0

Ich habe versucht, den Speicher zu reinigen und versuchte es erneut, aber der gleiche Fehler (der Fehler passiert sofort). Die Details: '> memory.size() [1] 263.75' und '> memory.limit() [1] 8134' Ich glaube nicht, das Problem ist mit der HD (mehr als 60 GB frei). –