Разделить символьный вектор на предложения

У меня есть следующий символьный вектор:

"This is a very long character vector. Why is it so long? I want to split this vector into senteces by using e.g. strssplit. Can someone help me? That would be nice?"

Я хочу разбить его на предложения, используя следующий шаблон (то есть точка - пробел - заглавная буква):

"This is a very long character vector."
"Why is it so long? I want to split this vector into senteces by using e.g. strssplit."
"Can someone help me?"
"That would be nice?"

Следовательно, период после сокращений не должен быть новым предложением. Я хочу сделать это с помощью регулярных выражений в R.

Кто-нибудь может мне помочь?

2 ответа

Решение с использованием strsplit:

string <- "This is a very long character vector. Why is it so long? I think lng. is short for long. I want to split this vector into senteces by using e.g. strssplit. Can someone help me? That would be nice?"
unlist(strsplit(string, "(?<=[[:punct:]])\\s(?=[A-Z])", perl=T))

Результат:

[1] "This is a very long character vector."                             
[2] "Why is it so long?"                                                
[3] "I think lng. is short for long."                                   
[4] "I want to split this vector into senteces by using e.g. strssplit."
[5] "Can someone help me?"                                              
[6] "That would be nice?" 

Это соответствует любому знаку пунктуации, за которым следуют пробел и заглавная буква. (?<=[[:punct:]]) сохраняет пунктуацию в строке перед соответствующим разделителем и (?=[A-Z]) добавляет соответствующую заглавную букву в строку после соответствующего разделителя.

РЕДАКТИРОВАТЬ: Я только что видел, что вы не разбили после вопросительного знака в желаемом результате. Если вы хотите разделить только после "." Вы можете использовать это:

unlist(strsplit(string, "(?<=\\.)\\s(?=[A-Z])", perl = T))

который дает

[1] "This is a very long character vector."                             
[2] "Why is it so long? I think lng. is short for long."                
[3] "I want to split this vector into senteces by using e.g. strssplit."
[4] "Can someone help me? That would be nice?"  

Вы можете использовать пакет tokenizers для этого:

library(tokenizers)
tokenize_sentences(x)

где x ваш персонаж вектор Это приводит к

[[1]]
[1] "This is a very long character vector."

[[2]]
[1] "Why is it so long?"                                                
[2] "I want to split this vector into senteces by using e.g. strssplit."

[[3]]
[1] "Can someone help me?"

[[4]]
[1] "That would be nice?"   

Вы могли бы тогда использовать unlist удалить структуру списка.

Другие вопросы по тегам