Попробуйте эти варианты.
library(tm)
dat <- VCorpus(VectorSource(c("iv. Chapter Four", "I really want to discuss the proper mix of 17 ingredients.", "Nothing to remove here.")))
inspect( DocumentTermMatrix(dat) )
# <<DocumentTermMatrix (documents: 3, terms: 13)>>
# Non-/sparse entries: 13/26
# Sparsity : 67%
# Maximal term length: 12
# Weighting : term frequency (tf)
# Sample :
# Terms
# Docs chapter discuss four here. ingredients. iv. mix nothing proper really
# 1 1 0 1 0 0 1 0 0 0 0
# 2 0 1 0 0 1 0 1 0 1 1
# 3 0 0 0 1 0 0 0 1 0 0
Одно из предостережений Грегора - слова «I» - похоже, здесь нет, поэтому мы не будем об этом беспокоиться на данный момент. Другим предостережением Грегора было слово "смесь" , которое одновременно является законным и римским числом. Базовая функция c для удаления простых / целых римских цифр может быть следующей:
no_romans <- function(s) s[!grepl("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$", toupper(s))]
inspect( DocumentTermMatrix(dat, control = list(removeNumbers = no_romans)) )
# <<DocumentTermMatrix (documents: 3, terms: 12)>>
# Non-/sparse entries: 12/24
# Sparsity : 67%
# Maximal term length: 12
# Weighting : term frequency (tf)
# Sample :
# Terms
# Docs chapter discuss four here. ingredients. iv. nothing proper really remove
# 1 1 0 1 0 0 1 0 0 0 0
# 2 0 1 0 0 1 0 0 1 1 0
# 3 0 0 0 1 0 0 1 0 0 1
Это удаляет "mix"
, но оставляет "iv."
. Если вам нужно удалить это, то, возможно,
no_romans2 <- function(s) s[!grepl("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})[.]?$", toupper(s))]
inspect( DocumentTermMatrix(dat, control = list(removeNumbers = no_romans2)) )
# <<DocumentTermMatrix (documents: 3, terms: 11)>>
# Non-/sparse entries: 11/22
# Sparsity : 67%
# Maximal term length: 12
# Weighting : term frequency (tf)
# Sample :
# Terms
# Docs chapter discuss four here. ingredients. nothing proper really remove the
# 1 1 0 1 0 0 0 0 0 0 0
# 2 0 1 0 0 1 0 1 1 0 1
# 3 0 0 0 1 0 1 0 0 1 0
(единственная разница заключается в добавлении [.]?
ближе к концу регулярного выражения.)
(Кстати: можно использовать grepl(..., ignore.case=TRUE)
чтобы получить тот же эффект, что и toupper(s)
, используемый здесь. Это немного медленнее при тестировании на малых выборках, но эффект тот же.)