3

这是我的代码:

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. 计算所有文章中每个单词出现的频率,不区分大小写。

我已成功完成步骤 1-4。我需要一些帮助,没有。5.

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

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

4

2 回答 2

5

给你,从头到尾。我更改了您的网页抓取代码,因此它可以减少非文本内容,然后底部是字数。

这是您下载 URL 的代码...

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 的回答细节),或者某个词的子集,但这是另一个问题......

于 2013-11-08T05:45:37.687 回答
4

你应该看看 Rtm包。小插曲在这里tm拥有处理语料库和构建术语文档矩阵所需的一切。

原则上,这将需要:

  1. 从您的数据中创建一个Corpus,可能会丢弃标点符号、数字、停用词
  2. TermDocumentMatrix从您的或语料库创建一个Corpus,具体取决于您在做什么
  3. as.matrix在你的TermDocumentMatrix, 和你的原始矩阵上使用rowSums来获得字数

以下是一个简短的代码片段作为示例:

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)

我认为您可能想要丢弃像“the”这样的停用词,因为它们往往非常频繁,因此不是很重要。更多关于文本挖掘的详细信息可以从这个CrossValidated question thread中找到。

于 2013-11-08T04:39:54.963 回答