2015-02-02 11 views
5

Ich versuche, einige Thema Modellierung tun wollen, aber Phrasen verwenden, wo sie existieren, anstatt einzelne Wörter dhThema Modellierung in R mit Phrasen, anstatt einzelne Wörter

library(topicmodels) 
library(tm) 
my.docs = c('the sky is blue, hot sun', 'flowers,hot sun', 'black cats, bees, rats and mice') 
my.corpus = Corpus(VectorSource(my.docs)) 
my.dtm = DocumentTermMatrix(my.corpus) 
inspect(my.dtm) 

Wenn ich meine dtm inspizieren es spaltet bis alle Worte, aber ich möchte, dass alle Phrasen zusammen dort also eine Spalte für jede sein sollte: der Himmel ist blau heißen Sonne Blumen schwarze Katzen Bienen Ratten und Mäuse

Wie Machen Sie die Document Term Matrix dazu, Sätze und Wörter zu erkennen? sie sind durch Komma

Die Lösung getrennt muss effizient sein, wie ich es über eine Menge von Daten

+0

Nigrams funktionieren gut, wenn alle Ihre Phrasen die gleiche Anzahl von Wörtern haben (was unwahrscheinlich erscheint), andernfalls müssen Sie Ihr eigenes dtm ohne Verwendung des tm-Pakets erstellen. – Ben

+0

OK - Tipps für die Erstellung einer eigenen DTM? – shecode

+0

@ lawyeRs Antwort unten zeigt Ihnen wie. – Ben

Antwort

4

Sie versuchen, einen benutzerdefinierten tokenizer mit einem Ansatz könnten ausgeführt werden soll. Sie definieren die Mehrwort-Begriffe, die Sie als Phrasen wollen (ich bin mir nicht bewusst eines algorithmischen Code, diesen Schritt zu tun):

tokenizing.phrases <- c("sky is blue", "hot sun", "black cats") 

Beachten Sie, dass kein stamm geschehen ist, wenn Sie so wollen beide „schwarze Katzen“ und "schwarze Katze", dann müssen Sie beide Varianten eingeben. Der Fall wird ignoriert.

Dann müssen Sie eine Funktion erstellen:

phraseTokenizer <- function(x) { 
     require(stringr) 

     x <- as.character(x) # extract the plain text from the tm TextDocument object 
     x <- str_trim(x) 
     if (is.na(x)) return("") 
     #warning(paste("doing:", x)) 
     phrase.hits <- str_detect(x, ignore.case(tokenizing.phrases)) 

     if (any(phrase.hits)) { 
     # only split once on the first hit, so you don't have to worry about multiple occurrences of the same phrase 
     split.phrase <- tokenizing.phrases[which(phrase.hits)[1]] 
     # warning(paste("split phrase:", split.phrase)) 
     temp <- unlist(str_split(x, ignore.case(split.phrase), 2)) 
     out <- c(phraseTokenizer(temp[1]), split.phrase, phraseTokenizer(temp[2])) 
     } else { 
     out <- MC_tokenizer(x) 
     } 


out[out != ""] 
} 

Dann gehen Sie wie gewohnt ein Begriff Dokument-Matrix zu erstellen, aber dieses Mal sind Sie schließen die Zeichen übersetzten Sätze im Korpus mit Hilfe des Steuer Argument.

tdm <- TermDocumentMatrix(corpus, control = list(tokenize = phraseTokenizer)) 
+0

Ich kann diese Lösung sehen, die wirklich nützlich ist, wenn ich Sätze von etwas schmutzigen Wortdaten definieren möchte. aber meine Sätze wurden bereits definiert. Überspringt dies einzelne Wörter oder Ausdrücke, die nicht definiert sind. Ich habe im Grunde einen langen Vektor von Phrasen/Wörtern, die nicht gereinigt werden müssen. Gibt es eine einfachere Lösung, bei der ich davon ausgehen kann, dass in jedem Komma-Feld ein Wort oder eine Phrase enthalten ist, die ich einfügen möchte? – shecode

+0

Diese Antwort lässt alle anderen Wörter/Begriffe unverändert. Keine Änderung. Was es tut, ist, tm zu erlauben, die definierten Ausdrücke als Einheiten (Tokens) zu behandeln. In Bezug auf die einfache Lösung, sicher, behandeln Sie einfach Ihre Komma getrennten Mehrwort-Phrasen als Token. – lawyeR

+0

Großartig. Ich führe es jetzt. es ist sehr langsam. das ist die andere Sache – shecode

Verwandte Themen