Удаление знаков препинания, за исключением апострофов И тире внутри слова в R

#string #r #text

#строка #r #текст

Вопрос:

Я знаю, как отдельно удалить знаки препинания и сохранить апострофы:

 gsub( "[^[:alnum:]']", " ", db$text )  
  

или как сохранить тире внутри слова в пакете tm:

 removePunctuation(db$text, preserve_intra_word_dashes = TRUE)
  

но я не могу найти способ сделать оба одновременно. Например, если мое исходное предложение:

 "Interested in energy/the environment/etc.? Congrats to our new e-board! Ben, Nathan, Jenny, and Adam, y'all are sure to lead the club in a great direction next year! #obama #swag"
  

Я бы хотел, чтобы это было:

 "Interested in energy the environment etc Congrats to our new e-board Ben Nathan Jenny and Adam y'all are sure to lead the club in a great direction next year obama swag"
  

Конечно, будут лишние пробелы, но я могу удалить их позже.

Я буду благодарен за вашу помощь.

Ответ №1:

Используйте классы символов

 gsub("[^[:alnum:]['-]", " ", db$text)

## "Interested in energy the environment etc Congrats to our new e-board Ben Nathan Jenny and Adam y'all are sure to lead the club in a great direction next year obama swag"
  

Комментарии:

1. Спасибо за короткое и приятное решение. Это отлично работает на небольшой выборке твитов, которые у меня есть, но когда я запускаю его на выборке из более чем 200 000 твитов, я получаю сообщение об ошибке: не удалось найти функцию «amp;<-«. У вас есть какие-либо идеи, с чем это может быть связано? Я полагаю, мне не нужно загружать какой-либо дополнительный пакет, не так ли?

2. Я понятия не имею, чем вызвана эта ошибка. Я думаю, что это происходит из другой части вашего кода. И нет, gsub это базовый R, нет необходимости в дополнительных пакетах

3. Вы совершенно правы, спасибо — конечно, глупая опечатка.

4. К сожалению, этот метод не делает различий между тире внутри слова и между тире в слове. В строке: string1<- «тире должно быть сохранено здесь: электронная почта, но не здесь: электронная почта» сохраняются оба тире. Сейчас я играю с регулярным выражением, чтобы попытаться сохранить только тире внутри слова, но если у вас есть какие-либо советы, это было бы очень полезно.

5. Я разобрался с этим, выполнив 2 шага: сначала удалите тире между словами: gsub(» — «, » » «, string1, perl = TRUE), затем используйте вышеупомянутое решение.

Ответ №2:

Мне нравится David Arenberg's ответ. Если вам нужен другой способ, вы могли бы попробовать:

 library(qdap)

text <- "Interested in energy/the environment/etc.? Congrats to our new e-board! Ben, Nathan, Jenny, and Adam, y'all are sure to lead the club in a great direction next year! #obama #swag"

gsub("/", " ",strip(text, char.keep=c("-","/"), apostrophe.remove=F,lower.case=F))
#[1] "Interested in energy the environment etc Congrats to our new e-board Ben Nathan Jenny and Adam y'all are sure to lead the club in a great direction next year obama swag"
  

или

 library(gsubfn)
 clean(gsubfn("[[:punct:]]", function(x) ifelse(x=="'","'",ifelse(x=="-","-"," ")),text))
#[1] "Interested in energy the environment etc Congrats to our new e-board Ben Nathan Jenny and Adam y'all are sure to lead the club in a great direction next year obama swag"
  

clean от qdap . Используется для удаления экранированных символов и пробела