我正在尝试从非结构化文本中提取子字符串。例如,假设一个国家名称向量:
countries <- c("United States", "Israel", "Canada")
如何传递这个字符值向量,从非结构化文本中提取准确的匹配。
text.df <- data.frame(ID = c(1:5),
text = c("United States is a match", "Not a match", "Not a match",
"Israel is a match", "Canada is a match"))
在本例中,所需的输出是:
ID text
1 United States
4 Israel
5 Canada
到目前为止,我一直在使用gsub
,在这里删除所有非匹配项,然后删除带有空值的行。我也一直在使用stringr包中的str_extract
,但是没有成功地使正则表达式的提示正确。如能提供任何帮助,将不胜感激!
发布于 2015-03-22 16:29:35
1.弦R
我们可以首先在“grep”中使用“indx”(通过折叠“国家”向量形成)作为模式,然后使用“str_extract”从“文本”列获取模式元素,将其分配给子集数据集(“text.df1”)的“文本”列。
library(stringr)
indx <- paste(countries, collapse="|")
text.df1 <- text.df[grep(indx, text.df$text),]
text.df1$text <- str_extract(text.df1$text, indx)
text.df1
# ID text
#1 1 United States
#4 4 Israel
#5 5 Canada
2.碱基R
无需使用任何外部包,我们就可以删除“ind”中的字符以外的字符。
text.df1$text <- unlist(regmatches(text.df1$text,
gregexpr(indx, text.df1$text)))
3.弦I
我们也可以使用来自stringi
的更快的stringi
library(stringi)
na.omit(within(text.df, text1<- stri_extract(text, regex=indx)))[-2]
# ID text1
#1 1 United States
#4 4 Israel
#5 5 Canada
发布于 2015-03-22 16:32:40
下面是一种使用data.table
的方法
library(data.table)
##
R> data.table(text.df)[
sapply(countries, function(x) grep(x,text),USE.NAMES=F),
list(ID, text = countries)]
ID text
1: 1 United States
2: 4 Israel
3: 5 Canada
发布于 2015-03-22 17:11:51
创建模式p
,并使用strapply
提取每个不匹配组件的text
返回NA
的每个组件的匹配。最后,使用na.omit
删除NA值。这是非破坏性的(即text.df
没有被修改):
library(gsubfn)
p <- paste(countries, collapse = "|")
na.omit(transform(text.df, text = strapply(paste(text), p, empty = NA, simplify = TRUE)))
给予:
ID text
1 1 United States
4 4 Israel
5 5 Canada
使用dplyr还可以如下所示(使用上面的p
):
library(dplyr)
library(gsubfn)
text.df %>%
mutate(text = strapply(paste(text), p, empty = NA, simplify = TRUE)) %>%
na.omit
https://stackoverflow.com/questions/29196831
复制相似问题