从 R 中的许多 html 文件创建语料库
Posted
技术标签:
【中文标题】从 R 中的许多 html 文件创建语料库【英文标题】:create a Corpus from many html files in R 【发布时间】:2013-02-07 14:46:04 【问题描述】:我想为下载的 html 文件的集合创建一个语料库,然后在 R 中读取它们以供将来进行文本挖掘。
基本上,这就是我想要做的:
从多个 html 文件创建语料库。我尝试使用 DirSource:
library(tm)
a<- DirSource("C:/test")
b<-Corpus(DirSource(a), readerControl=list(language="eng", reader=readPlain))
但它返回“无效的目录参数”
一次性从 Corpus 中读取 html 文件。 不知道该怎么做。
解析它们,将它们转换为纯文本,删除标签。 许多人建议使用 XML,但是,我没有找到处理多个文件的方法。它们都用于一个文件。
非常感谢。
【问题讨论】:
尝试在 DirSource 调用中使用反斜杠而不是正斜杠。C:\test
Corpus
和 DirSource
命令是什么包?
【参考方案1】:
应该这样做。在这里,我的计算机上有一个 HTML 文件文件夹(来自 SO 的随机样本),我用它们制作了一个语料库,然后是一个文档术语矩阵,然后完成了一些琐碎的文本挖掘任务。
# get data
setwd("C:/Downloads/html") # this folder has your HTML files
html <- list.files(pattern="\\.(htm|html)$") # get just .htm and .html files
# load packages
library(tm)
library(RCurl)
library(XML)
# get some code from github to convert HTML to text
writeChar(con="htmlToText.R", (getURL(ssl.verifypeer = FALSE, "https://raw.github.com/tonybreyal/Blog-Reference-Functions/master/R/htmlToText/htmlToText.R")))
source("htmlToText.R")
# convert HTML to text
html2txt <- lapply(html, htmlToText)
# clean out non-ASCII characters
html2txtclean <- sapply(html2txt, function(x) iconv(x, "latin1", "ASCII", sub=""))
# make corpus for text mining
corpus <- Corpus(VectorSource(html2txtclean))
# process text...
skipWords <- function(x) removeWords(x, stopwords("english"))
funcs <- list(tolower, removePunctuation, removeNumbers, stripWhitespace, skipWords)
a <- tm_map(a, PlainTextDocument)
a <- tm_map(corpus, FUN = tm_reduce, tmFuns = funcs)
a.dtm1 <- TermDocumentMatrix(a, control = list(wordLengths = c(3,10)))
newstopwords <- findFreqTerms(a.dtm1, lowfreq=10) # get most frequent words
# remove most frequent words for this corpus
a.dtm2 <- a.dtm1[!(a.dtm1$dimnames$Terms) %in% newstopwords,]
inspect(a.dtm2)
# carry on with typical things that can now be done, ie. cluster analysis
a.dtm3 <- removeSparseTerms(a.dtm2, sparse=0.7)
a.dtm.df <- as.data.frame(inspect(a.dtm3))
a.dtm.df.scale <- scale(a.dtm.df)
d <- dist(a.dtm.df.scale, method = "euclidean")
fit <- hclust(d, method="ward")
plot(fit)
# just for fun...
library(wordcloud)
library(RColorBrewer)
m = as.matrix(t(a.dtm1))
# get word counts in decreasing order
word_freqs = sort(colSums(m), decreasing=TRUE)
# create a data frame with words and their frequencies
dm = data.frame(word=names(word_freqs), freq=word_freqs)
# plot wordcloud
wordcloud(dm$word, dm$freq, random.order=FALSE, colors=brewer.pal(8, "Dark2"))
【讨论】:
不错。只需在list.files(...)
中添加参数pattern=".html"
,这样文件夹内就可以有其他文件(eg R 脚本来下载数据、README 和任何其他非 html 文件,当然带有“ html”在他们的名字中。
为了让它与 tm 0.6 一起使用,请将您的语料库转换为 PlainTextDocument,否则您将无法创建 TDM。做一个
【参考方案2】:
这将纠正错误。
b<-Corpus(a, ## I change DireSource(a) by a
readerControl=list(language="eng", reader=readPlain))
但我认为要阅读您的 Html,您需要使用 xml 阅读器。类似的东西:
r <- Corpus(DirSource('c:\test'),
readerControl = list(reader = readXML),spec)
但您需要提供 spec 参数,这取决于您的文件结构。
参见例如readReut21578XML
。这是一个很好的xml/html解析器示例。
【讨论】:
【参考方案3】:要将所有 html 文件读入 R 对象,您可以使用
# Set variables
folder <- 'C:/test'
extension <- '.htm'
# Get the names of *.html files in the folder
files <- list.files(path=folder, pattern=extension)
# Read all the files into a list
htmls <- lapply(X=files,
FUN=function(file)
.con <- file(description=paste(folder, file, sep='/'))
.html <- readLines(.con)
close(.con)
names(.html) <- file
.html
)
这会给你一个列表,每个元素都是每个文件的 HTML 内容。
我稍后会在解析它时发布,我很着急。
【讨论】:
【参考方案4】:我发现 boilerpipeR 包对于仅提取 html 页面的“核心”文本特别有用。
【讨论】:
以上是关于从 R 中的许多 html 文件创建语料库的主要内容,如果未能解决你的问题,请参考以下文章
如何在创建实例时将文件夹从 S3 复制到弹性 beanstalk 实例
使用 R 中的 tm 包为多个语料库制作前 N 个频繁项的数据框