在R中:提取文本句子中的信息

在R中:提取文本句子中的信息,r,split,extract,sentence,R,Split,Extract,Sentence,我有一些文章的全文。我想提取一些信息(比如年或月)来分析它 作为文章文本结构的一个例子 2016年12月4日星期日,篇幅:(正文长度),标题: 文章标题),署名:(记者姓名),正文:(正文) 我把所有的文本都放在一行一篇文章中(所以我认为可以把文章结构当作一个字符串) 在这种格式中,如何提取长度、标题、署名值并生成数据帧 我认为如果正确使用正则表达式是可能的,但我不知道如何准确地使用。这可能是一个开始:使用strsplit提取所需的部分。此代码有点凌乱,但它可以工作: sentence <

我有一些文章的全文。我想提取一些信息(比如年或月)来分析它

作为文章文本结构的一个例子

2016年12月4日星期日,篇幅:(正文长度),标题: 文章标题),署名:(记者姓名),正文:(正文)

我把所有的文本都放在一行一篇文章中(所以我认为可以把文章结构当作一个字符串)

在这种格式中,如何提取长度、标题、署名值并生成数据帧


我认为如果正确使用正则表达式是可能的,但我不知道如何准确地使用。

这可能是一个开始:使用strsplit提取所需的部分。此代码有点凌乱,但它可以工作:

sentence <- "December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm development model globally, BYLINE: By Yoon Ja-young"

Date <- as.character(sapply(strsplit(sentence, "LENGTH"), "[[",1))
Rows <- as.character(sapply(strsplit(sentence, "LENGTH"), "[[",2))
Length <- gsub(":","", as.character(sapply(strsplit(Rows, ","), "[[",1)))
Headline <- as.character(sapply(strsplit(as.character(sapply(strsplit(Rows, ","), "[[",2)), ":"), "[[",2))
Byline <- as.character(sapply(strsplit(as.character(sapply(strsplit(Rows, ","), "[[",3)), ":"), "[[",2))

句子我希望下面的解决方案是有帮助的。我确信更有效的方法是可能的,请查看
gsub
grep
stringr



资料


x首先重复定义测试数据——我们使用了问题中显示的两个数据实例。我们注意到,棘手的部分是,每个记录在问题中超过一行

读入
——用真实数据替换
文本连接(行)
,这是为了保持代码的自包含性,比如说用
“myfile.txt”

然后,第一个子
在每一行的开头插入一个空格,第二个子
在包含长度的任何行上用换行符、
日期:
、日期和
长度:
替换长度以下的所有内容。
gsub
在每个关键字前插入一个换行符,
paste
将所有关键字折叠成一个大的换行符分隔字符串
strsplit
再次将其拆分,以便我们添加的换行符生效

数据现在是DCF格式,因此我们可以使用
read.DCF
读取数据。DCF格式通过一个或多个空行分隔记录,并以字段名后跟冒号和空格后跟值开始每个字段。如果后续行缩进(例如,以空格开头),则该值可以运行到多行

这给出了一个有5列指示的矩阵。最后一个
sub
删除每个元素末尾的逗号,最后一个
gsub
用空格替换换行符

请注意,我们已将字段放在列中,这通常是R中表示数据的方式,但如果您确实希望将其放在行中,请使用
t(dcf)


更新:在输出中添加了日期。

下面是一个答案,它使用字符串拆分和一些正则表达式,所有这些都在基本R包中。只要数据始终以显示的格式显示,它就可以工作

data <- "December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~"

textParse <- function(dat){
    tmp <- strsplit(dat, ', ')[[1]]

    time <- as.Date(paste(tmp[1:2], collapse = ' '), format="%B %d %Y")

    len <- strsplit(gsub(".*LENGTH: (\\d+)", "\\1", dat), " ")[[1]][1]

    headline <- paste(strsplit(tmp[4], ' ')[[1]][2:length(strsplit(tmp[4], ' ')[[1]])], collapse = ' ')

    byline <- paste(strsplit(tmp[5], ' ')[[1]][3:length(strsplit(tmp[5], ' ')[[1]])], collapse = ' ')

    body <- paste(strsplit(tmp[6], ' ')[[1]][2:length(strsplit(tmp[6], ' ')[[1]])], collapse = ' ')

    return(as.data.frame(cbind(time, len, headline, byline, body)))
}

textParse(data)

编辑:请注意,R中的时间表示为“自1970-01-01以来的天数”的整数。

绝对是regex,请参见?regexpr或感谢您的评论!按列排序比按行排序更有意义。很好的解决方案。通常在数据处理中,字段是列,而不是行。
DF<-data.frame(do.call(rbind, strsplit(x, ",", fixed=TRUE)))
DF$X1 <- paste(DF$X1,DF$X2, sep = ",")    
new_df<-as.data.frame(lapply(DF, function(x) gsub(".*:", "", x)))
new_df<-subset(new_df, select = -X2)
colnames(new_df)<-c("Date","Length","Headline","ByLine","Other")
new_df
                       Date      Length                                            Headline
1   December 4, 2016 Sunday  1070 words  Korea presents new farm development model globally
2 Noveember 10, 2016 Friday  1070 words  Korea presents new farm development model globally
             ByLine Other
1  By Yoon Ja-young   ~~~
2  By Yoon Ja-young   ~~~
 x<- c("December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea
       presents new farm development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~",
      "Noveember 10, 2016 Friday, LENGTH: 1070 words, HEADLINE: Korea 
       presents new farm development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~")
# test data

Lines <- "December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm
development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~
December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm
development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~"

# code

L0 <- readLines(textConnection(Lines))
L <- sub("^", " ", L0)
L <- sub("(.*) LENGTH:", "\nDATE: \\1 LENGTH:", L)
L <- gsub("(\\w+:)", "\n\\1", L)
L <- paste(L, collapse = "\n")
L <- unlist(strsplit(L, "\n"))
dcf <- read.dcf(textConnection(L))
dcf[] <- sub(",$", "", dcf)
dcf[] <- gsub("\n", " ", dcf)
> dcf

     DATE                      LENGTH      
[1,] "December 4, 2016 Sunday" "1070 words"
[2,] "December 4, 2016 Sunday" "1070 words"
     HEADLINE                                             BYLINE            
[1,] "Korea presents new farm development model globally" "By Yoon Ja-young"
[2,] "Korea presents new farm development model globally" "By Yoon Ja-young"
     BODY 
[1,] "~~~"
[2,] "~~~"
data <- "December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~"

textParse <- function(dat){
    tmp <- strsplit(dat, ', ')[[1]]

    time <- as.Date(paste(tmp[1:2], collapse = ' '), format="%B %d %Y")

    len <- strsplit(gsub(".*LENGTH: (\\d+)", "\\1", dat), " ")[[1]][1]

    headline <- paste(strsplit(tmp[4], ' ')[[1]][2:length(strsplit(tmp[4], ' ')[[1]])], collapse = ' ')

    byline <- paste(strsplit(tmp[5], ' ')[[1]][3:length(strsplit(tmp[5], ' ')[[1]])], collapse = ' ')

    body <- paste(strsplit(tmp[6], ' ')[[1]][2:length(strsplit(tmp[6], ' ')[[1]])], collapse = ' ')

    return(as.data.frame(cbind(time, len, headline, byline, body)))
}

textParse(data)
 time   len                                            headline     byline
1 17139 1070 Korea presents new farm development model globally Yoon Ja-young
  body
1  ~~~