从字符串中提取数字以允许单词变化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从字符串中提取数字以允许单词变化相关的知识,希望对你有一定的参考价值。

我已经在以下位置询问了此版本:

Extracting Numbers Based On the Following Term in a String

我有一些凌乱的数据,需要从没有真正统一输入的字符串变量中提取量刑长度。我需要一个人在monthsdays变量中被判“监禁”或“监狱”的月份或天数,而忽略字符串中的任何其他数字(例如,社区服务的天数) 。

所以如果我有数据

library(data.table)
data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail",
                        "Person 3: 35 dys jail",
                        "Person 4: 14 mnths prison, 30 days community release"))
data


                                                   text
1:                 Person 1: $1000 fine, 31 months jail
2:                    Person 2: $500 fine, 45 days jail
3:                                Person 3: 35 dys jail
4: Person 4: 14 mnths prison, 30 days community release

我需要推断月份和日期信息以形成:

library(data.table)
data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail",
                        "Person 3: 35 dys jail",
                        "Person 4: 14 mnths prison, 30 days community release"), 
                 months=c("31","","","14"), 
                 days=c("","45","35",""))
data

                                                   text months days
1:                 Person 1: $1000 fine, 31 months jail     31     
2:                    Person 2: $500 fine, 45 days jail          45
3:                                Person 3: 35 dys jail          35
4: Person 4: 14 mnths prison, 30 days community release     14   

我一直试图用library(qdap)来解决这个问题,并根据我先前的问题调整以下代码:

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

但是,我什么都没做。诚然,文本分析是一个弱点,我很快了解到用str_extract(text, "\d+(?=\s*days|dys* jail|prison)")代替上面的代码无济于事。

您能提供的任何帮助将不胜感激。试图找出一种编码方法,因此不必强迫我编写成千上万的观察值。

答案

如何使用stringr::str_match以及仅几天/月份或月份/月份的首字母...

data <- mutate(data,
               months = as.numeric(str_match(text, "(\d+)\s*m")[,2]),                   
               days = as.numeric(str_match(text, "(\d+)\s*d")[,2]))
另一答案

我们可以使用tidyr::extract来匹配数字,然后以"m""d"开头的单词匹配,然后是监狱或监狱。

tidyr::extract(data, text, into = c("months", "days"), 
   regex = ".*?(\d+)\sm.*\s(?=jail|prison)|.*?(\d+)\sd.*\s(?=jail|prison)", 
   remove = FALSE, convert = TRUE)

#                                                   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: 35 dys jail     NA   35
#4: Person 4: 14 mnths prison, 30 days community release     14   NA

我们也可以将模式组合在一起并使其更短,但是由于我们希望使用"month""days"信息来划分两个不同的列,因此我用"|"重复了模式。

以上是关于从字符串中提取数字以允许单词变化的主要内容,如果未能解决你的问题,请参考以下文章

从python中的字符串中提取英文单词

从字符串中提取单词 - 微妙的问题

JavaScript 正则表达式 - 从单词旁边提取数字

在特定单词之后从字符串中获取子字符串

从字符串字符和数字中提取字母

空格从PDF提取和奇怪的单词解释中消失了