В этом примере я использовал три пакета: NLP и openNLP (для разбиения предложений) и SnowballC (для лемматизации). Я не использовал упомянутый выше пакет токенизаторов, потому что не знал об этом. И упомянутые мной пакеты являются частью набора инструментов Apache OpenNLP, хорошо известного и используемого сообществом.
Сначала используйте приведенный ниже код для установки упомянутых пакетов. Если у вас установлены пакеты, перейдите к следующему шагу:
## List of used packages
list.of.packages <- c("NLP", "openNLP", "SnowballC")
## Returns a not installed packages list
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
## Installs new packages
if(length(new.packages))
install.packages(new.packages)
Далее загрузите использованные пакеты:
library(NLP)
library(openNLP)
library(SnowballC)
Затем преобразуйте текст в строку (функция пакета NLP). Это необходимо, поскольку пакет openNLP работает с типом String. В этом примере я использовал тот же текст, который вы указали в своем вопросе:
example_text <- paste0("The Boy lives in Miami and studies in the St. Martin School. ",
"The boy has a heiht of 5.7 and weights 60 Kg's. ",
"He has intrest in the Arts and crafts; and plays basketball. ")
example_text <- as.String(example_text)
#output
> example_text
The Boy lives in Miami and studies in the St. Martin School. The boy has a heiht of 5.7 and weights 60 Kg's. He has intrest in the Arts and crafts; and plays basketball.
Далее мы используем пакет openNLP для генерации аннотатора предложений, который вычисляет аннотации с помощью детектора предложений:
sent_annotator <- Maxent_Sent_Token_Annotator()
annotation <- annotate(example_text, sent_annotator)
Далее, через примечания, сделанные в тексте, мы можем извлечь предложения:
splited_text <- example_text[annotation]
#output
splited_text
[1] "The Boy lives in Miami and studies in the St. Martin School."
[2] "The boy has a heiht of 5.7 and weights 60 Kg's. "
[3] "He has intrest in the Arts and crafts; and plays basketball. "
Наконец, мы используем функцию wordStem пакета SnowballC, который поддерживает английский язык. Эта функция сводит слово или вектор слов к своему радикалу (общая базовая форма). Далее мы используем функцию grep базового пакета R, чтобы найти предложения, содержащие ключевые слова, которые мы ищем:
stemmed_keyword <- wordStem ("study", language = "english")
sentence_index<-grep(stemmed_keyword, splited_text)
#output
splited_text[sentence_index]
[1] "The Boy lives in Miami and studies in the St. Martin School."
Примечание
Обратите внимание, что я изменил пример текста, который вы предоставили из ** "... Школа Святого Мартина". ** до ** "... Школа Святого Мартина." **. Если бы буква «s» оставалась строчной, детектор предложений понял бы, что пунктуация в «st». это конечная точка. И вектор с разбитыми предложениями будет выглядеть следующим образом:
> splited_text
[1] "The Boy lives in Miami and studies in the st." "Martin School."
[3] "The boy has a heiht of 5.7 and weights 60 Kg's." "He has intrest in the Arts and crafts; and plays basketball."
И, следовательно, при проверке ключевого слова в этом векторе вы получите:
> splited_text[sentence_index]
[1] "The Boy lives in Miami and studies in the st."
Я также протестировал пакет токенизаторов, упомянутый выше, и у меня тоже есть такая же проблема. Поэтому обратите внимание, что это открытая проблема в задачах аннотации НЛП. Однако приведенная выше логика и алгоритм работают правильно.
Надеюсь, это поможет.