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

时间:2017-01-26 13:42:36

标签: r split extract sentence

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

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

  

2016年12月4日星期日,长度:(正文长度),HEADLINE :(   文章标题),BYLINE :(记者姓名),BODY :(正文)

我将所有文本都放在一行中。(所以我认为将文章结构视为字符串是可能的。)

在这种格式中,如何提取LENGTH,HEADLINE,BYLINE值并制作数据框?

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

4 个答案:

答案 0 :(得分:1)

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

阅读Lines - 使用真实数据替换textConnection(Lines),以保持代码自包含,例如{。}}。

然后第一个"myfile.txt"在每行的开头插入一个空格,第二个替换所有内容,包括LENGTH:在任何包含LENGTH的行:with newline,sub,date和{ {1}}。 DATE:在每个关键字前插入换行符,LENGTH:将其全部折叠为一个大的换行符分隔字符串。 gsub再次将其拆分,以便我们添加的换行符生效。

数据现在采用DCF格式,因此我们可以使用paste来读取数据。 DCF格式通过一个或多个空行分隔记录,并使用字段名称后跟冒号和空格后跟值开始每个字段。如果后续行是缩进的,则该值可以在多行上运行,例如,从一个空间开始。

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

请注意,我们已将字段放在列中,这通常是表示R中数据的方式,但如果您确实想要它在行中,请使用sub

gsub

这给出了以下5列字符矩阵:

t(dcf)

更新:添加了输出日期。

答案 1 :(得分:0)

这可能是一个开始:使用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))

然后在数据框中收集行:

  Df <- data.frame(Date, Length, Headline, Byline)  

答案 2 :(得分:0)

我希望下面的解决方案很有帮助。我相信更有效的方式,请查看gsubgrepstringr

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: ~~~")

更新:正如@ G.Grothendieck的评论中所述,将解决方案更改为将列显示为字段。

答案 3 :(得分:0)

这是一个在基本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)

输出:

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

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

相关问题