Как извлечь уникальную строку между шаблоном строки в полном тексте в R? - PullRequest
3 голосов
/ 22 января 2020

Я хочу извлечь имена и профессии тех, кто давал показания перед Конгрессом, из следующего текста:

text <- c (("СЛУЖБА ПОЛНОГО КОМИТЕТА \ \ ", \\" 2017 \\ ", \ n \\" 6 апреля 2017 г. - '' Сезон подачи налоговой декларации 2017 г .: внутренний доход \\ ", \", \ "\\" \ nСервисные операции и опыт налогоплательщиков . '' На этом слушании \\ ", \\" были рассмотрены вопросы, связанные с сезоном подачи налоговых деклараций 2017 года, включая \\ ", \\" производительность IRS, проблемы обслуживания клиентов и информационные \\ ", \\" технологии. Свидетельство было \ nheard от достопочтенного Джона \\ ", \\" Коскинен, комиссар, Служба внутренних доходов \ nService, Вашингтон, \\ ", \", \ "\\" D C. \\ ", \\" 25 мая 2017 г. - «Бюджетный бюджет на 2018 год \ nПредложения для Министерства финансов и налоговой реформы». Слушание \ n, «Обследовало» бюджет президента на 2018 год и коснулось об операциях Отдела Казначейства и Налоговой Реформы. Свидетельство было заслушано почетным Стивеном Мнучином, Секретарем Казначейства. ry, \\ ", \", \ "\\" Соединенные Штаты \ nДепартамент казначейства, Вашингтон, D C. \\ ", \\" 18 июля 2017 г. - '' Комплексная реформа \ nTax: перспективы и Chal - \\ ", \\" lenges. '' Слушание охватывало вопросы, связанные с потенциальными налоговыми планами - \\ ", \\", включая индивидуальные, деловые, \ n и международные про - \\ ", \\" посылки , Свидетельство было заслушано почетным \ nJonathan Talis - \\ ", \", \ "\\" человеком, бывшим помощником секретаря по налоговой политике 2000– \ n2001, \\ ", \\" Казначейства США, Вашингтон , ОКРУГ КОЛУМБИЯ; \\ ", \ n \\" Достопочтенная Памела Ф. Олсон, бывший помощник министра по налогам \\ ", \\" Политика \ n2002–2004, Министерство финансов США, \\ ", \\" Вашингтон, ОКРУГ КОЛУМБИЯ; \ nПочтительный Эри c Соломон, бывший помощник \\ ", \", \ "\" Секретаря по налоговой политике \ n2006–2009, Департамент США \ ", \" Казначейство, Вашингтон, округ Колумбия; и \ n Почетный знак Дж. \\ ", \\" Мазур, бывший помощник министра налоговой политики \ n2012–2017, \\ ", \\" Министерство финансов США, Вашингтон, D C. \\ ", \ n \\" (5) \\ ", \\" VerDate 11 сентября 2014 г. 14:16 28 марта 2019 г. Jkt 000000 PO 00000 Frm 00013 \ nFmt 6601 Sfmt 6601 R: \\\\ DOCS \\\\ 115ACT.000 TIM \\ "\", \ ") \") ") </p>

Полный текст доступен здесь: https://www.congress.gov/116/crpt/srpt19/CRPT-116srpt19.pdf

It Кажется, что имена находятся между «Доказательства были услышаны от« до следующего ».» Итак, как я могу извлечь имена между этими двумя образцами? Текст намного длиннее (документ на 50 страниц), но я подумал, что если я могу сделать это один, я сделаю это для остальной части текста.

Я знаю, что не могу использовать NLP для извлечения имени, потому что это имена людей, которые не свидетельствовать, например.

1 Ответ

2 голосов
/ 22 января 2020

НЛП, вероятно, неизбежно из-за множества сокращений в тексте. Попробуйте этот рабочий процесс:

  1. Токенизация по предложению
  2. Удаление предложений без "Свидетельства"
  3. Извлечение лиц + профессий из оставшихся предложений

Есть пара пакетов с токенайзерами предложений, но openNLP , как правило, работает лучше всего при работе с предложениями с аббревиатурой. Следующий код должен приблизить вас к вашей цели:

library(tidyverse)
library(pdftools)
library(openNLP)

# Get the data
testimony_url <- "https://www.congress.gov/116/crpt/srpt19/CRPT-116srpt19.pdf"
download.file(testimony_url, "testimony.pdf")
text_raw <- pdf_text("testimony.pdf")

# Clean the character vector and smoosh into one long string.
text_string <- str_squish(text_raw) %>% 
    str_replace_all("- ", "") %>% 
    paste(collapse = " ") %>% 
    NLP::as.String()

# Annotate and extract the sentences.
annotations <- NLP::annotate(text_string, Maxent_Sent_Token_Annotator())
sentences <- text_string[annotations]

# Some sentences starting with "Testimony" list multiple persons. We need to
# split these and clean up a little.
name_title_vec <- str_subset(sentences, "Testimony was") %>% 
    str_split(";") %>% 
    unlist %>% 
    str_trim %>% 
    str_remove("^(Testimony .*? from|and) ") %>% 
    str_subset("^\\(\\d\\)", negate = T)

# Put in data frame and separate name from profession/title.
testimony_tibb <- tibble(name_title_vec) %>% 
    separate(name_title_vec, c("name", "title"), sep = ", ", extra = "merge")

В итоге вы должны получить приведенный ниже фрейм данных. Может потребоваться дополнительная очистка:

# A tibble: 95 x 2
   name                       title                                                               
   <chr>                      <chr>                                                               
 1 the Honorable John Koskin… Commissioner, Internal Revenue Service, Washington, DC.             
 2 the Honorable Steven Mnuc… Secretary of the Treasury, United States Department of the Treasury…
 3 the Honorable Jonathan Ta… former Assistant Secretary for Tax Policy 2000–2001, United States …
 4 the Honorable Pamela F. O… former Assistant Secretary for Tax Policy 2002–2004, United States …
 5 the Honorable Eric Solomon former Assistant Secretary for Tax Policy 2006–2009, United States …
 6 the Honorable Mark J. Maz… "former Assistant Secretary for Tax Policy 2012–2017, United States…
 7 Mr. Daniel Garcia-Diaz     Director, Financial Markets and Community Investment, United States…
 8 Mr. Grant S. Whitaker      president, National Council of State Housing Agencies, Washington, …
 9 the Honorable Katherine M… Ph.D., professor of public policy and planning, and faculty directo…
10 Mr. Kirk McClure           Ph.D., professor, Urban Planning Program, School of Public Policy a…
# … with 85 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...