【问题标题】:Improving Nested sapply Efficiency提高嵌套 sapply 效率
【发布时间】:2014-10-09 14:01:04
【问题描述】:

我想知道是否有更有效的方法来实现我的目标。我目前正在编写一个蜘蛛算法来每天早上获取新闻报道,我想过滤首页的初始链接以忽略我不关心的内容。

您可以使用以下代码生成可重现的示例:

library(RCurl)
library(XML)
opts = list(
  proxy = "***.***.***.***", #insert your proxy
  proxyusername = "domain\\username",
  proxypassword = "password",
  proxyport = ****) #insert your port number
links <- 'http://www.cnn.com'
xpaths <- c('//ul[@id="us-menu"]//a', '//div[@id="cnn_maint1lftf"]//a', '//div[@id="cnn_maintt2bul"]//a', '//div[@id="cnn_maintoplive"]//a')
response <- getURL('www.cnn.com', .opts=opts)
doc <- htmlParse(response)
for (xpath in xpaths) {
  li <- getNodeSet(doc, xpath)
  links <- c(links, sapply(li, xmlGetAttr, 'href'))
}
links <- links[!duplicated(links)]
links <- links[-1]

这是我希望提高效率的代码:

bad.words <- c('video', 'travel', 'living', 'health', 'ireport', 'bleacher', 'showbiz', 'mcafee')
t.1 <- sapply(links, function(x) sapply(bad.words, function(z) any(length(grep(z, x, ignore.case=T)) > 0)))
t.1 <- unname(t.1)
t.1 <- colSums(t.1)
links <- links[!t.1]

我必须假设有比这更清洁、更有效的方法来实现我的目标。有什么想法吗?

【问题讨论】:

  • 您的示例不太可重现。在getURL() 中找不到对象opts
  • 啊,谢谢@RichardScriven。我已经编辑了问题以纠正这一点。

标签: r performance algorithm


【解决方案1】:

在这种情况下,您可以使用正则表达式。重要的是您的坏词列表没有任何“特殊”正则表达式字符,例如句点或其他标点符号。但如果是这种情况,您可以将它们粘贴在一起并在一个 grep 中完成所有操作。我们只是通过将所有单词与“或”运算符粘贴在一起来创建正则表达式。

bad.words <- c('video', 'travel', 'living', 'health', 
    'ireport', 'bleacher', 'showbiz', 'mcafee')

re <- paste0("\\b(",paste(bad.words, collapse="|"),")\\b")

links <- links[ !grepl(re, links) ]

我们还添加了边界匹配 \b 以确保我们匹配完整的单词。但这意味着它不会匹配“视频”之类的内容,因此请确保这是您想要的。

【讨论】:

  • 这正是我正在寻找的解决方案类型。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
相关资源
最近更新 更多