2012-01-10 77 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