как сгенерировать строку букв на основе некоторых параметров

У меня есть набор предложений с разным количеством слов в каждом предложении. Мне нужно заменить каждое слово строкой букв, но строка букв должна основываться на определенных критериях. Например, букву «т» можно заменить только буквами «и», «л», «ф»; букву «е» можно заменить только на «о» или «с» и т. д. для каждой буквы алфавита. Также необходимо сохранить пробелы между словами, а также точки, апострофы и другие знаки препинания. Следующий пример: ИСХОДНОЕ ПРЕДЛОЖЕНИЕ: Он любит собаку. ПРЕДЛОЖЕНИЕ СО СТРОКОЙ БУКВ: Fc tcwoz bcy.

Есть ли способ автоматизировать эту процедуру в R? Спасибо.

ДОБАВЛЕНО: мне нужно сделать эту замену около 400 предложений. Предложения хранятся в переменной фрейма данных (data$sentences).


person dede    schedule 19.10.2016    source источник
comment
Итак, вам нужно использовать случайный символ из определенного набора для каждого символа? что ты уже испробовал? Поделись, пожалуйста.   -  person Wiktor Stribiżew    schedule 19.10.2016
comment
Может быть, взгляните на strsplit. вы можете использовать аргумент split=, чтобы получить каждый символ как отдельный элемент. Затем вы бы построили какое-то отображение. Наконец-то собрал его вместе с paste(..., collapse=""). Без более подробной информации о сопоставлении дальнейшая помощь невозможна.   -  person lmo    schedule 19.10.2016
comment
Предоставьте минимальный воспроизводимый пример   -  person Steven Beaupré    schedule 19.10.2016


Ответы (1)


ОБНОВЛЕНИЕ 2: некоторый рефакторинг кода, добавлена ​​простая резервная стратегия для работы с отсутствующими символами (чтобы мы могли кодировать ВСЕ символы в заданной строке, даже если у нас нет точного однозначного соответствия). одно сопоставление) и добавил пример цикла по вектору строк.

# we define two different strings to be encode
mystrings <- c('bye', 'BYE')

# the dictionary with the replacements for each letter
# for the lowercase letters we are defining the exact entries
replacements <- {}
replacements['a'] <- 'xy'
replacements['b'] <- 'zp'
replacements['c'] <- '91'
# ... 
replacements['e'] <- 'xyv'
replacements['y'] <- 'opj'

# then we define a generic "fallback" entry
# to be used when we have no clues on how to encode a 'new' character
replacements['fallback'] <- '2345678'


# string, named vector -> character
# returns a single character chosen at random from the dictionary
get_random_entry <- function(entry, dictionary) {

  value <- dictionary[entry]

  # if we don't know how to encode it, use the fallback
  if (is.na(value)) {
    value <- dictionary['fallback']
  }

  # possible replacement for the current character
  possible.replacements <- strsplit(value[[1]], '')[[1]]

  # the actual replacement
  result <- sample(possible.replacements, 1)

  return(result)
}

# string, named vector -> string
# encode the given string, using the given named vector as dictionary
encode <- function(s, dictionary) {

  # get the actual subsitutions 
  substitutions <- sapply (strsplit(s,'')[[1]], function(ch) {

    # for each char in the string 's'
    # we collect the respective encoded version
    return(get_random_entry(ch, dictionary))

  }, USE.NAMES = F,simplify = T);

  # paste the resulting vector into a single string
  result <- paste(substitutions, collapse = '')

  # and return it
  return(result);
}

# we can use sapply to process all the strings defined in mystrings
# for 'bye' we know how to translate
# for 'BYE' we don't know; we'll use the fallback entry
encoded_strings <- sapply(mystrings, function(s) {
                                        # encode a single string
                                        encode(s, replacements)
                                     }, USE.NAMES =  F)

encoded_strings
person Leonardo Foderaro    schedule 19.10.2016
comment
Он отлично работает с предоставленной вами строкой, спасибо! Однако, если мне нужно использовать его для многих предложений, мне может понадобиться цикл for в начале? Чтобы запустить эту процедуру для каждой строки (т.е. каждого предложения) моей переменной во фрейме данных. - person dede; 19.10.2016
comment
да, по сути, вы можете просто обернуть часть от # получить фактические подстановки до конца скрипта в одну функцию и вызвать ее для кодирования всех ваших отдельных строк. пожалуйста, дайте мне знать, если вам нужен пример, в этом случае я обновлю свой ответ. спасибо - person Leonardo Foderaro; 19.10.2016
comment
Леонардо Фодераро, если бы вы могли привести пример, я был бы очень признателен. Я думал, что должен использовать for(i in 1:nrow(data)) { }, но перед установкой строки для кодирования, а затем определить s как data$sentences (но я не уверен, как это сделать), так как каждая строка data$sentences будет строкой для кодирования . - person dede; 19.10.2016
comment
Я собираюсь пойти на рабочую встречу, и я не могу слишком много программировать. Я отредактировал свой ответ, чтобы добавить код в функцию и вызвать его в цикле. Вероятно, это не самое эффективное решение, но оно должно работать. Дайте мне знать, спасибо. - person Leonardo Foderaro; 19.10.2016
comment
Леонардо, спасибо за ваши изменения. Теперь он работает нормально, за исключением того, что он не сохраняет пробелы между словами, не заменяет заглавные буквы на заглавные и игнорирует знаки препинания. - person dede; 19.10.2016
comment
рада быть полезной! для нижнего регистра проверьте функцию tolower, чтобы преобразовать ввод до того, как он будет закодирован. Для пунктуации вы можете определить дополнительные записи в словаре «замен» или вы можете изменить функцию, чтобы использовать своего рода «всеобъемлющий» для всех неуказанных сопоставлений. сейчас я немного занят, если вам нужен пример, я могу изменить свой ответ чуть позже. пожалуйста, не забудьте проверить это как принятое ;-) - person Leonardo Foderaro; 19.10.2016
comment
Последний вопрос, как я могу распечатать и сохранить только замещающие предложения? (без исходного предложения --› предложение замены). Огромное спасибо! - person dede; 19.10.2016