将句子分成单词和标记

时间:2012-01-10 18:47:01

标签: regex r

我想将一个句子分成单词和结束标记(假设所有其他标点符号已被删除)。我已经编写了一个工作函数,可以像所描述的那样将字符串分开,但我认为这部分是:

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)  

2 个答案:

答案 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"