случайно разбить словарь на n частей - PullRequest
1 голос
/ 16 октября 2019

У меня есть quanteda словарь, который я хочу случайным образом разделить на n части.

dict <- dictionary(list(positive = c("good", "amazing", "best", "outstanding", "beautiful", "wonderf*"),
            negative = c("bad", "worst", "awful", "atrocious", "deplorable", "horrendous")))

Я пытался использовать функцию split, например, такую: split(dict, f=factor(3)), но не удалось.

Я хотел бы вернуть три словаря, но я получаю

$`3`
Dictionary object with 2 key entries.
- [positive]:
  - good, amazing, best, outstanding, beautiful, wonderf*
- [negative]:
  - bad, worst, awful, atrocious, deplorable, horrendous

РЕДАКТИРОВАТЬ

Я включил другую запись, содержащую * всловарь. Решение, предложенное Кеном Бенуа , выдает ошибку в этом случае, но в остальном работает отлично.

Требуемый вывод выглядит примерно так:

> dict_1
Dictionary object with 2 key entries.
- [positive]:
  - good, wonderf*
- [negative]:
  - deplorable, horrendous

> dict_2
Dictionary object with 2 key entries.
- [positive]:
  - amazing, best
- [negative]:
  - bad, worst

> dict_3
Dictionary object with 2 key entries.
- [positive]:
  - outstanding, beautiful
- [negative]:
  - awful, atrocious

В случае, есликоличество записей не может быть разделено на n без остатков, у меня нет спецификации, но в идеале Я мог бы решить, что я хочу (i) «остаток» отдельно или (ii) что я хочу всезначения, которые будут распределены (в результате чего некоторые расщепления будут немного больше).

1 Ответ

2 голосов
/ 16 октября 2019

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

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

Это должно сделать это.

library("quanteda")
## Package version: 1.5.1

dict <- dictionary(
  list(
    positive = c("good", "amazing", "best", "outstanding", "beautiful", "delightful"),
    negative = c("bad", "worst", "awful", "atrocious", "deplorable", "horrendous")
  )
)

dictionary_split <- function(x, len) {
  maxlen <- max(lengths(x)) # change to minumum to avoid recycling
  subindex <- split(seq_len(maxlen), ceiling(seq_len(maxlen) / len))
  splitlist <- lapply(subindex, function(y) lapply(x, "[", y))
  names(splitlist) <- paste0("dict_", seq_along(splitlist))
  lapply(splitlist, dictionary)
}

dictionary_split(dict, 2)
## $dict_1
## Dictionary object with 2 key entries.
## - [positive]:
##   - good, amazing
## - [negative]:
##   - bad, worst
## 
## $dict_2
## Dictionary object with 2 key entries.
## - [positive]:
##   - best, outstanding
## - [negative]:
##   - awful, atrocious
## 
## $dict_3
## Dictionary object with 2 key entries.
## - [positive]:
##   - beautiful, delightful
## - [negative]:
##   - deplorable, horrendous
...