НЛП: извлечение только конкретного предложения из всего текста в R - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть несколько строк текстовых данных (разные документы), и каждая строка содержит около 60-70 строк текстовых данных (более 50000 символов). Но из них моя область интересов - только 1-2 строки данных, основанных на ключевых словах. Я хочу извлечь только те предложения, в которых присутствует ключевое слово / группа слов. Моя гипотеза состоит в том, что, извлекая только эту часть информации, я могу лучше пометить POS и лучше понимать контекст предложения, поскольку я смотрю только на то предложение, которое мне нужно. Правильно ли мое понимание, и как мы можем достичь этого в R, кроме использования регулярных выражений и точек. Это может быть вычислительно интенсивным.

Например: Мальчик живет в Майами и учится на ул. Школа Мартина. Мальчик имеет рост 5,7 "и вес 60 кг. У него есть интерес к искусству и ремеслу; он играет в баскетбол ...................... ........................ .................................................. ................

Я просто хочу извлечь предложение " Мальчик живет в Майами и учится в школе Святого Мартина ", основываясь на изучении ключевых слов (стволовое ключевое слово).

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

В этом примере я использовал три пакета: 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."

Я также протестировал пакет токенизаторов, упомянутый выше, и у меня тоже есть такая же проблема. Поэтому обратите внимание, что это открытая проблема в задачах аннотации НЛП. Однако приведенная выше логика и алгоритм работают правильно.

Надеюсь, это поможет.

0 голосов
/ 26 апреля 2018

Для каждого документа вы можете сначала применить SnowballC::wordStem для лемматизации, а затем использовать tokenizers::tokenize_sentences для разделения документа. Теперь вы можете использовать grepl, чтобы найти предложения, содержащие ключевые слова, которые вы ищете.

...