2015-11-15 3 views
1

У меня есть фреймворк данных, который содержит части целых предложений, разбросанных по всем, в некоторых случаях, нескольким строкам данных.Сочетание фрагментированных предложений в R-кадре данных

Например, head(mydataframe) возвращает

# 1 Do you have any idea what 
# 2 they were arguing about? 
# 3   Do--Do you speak 
# 4     English? 
# 5      yeah. 
# 6   No, I'm sorry. 

Предполагая, что предложение может быть прекращено любой из

"" или "?" или "!" или «...»

есть ли библиотека R функции, способные выводить следующее:

# 1 Do you have any idea what they were arguing about? 
# 2   Do--Do you speak English? 
# 3      yeah. 
# 4   No, I'm sorry. 
+0

Какой функции вы использовали для чтения в данных? Как выглядит источник данных? – tchakravarty

+0

Я написал функцию для синтаксического анализа файла .srt в dataframe. Все из srt было удалено, за исключением того, что вы видите выше. –

ответ

4

Это должно работать на все предложения заканчивается: ....? или !

x <- paste0(foo$txt, collapse = " ") 
trimws(unlist(strsplit(x, "(?<=[?.!|])(?=\\s)", perl=TRUE))) 

Кредиты на @AvinashRaj для указателей на просмотра назад

Что дает:

#[1] "Do you have any idea what they were arguing about?" 
#[2] "Do--Do you speak English?"       
#[3] "yeah..."           
#[4] "No, I'm sorry." 

данные

Я изменил игрушечный набор данных включает случай, когда строка заканчивается ... (по запросу OP)

foo <- data.frame(num = 1:6, 
        txt = c("Do you have any idea what", "they were arguing about?", 
          "Do--Do you speak", "English?", "yeah...", "No, I'm sorry."), 
        stringsAsFactors = FALSE) 
+0

Краткий ответ, но нет пробела между «что» и «они» на первой линии. –

+2

@ScottHorvath Это зависит от вас, но я думаю, что ответ Стива лаконичен и заслуживает большего. – jazzurro

+1

@ StevenBeaupré Мои извинения за опечатку. – jazzurro

3

Вот что я получил. Я уверен, что есть лучшие способы сделать это. Здесь я использовал базовые функции. Я создал образец кадра данных, который называется foo. Во-первых, я создал строку со всеми текстами в txt. toString() добавляет ,, поэтому я удалил их в первом gsub(). Затем я позаботился о белом пространстве (более 2 пробелов) во втором gsub(). Затем я разделил строку на разделители, которые вы указали. Кредитование Tyler Rinker за this post, мне удалось оставить разделители в strsplit(). Последняя задача состояла в том, чтобы удалить пробел в начальной позиции предложения. Затем отмените список.

EDIT Steven Beaupré пересмотрел мой код. Это путь!

foo <- data.frame(num = 1:6, 
        txt = c("Do you have any idea what", "they were arguing about?", 
          "Do--Do you speak", "English?", "yeah.", "No, I'm sorry."), 
        stringsAsFactors = FALSE) 

library(magrittr) 

toString(foo$txt) %>% 
gsub(pattern = ",", replacement = "", x = .) %>% 
strsplit(x = ., split = "(?<=[?.!])", perl = TRUE) %>% 
lapply(., function(x) 
      {gsub(pattern = "^ ", replacement = "", x = x) 
     }) %>% 
unlist 

#[1] "Do you have any idea what they were arguing about?" 
#[2] "Do--Do you speak English?"       
#[3] "yeah."            
#[4] "No I'm sorry." 
+0

Или возможно: 'x <- paste0 (foo $ txt, collapse =" "); unlist (strsplit (x, "(? <= [?.! |])", perl = TRUE)) ' –

+0

@ StevenBeaupré Man, я думаю, вы хотите сохранить этот ответ. Твое намного лучше. Вам не нужно иметь дело со всеми проблемами пространства в своем решении. Я собирался его продвинуть. – jazzurro

+0

Хорошо будет восстановлено. Но это та же идея, просто используя 'paste0' вместо' toString', чтобы упростить проблему пространства. –