2016-07-31 5 views
1

Ich habe einen großen Datensatz (> 1 Million Zeilen) und jede Zeile ist ein mehrstimmiger Text. Zum Beispiel finden Sie eine Probe von 2 Reihen:R: finde ngram mit dfm wenn es mehrere Sätze in einem Dokument gibt

mydat <- data.frame(text=c('I like apple. Me too','One two. Thank you'),stringsAsFactors = F) 

Was ich versuche, die Bigramm Begriffe in jeder Zeile zu tun ist, Extrahieren (das wird ngram Begriffe trennen sein kann „“). Wenn ich einfach die DFM-Funktion:

mydfm = dfm(mydat$text,toLower = T,removePunct = F,ngrams=2) 
dtm = as.DocumentTermMatrix(mydfm) 
txt_data = as.data.frame(as.matrix(dtm)) 

Dies sind die Begriffe, die ich habe:

"i_like"  "like_apple" "apple_." "._me"  "me_too"  "one_two" "two_."  "._thank" "thank_you" 

Diese sind, was ich erwarten, im Grunde "" übersprungen und wird verwendet, um die Bedingungen zu trennen:

"i_like"  "like_apple" "me_too"  "one_two" "thank_you" 

glauben langsam Schleifen schreibe dies auch lösen kann, aber da es eine riesige Datenmenge, die ich effiziente Möglichkeiten ähnlich dem DFM() in quanteda dies zu lösen bevorzugen. Irgendwelche Vorschläge würden geschätzt!

Antwort

1

Wenn Ihr Ziel nur darin besteht, diese Bigramme zu extrahieren, können Sie tokens zweimal verwenden. Einmal um Sätze zu tokenisieren, dann nochmal um die Ngramme für jeden Satz zu machen.

library("quanteda") 
mydat$text %>% 
    tokens(mydat$text, what = "sentence") %>% 
    as.character() %>% 
    tokens(ngrams = 2, remove_punct = TRUE) %>% 
    as.character() 
#[1] "I_like"  "like_apple" "Me_too"  "One_two" "Thank_you" 

ein tokens_tolower() nach dem ersten tokens() Anruf Einfügen, wenn Sie mögen, oder char_tolower() am Ende verwenden.

+0

Vielen Dank! Dies hilft, ich änderte die äußere tokenize() zu dfm(), so dass diese Bigramm-Begriffe können Features meines Datensatzes sein – snowneji

1

@ Werke Jota Antwort, aber es gibt eine Möglichkeit, die Tokenisierung feiner zu steuern, während es nur einmal anrufen:

(toks <- tokenize(toLower(mydat$text), removePunct = 2, ngrams = 2)) 
## tokenizedText object from 2 documents. 
## Component 1 : 
## [1] "i_like"  "like_apple" "apple_me" "me_too"  
## 
## Component 2 : 
## [1] "one_two" "two_thank" "thank_you" 

dfm(toks) 
## Document-feature matrix of: 2 documents, 7 features. 
## 2 x 7 sparse Matrix of class "dfmSparse" 
##  features 
## docs i_like like_apple apple_me me_too one_two two_thank thank_you 
## text1  1   1  1  1  0   0   0 
## text2  0   0  0  0  1   1   1 

Hinzugefügt:

Dann jede ngram mit . Interpunktion zu entfernen, Sie kann verwenden: die folgenden, die standardmäßig valuetype = "glob":

removeFeatures(toks2, "*.*") 
## tokenizedText object from 2 documents. 
## Component 1 : 
## [1] "i_like"  "like_apple" "me_too"  
## 
## Component 2 : 
## [1] "one_two" "thank_you" 
+0

@Jota Nach der anderen Methode versuchte ich schließlich 'dfm (Mydat $ Text, ignoredFeatures = '.')' das wird automatisch diese enthält '.' – snowneji

+0

Ja, siehe den Zusatz zu meiner Antwort. –