2017-02-14 2 views
2

Problem: Ich arbeite mit einem Tokenizer für Text Mining und möchte die Länge der Zeichenfolgen in meinen Eingabedaten begrenzen. Der folgende Code behält die gesamte Zeichenfolge bei, wenn das Wort enthalten ist.Wörter nach Schlüsselwort in Zeichenfolge speichern R

#create data frame with data 
    dd <- data.frame(
    text = c("hello how are you doing thank 
       you for helping me with this 
       problem","junk","junk"), stringsAsFactors = F) 

    #keep string that only include term "how" 
    dd <- filter(dd, grepl('how', text)) 

Frage: Wie kann ich den Code ändern, um nur N Wörter nach den Schlüsselwörtern zu halten.

z.B.

wenn N = 1, dann würde dd sind: wie sind

wenn N = 2 dann würde dd sind: Wie geht es Ihnen

wenn N = 3 dann würde dd sind: wie geht es dir

...

I-Code benötigen, das funktionieren würde, wenn ich auch zusätzliche Wörter in Frieds enthalten:

+1

Nicht wirklich ein regex Guru aber dies kann Ihnen helfen: https://regex101.com/r/95g7yT/1 – digEmAll

+0

Was erwarten Sie als Ergebnis zu sehen Wenn Sie spezifizieren Sie zwei Begriffe, "wie" und "mit" und N = 3 zum Beispiel? Was ist, wenn der Abstand zwischen den beiden Begriffen weniger als 3 Wörter beträgt, wie wenn wir "Hallo" und "Ist" gewählt hätten? –

+0

1 - Mit zwei Begriffen "wie" ODER "mit" und N = 3 möchte ich erzeugen: "Wie geht es Ihnen mit diesem Problem?". Die Ergebnisse für den zweiten Ausdruck "mit" würden nur Wörter bis zum Ende der Zeichenfolge beibehalten. 2 - Wenn die Begriffe "Hallo" und "sind", würde ich gerne behalten: "Hallo, wie geht es dir danken", wenn das möglich ist. – BEMR

Antwort

1

Hier ist ein möglicher Ansatz wih ordentlich Text-Mining-Pakete .: (so überprüfen Abhängigkeiten ...-

library(tidytext) # install.packages("tidytext") 
library(tidyr) # install.packages("tidyr") 
library(dplyr) # install.packages("dplyr") 

dd <- data.frame(
    text = c("hello how are you doing thank 
       you for helping me with this 
       problem","junk","junk"), stringsAsFactors = F) 

ich als scope Ihre Parameter über Worte Horizont erwähnen; einfach folgenden Code in eine Funktion zu aktivieren:

scope=2 
dd %>% 
    unnest_tokens(ngram, text, token = "ngrams", n = 1+scope) %>% 
    separate(ngram, paste("word",1:(scope+1),sep=""), sep = " ") %>% 
    filter(word1 %in% c("how","me")) 

# A tibble: 2 × 3 
    word1 word2 word3 
    <chr> <chr> <chr> 
1 how are you 
2 me with this 

Falls Sie mit Streichern am Ende, müssen Sie ngrams, siehe zum Beispiel das zweite Beispiel kollabieren zurück:

scope=3 
dd %>% 
unnest_tokens(ngram, text, token = "ngrams", n = 1+scope) %>% 
    separate(ngram, paste("word",1:(scope+1),sep=""), sep = " ") %>% 
    filter(word1 %in% c("how")) %>% apply(.,1,paste, collapse= " ") 

[1] "how are you doing" 

In Bezug auf Ihre Kommentar : Jetzt, wenn Sie Chunk (String) pro Chunk (String) arbeiten möchten, müssen Sie diese Gruppe explizit durch die Verarbeitung ausführen. Hier ist ein Weg, zum Beispiel:

scope=2 
subsets <- 
    dd %>% 
    mutate(id=1:length(text)) %>% 
    split(., .$id) 

unlist(lapply(subsets, function(dd) { 
    dd %>% 
    unnest_tokens(ngram, text, token = "ngrams", n = 1+scope) %>% 
    separate(ngram, paste("word",1:(scope+1),sep=""), sep = " ") %>% 
    filter(word1 %in% c("how","problem")) %>% 
    apply(.,1,FUN=function(vec) paste(vec[-1],collapse=" ")) 
})) 

      1 
"how are you" 
+0

Übrigens empfehle ich das Lesen von ausgezeichneten Text Mining mit R - http://tidytextmining.com/ –

+0

Vielen Dank @Eric Lecoutre – BEMR

+0

Wenn ich scope = 2 mit c ("wie", "Problem") Ich erhalte: 1 "wie geht es dir"; 2 "Problem Junk Junk" Wörter aus der zweiten Reihe und dritte Reihe im Rahmen sind enthalten. Wie kann der Code geändert werden, um jeden String für eine Zeile separat zu behandeln? @Eric Lecoutre – BEMR

Verwandte Themen