我想将一个句子分成单词和结束标记(假设所有其他标点符号已被删除)。我已经编写了一个工作函数,可以像所描述的那样将字符串分开,但我认为这部分是:
unlist(c(strsplit(x, "[^[:alnum:]'\"]", perl = T), substring(x, nchar(x), nchar(x))))
是一个可以更好地实现的cob作业,不使用子字符串,只是在空格上分割,在endmark之间使用或者|各种声明,但不知道我是如何实现这一目标的。任何方向都将受到赞赏。
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)
答案 0 :(得分:3)
这是一个正则表达模式,它将独自完成整个工作。它将匹配(从而允许strsplit()
在一个句子结束标点符号之前,在空格或处将 分开。
pat <- "[[:space:]]|(?=[.!?])"
模式的前半部分与空格字符匹配,任何匹配都会导致strsplit()
在分割字符串时“吃掉”匹配的字符。模式的后半部分((?=...)
内部的部分)匹配句末标点符号。这是“零宽度正向前瞻断言”的示例(详见?regexp
),因此不导致strsplit()
“吃掉”匹配标点符号。
对于您的示例向量,您甚至不需要调用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)
答案 1 :(得分:0)
你也可以使用tm包中的scan_tokenizer()和MC_tokenizer()
> library(tm)
> ?MC_tokenizer
> MC_tokenizer("what are the number of words in this sentence?")
[1] "what" "are" "the" "number" "of" "words" "in"
[8] "this" "sentence"