我想将一个句子分成单词和结尾标记(假设所有其他标点符号都已删除)。我已经编写了一个工作函数来按所述将字符串分开,但是我认为这部分是:
unlist(c(strsplit(x, "[^[:alnum:]'\"]", perl = T), substring(x, nchar(x), nchar(x))))
是一个棒子作业,可以更好地实现,而无需使用子字符串,而只在空格之间以及在带有或|的结尾标记之间进行分割各种陈述,但不知道如何实现。任何方向,将不胜感激。
breaker <- function(string) {
FUN <- function(x) {
unlist(c(strsplit(x, "[^[:alnum:]'\"]", perl = T), substring(x,
nchar(x), nchar(x))))
}
lapply(string, FUN)
}
#EXAMPLES
x <- "I'm liking it!"
breaker(x)
y <- c("I'm liking it!", "How much do you like it?", "I'd say it's awesome.")
breaker(y)
最佳答案
这是一个正则表达式模式,它将自己完成整个工作。它会在一个空格或一个句子结尾标点符号的正前方匹配(从而允许strsplit()
分割字符串)。
pat <- "[[:space:]]|(?=[.!?])"
模式的前半部分与空格字符匹配,任何匹配都会使
strsplit()
在分割字符串时“吃掉”匹配的字符。模式的后半部分((?=...)
内部的部分)与句子结尾的标点匹配。这是“零宽度正向超前断言”的示例(有关详细信息,请参见 ?regexp
),因此,而不是会导致strsplit()
吞噬匹配的标点。对于示例 vector ,您甚至不需要调用
lapply()
:breaker <- function(X) {
strsplit(X, "[[:space:]]|(?=[.!?])", perl=TRUE)
}
x <- "I'm liking it!"
breaker(x)
y <- c("I'm liking it!", "How much do you like it?", "I'd say it's awesome.")
breaker(y)
关于regex - 将句子分为单词和尾标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8808733/