从R-regex中的文本中提取相关信息

从R-regex中的文本中提取相关信息,r,regex,text-mining,information-extraction,R,Regex,Text Mining,Information Extraction,我试图从文本文档中提取一些信息。我已使用pdftext()将此文本文档转换为数据帧。现在我想提取我要获取的信息。下面是创建类似我的数据帧的代码: text <- data.frame(page = c(1,1,2,3), sen = c(1,2,1,1), text = c("Dear Mr case 1","the value of my property is £500,000.00 and it was built in 1980",

我试图从文本文档中提取一些信息。我已使用
pdftext()将此文本文档转换为数据帧。
现在我想提取我要获取的信息。下面是创建类似我的数据帧的代码:

text <- data.frame(page = c(1,1,2,3), sen = c(1,2,1,1), text = c("Dear Mr case 1","the value of my property is £500,000.00 and it was built in 1980", 
                                                             "The protected percentage is 0% for 2 years", "The interest rate is fixed for 2 years at 4.8%"))

text假设可以将R数组的所有部分都放在一个字符串中,这个正则表达式就可以完成这项工作(设置为不区分大小写):

匹配项在捕获组1、2、3和4中

这是一个演示(查看右侧的“匹配”窗格):

我真的不知道R,但我知道你可以这样做:

regmatches(subject, 
gregexpr("dear\\s+(mr|mrs|miss|ms)\\b[^£]+(£[\\d,.]+)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)",
subject, perl=TRUE, ignore.case=TRUE));
但我把R的细节留给你

编辑:也许在R:

matches <- gregexpr("dear\\s+(mr|mrs|miss|ms)\\b[^£]+(£[\\d,.]+)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)", subject, perl=TRUE, ignore.case=TRUE);
result <- lapply(matches, function(m) attr(m, "capture.start")[,1])
for (i in seq_along(result))
  attr(result[[i]], "match.length") <- attr(matches[[i]], "capture.length")[,1]
result

匹配假设您可以将R数组的所有部分放在一个字符串中,则此正则表达式可以完成此任务(将其设置为不区分大小写):

匹配项在捕获组1、2、3和4中

这是一个演示(查看右侧的“匹配”窗格):

我真的不知道R,但我知道你可以这样做:

regmatches(subject, 
gregexpr("dear\\s+(mr|mrs|miss|ms)\\b[^£]+(£[\\d,.]+)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)",
subject, perl=TRUE, ignore.case=TRUE));
但我把R的细节留给你

编辑:也许在R:

matches <- gregexpr("dear\\s+(mr|mrs|miss|ms)\\b[^£]+(£[\\d,.]+)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)(?:\\D|\\d(?![\\d.]*%))+([\\d.]+%)", subject, perl=TRUE, ignore.case=TRUE);
result <- lapply(matches, function(m) attr(m, "capture.start")[,1])
for (i in seq_along(result))
  attr(result[[i]], "match.length") <- attr(matches[[i]], "capture.length")[,1]
result

匹配这里有一个部分解决方案:为要提取的每个块指定一个正则表达式。您可能需要调整正则表达式,或者调整在数据帧中如何组合数据,但这应该可以让您继续。注意,R包
stringr
使用,并且需要使用双反斜杠转义

p_荷载(tidyverse)

ttt这里有一个部分解决方案:每个要提取的块都有一个正则表达式。您可能需要调整正则表达式,或者调整在数据帧中如何组合数据,但这应该可以让您继续。注意,R包
stringr
使用,并且需要使用双反斜杠转义

p_荷载(tidyverse)

ttt你是对的,正则表达式可以工作,但如果你的文本变化很大,它就会失败。我建议您研究自然语言处理(NLP)软件包,如
koRpus
,以便更好地进行文本挖掘。数据结构的标准化程度如何?例如,是否每个人都有四个字符串?周围的文字总是一样的吗?如果是这样的话,本例中的一些正则表达式将是微不足道的。就周围的文本而言,结构总是相同的。这个人的名字并不总是相同的长度,但总的来说,其他所有的东西都有一个一致的格式。你可能是对的,正则表达式可以工作,但如果你的文本变化很大,那么它就会失败。我建议您研究自然语言处理(NLP)软件包,如
koRpus
,以便更好地进行文本挖掘。数据结构的标准化程度如何?例如,是否每个人都有四个字符串?周围的文字总是一样的吗?如果是这样的话,本例中的一些正则表达式将是微不足道的。就周围的文本而言,结构总是相同的。这个人的名字并不总是相同的长度,但总的来说,其他所有的名字都有一个一致的格式。可能是Thanke@Jaifroid的重复。我看了你的正则表达式,在演示中,它似乎工作得很好。试过了,但没用。我也试着在同一个网页上打开一个新的会话,复制并粘贴你的正则表达式和文本。当我尝试打开一个新的会话时,它在网站上也不起作用。我正在考虑将整个正则表达式分成多个步骤,然后合并它们的输出。例如。首先获取Mr或Miss信息,然后获取查看regex101的“受保护百分比”后显示的数字,问题只是因为您没有将regex设置为不区分大小写。单击顶部正则表达式右侧的小“gm”,然后选择不区分大小写。对于R,您是否使用了我上面建议的
ignore.case=TRUE
选项?编辑:如果您确信Mr-Mrs-Miss-Ms总是用正确的大写字母拼写,那么您可以使正则表达式区分大小写。在这种情况下,只需将正则表达式中的那些更改为使用初始资本即可。另外,将
dear
更改为
dear
。我知道如果您在R:
gregexpr(“亲爱的\\s+(先生、夫人、小姐、小姐)\\b[^]+([\\d,.]+)(?:\\d\\\d(?![\\d.]*%)+([\\d.]+%)(?:\\d\\\\\d+\\d(?[\\d.]%)([\\d.+++%)([\\d.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\%)([\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\然后您将得到一个列表,其中包含每个元素中所有正则表达式匹配项的位置和长度向量。但我真的不知道R。我已经在我的答案中添加了一些模板代码,这样你就可以看看是否可以修改它。谢谢@Jaifroid。我看了你的正则表达式,在演示中,它似乎工作得很好。试过了,但没用。我也试着在同一个网页上打开一个新的会话,复制并粘贴你的正则表达式和文本。当我尝试打开一个新的会话时,它在网站上也不起作用。我正在考虑将整个正则表达式分成多个步骤,然后合并它们的输出。例如。首先获取Mr或Miss信息,然后获取查看regex101的“受保护百分比”后显示的数字,问题只是因为您没有将regex设置为不区分大小写。单击顶部正则表达式右侧的小“gm”,然后选择不区分大小写。对于R,您是否使用了我上面建议的
ignore.case=TRUE
选项?编辑:如果您确信Mr-Mrs-Miss-Ms总是用正确的大写字母拼写,那么您可以使正则表达式区分大小写。在这种情况下,只需将正则表达式中的那些更改为使用初始资本即可。另外,将
dear
更改为
dear
。我知道如果您在R:
gregexpr(“亲爱的\\s+(先生、夫人、小姐、小姐)\\b[^]+([\\d,.]+)(?:\\d\\\d(?![\\d.]*%)+([\\d.]+%)(?:\\d\\\\\d+\\d(?[\\d.]%)([\\d.+++%)([\\d.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\%)([\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\然后您将得到一个列表,其中包含每个元素中所有正则表达式匹配项的位置和长度向量。但我真的不知道R。我已经在我的答案中添加了更多的模板代码,以便您可以查看是否可以修改它。