#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
. Используется для удаления экранированных символов и пробела