Разделить символьный вектор на предложения
У меня есть следующий символьный вектор:
"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
удалить структуру списка.