2012-01-10 115 views
3

我想将句子拆分成单词和结束标记(假设所有其他标点已被删除)。我写了一个工作职能分开描述,打破字符串(一个或多个),但我认为部分:将句子分成单词和结尾

unlist(c(strsplit(x, "[^[:alnum:]'\"]", perl = T), substring(x, nchar(x), nchar(x)))) 

的是,可以在不使用字符串,只是分裂的空间之间的更好地实现一粒粒工作使用an或|结束标记各种声明,但不知道我会如何实现这一点。任何方向与此将不胜感激。

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) 

回答

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) 
+0

更多使用scan_tokenizer()和MC_tokenizer()雄辩。谢谢乔希。这也增加了我对正则表达式的理解。我感谢你的时间。 – 2012-01-10 19:27:38

0

,你也可以从TM封装

> 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" 
+0

这些函数似乎将句子拆分成单词,但要么删除标点符号,要么将其附加到句子的最后一个单词。 – 2012-02-15 05:26:37

+0

感谢您的更正。我之前没有注意到“结束标记”部分。 – 2012-02-16 21:57:40