Извлечение чисел на основе следующего термина в строке - PullRequest
0 голосов
/ 14 мая 2019

У меня есть пакет данных, который содержит текстовую переменную, заполненную текстом произвольной формы. Я пытаюсь извлечь определенную информацию, основанную на контексте в строке, в новые переменные, которые затем могу проанализировать.

Я копался в qdap и tm. Я унифицировал формат с tolower и replace_abbreviation, но не могу понять, как на самом деле извлечь нужную мне информацию.

Так, например,

library(data.table)
data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                     "Person 2: $500 fine, 45 days jail"))


                                   text
1: Person 1: $1000 fine, 31 months jail
2:    Person 2: $500 fine, 45 days jail

То, что я хотел бы сделать, это извлечь числа на основе любого следующего термина, чтобы создать две дополнительные переменные, месяцы и дни, которые имеют соответствующие значения:

data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail"), 
                 months=c("31",""), 
                 days=c("","45")


                                   text months days
1: Person 1: $1000 fine, 31 months jail     31     
2:    Person 2: $500 fine, 45 days jail          45

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

Спасибо, что уделили время!

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Используя stringr::str_extract() с положительным взглядом , вы можете сделать что-то вроде этого:

data <- dplyr::mutate(data,
                      months = stringr::str_extract(text, "\\d+(?=\\smonths)"),
                      days = stringr::str_extract(text, "\\d+(?=\\sdays)"))

##                                   text months days
## 1 Person 1: $1000 fine, 31 months jail     31 <NA>
## 2    Person 2: $500 fine, 45 days jail   <NA>   45

Вышеупомянутое регулярное выражение делает некоторые предположения о текстовой строке, а именно, она имеет один и только одинрасстояние между числом и единицей, а также то, что единицы всегда во множественном числе.Что-то более гибкое было бы:

data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail",
                        "Person 3: $1000 fine, 1     month 1 day jail"))

data <- dplyr::mutate(data,
                      months = stringr::str_extract(text, "\\d+(?=\\s*months*)"),
                      days = stringr::str_extract(text, "\\d+(?=\\s*days*)"))

##                                           text months days
## 1         Person 1: $1000 fine, 31 months jail     31 <NA>
## 2            Person 2: $500 fine, 45 days jail   <NA>   45
## 3 Person 3: $1000 fine, 1     month 1 day jail      1    1
1 голос
/ 14 мая 2019
getMonths <- function(str) {
  res <- regmatches(str, regexpr("\\d+\\smonths",str));
  if (length(res)>0) {
    res <- regmatches(res, regexpr("\\d+",res));
  }
  return (ifelse(is.null(res),NA,res))
}

getDays <- function(str) {
  res <- regmatches(str, regexpr("\\d+\\sdays",str));
  if (length(res)>0) {
    res <- regmatches(res, regexpr("\\d+",res));
  }
  return (ifelse(is.null(res),NA,res))
}

d<-tibble::as_tibble( list(text = c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail")))


d %>% dplyr::mutate( days = sapply(text,getDays), months = sapply(text,getMonths)) 

##  A tibble: 2 x 3
##  text                                   days  months
##  <chr>                                  <chr> <chr> 
##  1 Person 1: $1000 fine, 31 months jail NA    31    
##  2 Person 2: $500 fine, 45 days jail    45    NA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...