如何选择R中的部分文本

时间:2016-03-03 13:54:12

标签: r text-mining

我有一个HTML文件,其中包含5篇不同的文章,我想在R中分别提取这些文章中的每一篇并对每篇文章进行一些分析。每篇文章都以< doc>开头,以< /doc>结尾,并且还有一个文档编号。例如:

<doc>
<docno> NA123455-0001 </docno>
<docid> 1 </docid>
<p>
NASA one-year astronaut Scott Kelly speaks after coming home to Houston on  
March 3, 2016. Behind Kelly, 
from left to right: U.S. Second Lady Jill Biden; Kelly's identical in      
brother, Mark; 
John Holdren, Assistant to the President for Science and ...
</p>
</doc>
<doc>
<docno> KA25637-1215 </docno>
<docid> 65 </docid>
<date>
<p>
February 1, 2014, Sunday 
</p>
</date>
<section>
<p>
WASHINGTON -- Former Republican presidential nominee Mitt Romney 
is charging into the increasingly divisive 2016 GOP 
White House sweepstakes Thursday with a harsh takedown of front-runner 
Donald Trump, calling him a "phony" and exhorting fellow 
</p>
</type>
</doc>
<doc>
<docno> JN1234567-1225 </docno>
<docid> 67 </docid>
<date>
<p>
March 5, 2003
</p>
</date>
<section>
<p>
SEOUL—New U.S.-led efforts to cut funding for North Korea's nuclearweapons
program through targeted 
sanctions risk faltering because of Pyongyang's willingness to divert all
available resources to its 
military, even at the risk of economic collapse ...
</p>
</doc>

我已使用readLines()函数上传了网址,并使用

将所有行合并在一起
 articles<- paste(articles, collapse=" ")

我想选择< doc>..< /doc>之间的第一篇文章,并将其分配给article1,将第二篇文章分配给article2,依此类推。

您能否建议如何构建该功能,以便分别选择这些文章中的每一篇?

2 个答案:

答案 0 :(得分:1)

您可以使用strsplit,它会在您提供的任何文本或正则表达式上拆分字符串。它将为您提供一个列表,其中包含分割字符串之间字符串的每个部分的一个项目,如果您愿意,可以将其子集化为不同的变量。 (如果您愿意,也可以使用其他正则表达式函数。)

splitArticles <- strsplit(articles, '<doc>')

你仍然需要删除</doc>标签(如果你只是想要文本,还有很多其他的标签),但这只是一个开始。

执行相同操作的更典型方法是使用包进行html抓取/解析。使用rvest包,您需要类似

的内容
library(rvest)
read_html(articles) %>% html_nodes('doc') %>% html_text()

将为您提供<doc>标签内容的字符向量。可能需要更多清洁,特别是如果您需要清理空白字符。仔细挑选您的选择器html_nodes可能会帮助您避免这种情况;看起来如果您使用p代替doc,则更有可能获得该文字。

答案 1 :(得分:0)

最简单的解决方案是使用strsplit

art_list <- strsplit(s, "<doc>")
art_list <- art_list[art_list != ""]
ids <- gsub(".*<docid>|</docid>.*", "", art_list[[i]]  )
ids <- ids[ids != ""]
for (i in 1: length(unlist(art_list)) ){
assign( paste("article",  ids[i], sep = "_") ,  gsub(".*<doc>|</doc>.*", "", unlist(art_list)  )[i] )}