2017-02-14 2 views
2

Проблема: Я работаю с токенизатором для интеллектуального анализа текста и хотел бы ограничить длину строк в моих входных данных. Следующий код содержит целую строку , если слово включено.сохранить слова после ключевого слова в строке 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)) 

Вопрос: Как я могу изменить код, чтобы просто держать N слов после ключевых слов.

например.

, если N = 1, то дд будет включать в себя: как

, если N = 2, то дд будет включать в себя: как ты

, если N = 3, то дд будет включать в себя: как вы делаете

...

Мне нужен код, который будет работать, если я включил дополнительные слова в донжон:

#keep string that only include terms "how" and "with" 
    dd <- filter(dd, grepl('how|with', text)) 
+1

Не совсем регулярное выражение гуру, но это может помочь вам: https://regex101.com/r/95g7yT/1 – digEmAll

+0

Что вы ожидаете увидеть в результате, если вы указать два термина: «как» и «) с« и N = 3, например? Кроме того, что, если расстояние между двумя членами меньше, чем 3 слова, например, если бы мы выбрали '' hello ''и' 'are' '? –

+0

1 - С двумя терминами «как» ИЛИ «с» и N = 3 Я хотел бы сгенерировать: «как вы справляетесь с этой проблемой». Результаты для второго термина «с» будут содержать только слова до конца строки. 2 - Если условия были «привет» и «есть», я хотел бы сохранить: «привет, как вы выражаете благодарность», если это возможно. – BEMR

ответ

1

Вот возможный подход Жек аккуратной горнорудного текста пакеты .: (так проверять зависимости ...-

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) 

я упоминаю, как scope вашего параметр о словах горизонта; легко превратить следующий код в функцию:

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 

В случае, если вы хотите, чтобы в конечном итоге со строками, вы должны свернуть назад ngrams, ср, например, этот второй пример:

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" 

Что касается Вашего комментария : Теперь, если вы хотите работать chunk (string) на chunk (string), вы должны явно выполнить эту группу путем обработки. Вот способ, например:

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

Кстати, я рекомендую прочитать отличный текст с помощью R - http://tidytextmining.com/ –

+0

Спасибо @Eric Lecoutre – BEMR

+0

Если я запустил scope = 2 с c («как», «проблема») Я получаю: 1 «как вы»; 2 «проблемный нежелательный мусор» Включены слова из второго ряда и третьей строки в кадре. Как изменить код для обработки каждой строки для отдельной строки? @ Eric Lecoutre – BEMR

Смежные вопросы