2013-02-22 7 views
6

Ich möchte ein Corpus für die Sammlung von heruntergeladenen HTML-Dateien erstellen, und lesen Sie sie in R für zukünftige Text Mining.Erstellen Sie ein Corpus aus vielen HTML-Dateien in R

Im Wesentlichen ist es das, was ich tun möchte:

  • erstellen Corpus aus mehreren HTML-Dateien.

Ich versuchte DirSource zu verwenden:

library(tm) 
a<- DirSource("C:/test") 
b<-Corpus(DirSource(a), readerControl=list(language="eng", reader=readPlain)) 

aber es gibt "ungültige Verzeichnis-Parameter"

  • lesen in HTML-Dateien aus dem auf einmal Corpus. Nicht sicher, wie es geht.

  • Parsen Sie sie, konvertieren Sie sie in Nur-Text, entfernen Sie Tags. Viele Leute haben vorgeschlagen, XML zu verwenden. Ich habe jedoch keine Möglichkeit gefunden, mehrere Dateien zu verarbeiten. Sie sind alle für eine einzige Datei.

Vielen Dank.

+0

Verwenden Sie in Ihrem DirSource-Aufruf einen umgekehrten Schrägstrich anstelle eines Schrägstrichs. 'C: \ test' –

+0

Welches Paket sind' Corpus'- und 'DirSource'-Befehle? –

Antwort

2

Dies wird den Fehler korrigieren.

b<-Corpus(a, ## I change DireSource(a) by a 
      readerControl=list(language="eng", reader=readPlain)) 

Aber ich denke, um Ihre HTML zu lesen, müssen Sie XML-Reader verwenden. Etwas wie:

r <- Corpus(DirSource('c:\test'), 
      readerControl = list(reader = readXML),spec) 

Aber Sie müssen das spec-Argument liefern, das mit Ihrer Dateistruktur abhängt. siehe zum Beispiel readReut21578XML. Es ist ein gutes Beispiel für XML/HTML-Parser.

0

Um alle HTML-Dateien in ein R-Objekt lesen Sie

# 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 
}) 

verwenden können, dass Sie eine Liste geben, und jedes Element der HTML-Inhalt jeder Datei.

Ich poste später es zu analysieren, ich habe es eilig.

11

Dies sollte es tun. Hier habe ich einen Ordner auf meinem Computer mit HTML-Dateien (eine zufällige Stichprobe von SO) und ich habe daraus einen Korpus erstellt, dann eine Dokument-Term-Matrix und dann ein paar triviale Text-Mining-Aufgaben.

# 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) 

enter image description here

# 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")) 

enter image description here

+1

Schön. Fügen Sie einfach den Parameter 'pattern =". Html "' in 'list.files (...)' hinzu, so dass andere Dateien innerhalb des Ordners (* z. B.* R-Skript zum Herunterladen von Daten, README und anderen nicht-HTML-Dateien, außer natürlich Dateien mit "html" in ihren Namen. –

+0

Danke, guter Tipp. Ich habe das entsprechend bearbeitet. – Ben

+0

Um dies mit tm 0.6 zu erreichen, konvertieren Sie Ihren Korpus in PlainTextDocument, ansonsten können Sie kein TDM erstellen. Machen Sie eine <- tm_map (a, PlainTextDocument) – viksit

0

ich das Paket boilerpipeR besonders nützlich fanden nur den "Kern" Text einer HTML-Seite zu extrahieren.

Verwandte Themen