我想将一个句子分成单词和结尾标记(假设所有其他标点符号都已删除)。我已经编写了一个工作函数来按所述将字符串分开,但是我认为这部分是:

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/

10-12 18:50