【问题标题】:Combining fragmented sentences in an R dataframe在 R 数据框中组合碎片句子
【发布时间】:2015-11-15 11:29:00
【问题描述】:

我有一个数据框,其中包含整个句子的一部分,在某些情况下,它包含多行数据框。

例如,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.

【问题讨论】:

  • 你用什么函数读入数据?数据源是什么样的?
  • 我写了一个函数来将一个 .srt 文件解析成一个数据框。 srt 中的所有内容都已删除,除了您在上面看到的内容。

标签: regex r data-cleaning srt


【解决方案1】:

这应该适用于以....?!结尾的所有句子

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)

【讨论】:

  • 简洁的答案,但第一行的“what”和“they”之间没有空格。
  • @ScottHorvath 这取决于你,但我认为史蒂夫的回答很简洁,值得更多。
  • @StevenBeaupré 为错字道歉。
  • @ScottHorvath 修复了“空格”问题并进行了编辑以处理字符串可能以 ... 结尾的情况
【解决方案2】:

这是我得到的。我相信有更好的方法来做到这一点。这里我使用了基本函数。我创建了一个名为foo 的示例数据框。首先,我在txt 中创建了一个包含所有文本的字符串。 toString() 添加了 ,,所以我在第一个 gsub() 中删除了它们。然后,我在第二个gsub() 中处理了空白(超过2 个空格)。然后,我按您指定的分隔符拆分字符串。将 this post 归功于 Tyler Rinker,我设法在 strsplit() 中留下了分隔符。最后的工作是删除句子初始位置的空格。然后,取消列出该列表。

编辑 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." 

【讨论】:

  • 或者:x &lt;- paste0(foo$txt, collapse = ""); unlist(strsplit(x, "(?&lt;=[?.!|])", perl=TRUE))
  • @StevenBeaupré 伙计,我想你想保持这个答案。你的好多了。您不必处理解决方案中的所有空间问题。我正要投赞成票。
  • 确定将取消删除。不过思路是一样的,只是用paste0代替toString来简化空间问题。
  • @StevenBeaupré 加油!
  • 为什么你在数据集中的“English”之前有一个前导空格?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2022-10-30
相关资源
最近更新 更多