Анонимизировать имена в переменной абзаца путем сопоставления и замены

Я анализирую базу данных школьных табелей успеваемости. Мой набор данных состоит из около 3000 записей, структурированных аналогично примеру ниже. Каждое наблюдение - это оценка одного учителя одним учеником. Каждое наблюдение состоит из трех предложений.

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

Непоследовательное использование имен учеников (имя против псевдонима против полного имени) и неструктурированное использование имени ученика делает это довольно непростым делом для такого любителя, как я. Моя попытка решить эту проблему состояла в том, чтобы подойти к комментариям как к документам в корпусе и использовать написать функцию, которая использует tm::removeWords но это не сработало для меня. Заранее спасибо!

Пример данных (здесь приведены данные таблицы)

  Teacher Subject      Student.Name                                                         Comment
1   Black    Math    Richard (Dick) Dick is a terrible student-- why hasn't he been kicked out yet?
2   Black    Math Elizabeth (Betty)                       Betty procrastinates, but does good work.
3   Black    Math   Mary Grace (MG)                      As her teacher, I think MG is my favorite.
4   Brown English    Richard (Dick)                      Richard is terrible at turning in homework.
5   Brown English Elizabeth (Betty)                Elizabeth's work is interfering with her studies.
6   Brown English   Mary Grace (MG)                         Mary Grace should be a teacher someday.
7    Blue    P.E.    Richard (Dick)  Richard (Dick) kicked more field goals than any other student.
8    Blue    P.E. Elizabeth (Betty)    Elizabeth (Betty) needs to work to communicate on the field.
9    Blue    P.E.   Mary Grace (MG)             Mary Grace (MG) needs to stop insulting the teacher

Желаемые данные

Teacher Subject Student Name    Comment
Black   Math    A   A is a terrible student-- why hasn't he been kicked out yet?
Black   Math    B   B procrastinates, but does good work.
Black   Math    C   As her teacher, I think C is my favorite.
Brown   English A   A is terrible at turning in homework
Brown   English B   B's work is interfering with her studies.
Brown   English C   C should be a teacher someday.
Blue    P.E.    A   A kicked more field goals than any other student.
Blue    P.E.    B   B needs to work to communicate on the field.
Blue    P.E.    C   C needs to stop insulting the teacher

NB

Четыре месяца назад я задал вариант этого вопроса без ответа. Я думал, что это поможет показать мое решение, но, возможно, tm Пакет не широко используется. Итак, вот еще один выстрел.

2 ответа

Я хотел бы использовать mgsub здесь из qdap пакет. Вы можете сделать что-то вроде этого (хотя позаботьтесь о том, чтобы ученики относились к тем же идентификаторам, которые здесь могут быть слишком специфичны для вашего примера, содержащего псевдонимы для каждого учащегося):

names <- unique(as.character(reports$Student.Name))
ids <- sample(100000, length(names))

tocheck <- c(
  names, 
  unlist(regmatches(names, gregexpr("(?<=\\().*?(?=\\))", names, perl = T))),
  gsub("\\s*\\([^\\)]+\\)","",as.character(names))
)
reports$Student.Name <- rep(ids, 3)
reports$Comment <- qdap::mgsub(tocheck, rep(ids, 3), reports$Comment)

  Student.Name                                                          Comment
1        61034 61034 is a terrible student-- why hasn't he been kicked out yet?
2        45005                        45005 procrastinates, but does good work.
3        13699                    As her teacher, I think 13699 is my favorite.
4        61034                         61034 is terrible at turning in homework
5        45005                    45005's work is interfering with her studies.
6        13699                               13699 should be a teacher someday.
7        61034            61034 kicked more field goals than any other student.
8        45005                 45005 needs to work to communicate on the field.
9        13699                        13699 needs to stop insulting the teacher

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

## load dput data
#eval(parse(text=paste0(readLines("http://pastebin.com/raw/MbghGybd", warn = F), collapse="\n")))

# anonymize:
r <-  regexec("(\\w+)\\s(?:(\\w+)\\s)?\\((\\w+)\\)", levels(reports$Student.Name))
m <- regmatches(levels(reports$Student.Name), r)
names(m) <- levels(reports$Student.Name)
m <- lapply(m, function(x) { 
  paste(sprintf("%s\\s*\\(%s\\)", x[2], x[4]), sprintf("%s %s \\(%s\\)", x[2], x[3], x[4]), x[2], x[4], paste(x[2], x[3], sep=" "), sep="|")
})
rep <- split(reports, reports$Student.Name)
for (x in seq_along(names(rep))) {
  rep[[x]]$Comment <-  gsub(m[[names(rep)[x]]], x, rep[[x]]$Comment, perl=TRUE)
}
transform(do.call(rbind, rep), Student.Name=as.integer(Student.Name))
#                     Teacher Subject Student.Name                                                      Comment
# Elizabeth (Betty).2   Black    Math            1                        1 procrastinates, but does good work.
# Elizabeth (Betty).5   Brown English            1                    1's work is interfering with her studies.
# Elizabeth (Betty).8    Blue    P.E.            1                 1 needs to work to communicate on the field.
# Mary Grace (MG).3     Black    Math            2                    As her teacher, I think 2 is my favorite.
# Mary Grace (MG).6     Brown English            2                         2 Grace should be a teacher someday.
# Mary Grace (MG).9      Blue    P.E.            2                        2 needs to stop insulting the teacher
# Richard (Dick).1      Black    Math            3 3 is a terrible student-- why hasn't he been kicked out yet?
# Richard (Dick).4      Brown English            3                         3 is terrible at turning in homework
# Richard (Dick).7       Blue    P.E.            3            3 kicked more field goals than any other student.

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

Другие вопросы по тегам