Сделайте все возможные комбинации строк из входных предложений - PullRequest
0 голосов
/ 01 июля 2018

Чтобы создать все возможные комбинации строк из входных предложений, я сделал строки кода ниже.

library(stringr)
text = c('I like you', 'I love you so much', 'she like it so much', 'she hate you', 'he hate you so much','I like him')
tex = data.frame(text)

library(splitstackshape)
pattern = data.frame(cSplit(tex, "text", " "))

n=ncol(pattern)

dat = c()
for(i in 1:n){
  tt = unique(pattern[,i])
  g=paste0(tt,collapse = ' ')
  dat = c(dat,g)
  SEQ = data.frame(dat)
}

SEQ = data.frame(cSplit(SEQ, "dat", " "))

Может формировать этот фрейм данных.

  dat_1 dat_2 dat_3
1     I   she    he
2  like  love  hate
3   you    it   him
4  <NA>    so  <NA>
5  <NA>  much  <NA>

Я хочу создать все возможные комбинации (108) слов, как показано ниже.

I like you so NA 
I like you so much 
I like you NA NA 
I like you NA much 
...
he love him so much 
he love him NA NA 
he love him NA much 
he hate you so NA 
he hate you so much 
...

Что я должен сделать, чтобы составить эти списки?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Из набора данных "pattern" мы также можем использовать expand из tidyr

library(tidyr)
expand(pattern, !!! rlang::syms(names(pattern)))

Или мы можем использовать separate с expand

library(tidyverse)
mx <- max(str_count(tex$text, "\\w+"))

tex %>% 
  separate(text, into = paste0("dat_", seq_len(mx))) %>%
  expand(!!! rlang::syms(names(.)))
0 голосов
/ 01 июля 2018

Я думаю data.table::tstrsplit удобно для разбиения и транспонирования. Затем выберите уникальные значения каждого элемента списка (lapply(x, unique)) и создайте все комбинации (expand.grid)

expand.grid(lapply(data.table::tstrsplit(text, split = " "), unique))

 #       Var1 Var2 Var3 Var4 Var5
 #   1      I like  you <NA> <NA>
 #   2    she like  you <NA> <NA>
 #   3     he like  you <NA> <NA>
 #   4      I love  you <NA> <NA>
 #   5    she love  you <NA> <NA>
 #   [snip]
 #   104  she love  him   so much
 #   105   he love  him   so much
 #   106    I hate  him   so much
 #   107  she hate  him   so much
 #   108   he hate  him   so much

Вы также можете использовать data.table эквивалент expand.grid, CJ, который имеет аргумент unique.

library(data.table)
do.call(CJ, c(tstrsplit(text, split = " "), unique = TRUE))

#       V1   V2  V3   V4   V5
#   1:   I hate him <NA> <NA>
#   2:   I hate him <NA> much
#   3:   I hate him   so <NA>
#   4:   I hate him   so much
#   5:   I hate  it <NA> <NA>
# ---                       
# 104: she love  it   so much
# 105: she love you <NA> <NA>
# 106: she love you <NA> much
# 107: she love you   so <NA>
# 108: she love you   so much
...