如何抓取网页内容然后计算R中的单词频率?

时间:2013-11-08 04:33:46

标签: r web-scraping text-mining tm

这是我的代码:

library(XML)
library(RCurl)
url.link <- 'http://www.jamesaltucher.com/sitemap.xml'
blog <- getURL(url.link)
blog          <- htmlParse(blog, encoding = "UTF-8")
titles  <- xpathSApply (blog ,"//loc",xmlValue)             ## titles

traverse_each_page <- function(x){
  tmp <- htmlParse(x)
  xpathApply(tmp, '//div[@id="mainContent"]')
}
pages <- lapply(titles[2:3], traverse_each_page)

这是伪代码:

  1. 获取xml文档:http://www.jamesaltucher.com/sitemap.xml
  2. 转到每个链接
  3. 解析每个链接的html内容
  4. 提取div id="mainContent"
  5. 中的文字
  6. 计算所有文章显示的每个单词的频率,不区分大小写。
  7. 我已设法完成步骤1-4。我需要一些帮助。 5。

    基本上,如果“the”这个词在第1条中出现两次,在第2条中出现5次。我想知道“the”在2篇文章中总共出现了7次。

    另外,我不知道如何查看我提取到pages的内容。我想学习如何查看内容,以便我更容易调试。

2 个答案:

答案 0 :(得分:5)

你走了,从头到尾。我改变了你的网络抓取代码,所以它得到的文本更少,然后在底部是字数。

以下是您下载网址的代码......

library(XML)
library(RCurl)
url.link <- 'http://www.jamesaltucher.com/sitemap.xml'
blog <- getURL(url.link)
blog          <- htmlParse(blog, encoding = "UTF-8")
titles  <- xpathSApply (blog ,"//loc",xmlValue)             ## titles

我已将您的功能更改为从每个页面中提取文字...

traverse_each_page <- function(x){
  tmp <- htmlParse(getURI(x))
  xpathSApply(tmp, '//div[@id="mainContent"]', xmlValue)
}
pages <- sapply(titles[2:3], traverse_each_page)

让我们删除换行符和其他非文本字符......

nont <- c("\n", "\t", "\r")
pages <- gsub(paste(nont,collapse="|"), " ", pages)

关于你的第二个问题,要检查pages中的内容,只需在控制台输入:

pages

现在让我们执行您的步骤5'计算所有文章显示的每个单词的频率,不区分大小写。'

require(tm)
# convert list into corpus 
mycorpus <- Corpus(VectorSource(pages))
# prepare to remove stopwords, ie. common words like 'the'
skipWords <- function(x) removeWords(x, stopwords("english"))
# prepare to remove other bits we usually don't care about
funcs <- list(tolower, removePunctuation, removeNumbers, stripWhitespace, skipWords)
# do it
a <- tm_map(mycorpus, FUN = tm_reduce, tmFuns = funcs)
# make document term matrix
mydtm <- DocumentTermMatrix(a, control = list(wordLengths = c(3,10)))

在这里,您可以看到每个文档的每个单词的数量

inspect(mydtm)
# you can assign it to a data frame for more convenient viewing
my_df <- inspect(mydtm)
my_df

以下是如何计算所有文章中出现的每个单词的总频率,不区分大小写......

apply(mydtm, 2, sum)

这会回答你的问题吗?我猜你可能真的只对最频繁的单词感兴趣(如@ buruzaemon的答案细节),或者某个单词子集,但这是另一个问题......

答案 1 :(得分:4)

您应该查看R tm包。晕影是heretm拥有处理语料库和构建术语 - 文档矩阵所需的一切。

原则上,这将需要:

  1. 从您的数据中创建Corpus,可能会丢弃标点符号,数字,停用词
  2. 根据您正在做的事情,从您的TermDocumentMatrix或语料库中创建Corpus
  3. as.matrix上使用TermDocumentMatrix,并在原始矩阵上执行rowSums以获取字数
  4. 以下是一段简短的代码段:

    library(tm)
    
    ctrl <- list(stopwords=T,
                 removePunctuation=T,
                 removeNumbers=T)
    
    # assuming your data is in some dataframe already...
    corpus1 <- Corpus(DataframeSource(...))    
    corpus2 <- Corpus(DataframeSource(...))
    
    corp.all <- c(corpus1, corpus2)
    
    tdm <- TermDocumentMatrix(corp.all, ctrl)
    tdm.m <- as.matrix(tdm)
    
    counts <- rowSums(tdm.m)
    
    my.model <- data.frame(cbind(names(counts), as.numeric(counts)),
                           stringsAsFactors=F)
    
    names(my.model) <- c('term', 'frequency')
    
    my.model$frequency <- as.numeric(my.model$frequency)
    
    head(my.model[with(my.model, order(-frequency)),], 20)
    

    我认为你可能想放弃stop words喜欢“the”,因为它们往往非常频繁,因此不是很重要。有关文本挖掘的更多详细信息,请参阅此CrossValidated question thread