SCM

SCM Repository

[tm] Diff of /pkg/R/corpus.R
ViewVC logotype

Diff of /pkg/R/corpus.R

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/R/trunk/R/textdoccol.R revision 18, Sat Nov 5 19:00:05 2005 UTC trunk/R/tm/R/textdoccol.R revision 46, Wed Jul 5 18:08:41 2006 UTC
# Line 1  Line 1 
1  # Author: Ingo Feinerer  # Author: Ingo Feinerer
2    
3  # S4 class definition  setGeneric("textdoccol", function(object, inputType = "CSV", stripWhiteSpace = FALSE, toLower = FALSE) standardGeneric("textdoccol"))
4  # Text document collection  setMethod("textdoccol",
5  # TODO: Define proper S4 term-document matrix            c("character"),
6  setClass("textdoccol", representation(docs = "list",            function(object, inputType = "CSV", stripWhiteSpace = FALSE, toLower = FALSE) {
7                                        tdm = "matrix"))                # Add a new type for each unique input source format
8                  type <- match.arg(inputType,c("CSV", "RCV1", "REUT21578", "RIS"))
9  # Accessor function                switch(type,
10  if (!isGeneric("docs")) {                       # Text in a special CSV format
11      if (is.function("docs"))                       # For details on the file format see the R documentation file
12          fun <- docs                       # The first argument is a directory with .csv files
13                         "CSV" = {
14                             filelist <- dir(object, pattern = ".csv", full.names = TRUE)
15                             tdl <- sapply(filelist,
16                                           function(file) {
17                                               m <- as.matrix(read.csv(file, header = FALSE))
18                                               l <- vector("list", dim(m)[1])
19                                               for (i in 1:dim(m)[1]) {
20                                                   author <- ""
21                                                   datetimestamp <- date()
22                                                   description <- ""
23                                                   id <- as.integer(m[i,1])
24                                                   corpus <- as.character(m[i,2:dim(m)[2]])
25                                                   if (stripWhiteSpace)
26                                                       corpus <- gsub("[[:space:]]+", " ", corpus)
27                                                   if (toLower)
28                                                       corpus <- tolower(corpus)
29                                                   origin <- "CSV"
30                                                   heading <- ""
31    
32                                                   l[[i]] <- new("textdocument", .Data = corpus, author = author, datetimestamp = datetimestamp,
33                                                                 description = description, id = id, origin = origin, heading = heading)
34                                               }
35                                               l
36                                           })
37                             if (length(filelist) > 1)
38                                 tdcl <- new("textdoccol", .Data = unlist(tdl, recursive = FALSE))
39                             else
40                                 tdcl <- new("textdoccol", .Data = tdl)
41                         },
42                         # Read in text documents in XML Reuters Corpus Volume 1 (RCV1) format
43                         # The first argument is a directory with the RCV1 XML files
44                         "RCV1" = {
45                             filelist <- dir(object, pattern = ".xml", full.names = TRUE)
46                             tdl <- sapply(filelist,
47                                           function(file) {
48                                               tree <- xmlTreeParse(file)
49                                               xmlApply(xmlRoot(tree), parseNewsItem, stripWhiteSpace, toLower)
50                                           })
51                             if (length(filelist) > 1)
52                                 tdcl <- new("textdoccol", .Data = unlist(tdl, recursive = FALSE))
53                             else
54                                 tdcl <- new("textdoccol", .Data = tdl)
55                         },
56                         # Read in text documents in Reuters-21578 XML (not SGML) format
57                         # Typically the first argument will be a directory where we can
58                         # find the files reut2-000.xml ... reut2-021.xml
59                         "REUT21578" = {
60                             filelist <- dir(object, pattern = ".xml", full.names = TRUE)
61                             tdl <- sapply(filelist,
62                                           function(file) {
63                                               tree <- xmlTreeParse(file)
64                                               xmlApply(xmlRoot(tree), parseReuters, stripWhiteSpace, toLower)
65                                           })
66                             if (length(filelist) > 1)
67                                 tdcl <- new("textdoccol", .Data = unlist(tdl, recursive = FALSE))
68      else      else
69          fun <- function(object) standardGeneric("docs")                               tdcl <- new("textdoccol", .Data = tdl)
70      setGeneric("docs", fun)                       },
71                         # Read in HTML documents as used by http://ris.bka.gv.at/vwgh
72                         "RIS" = {
73                             filelist <- dir(object, pattern = ".html", full.names = TRUE)
74                             tdl <- sapply(filelist,
75                                           function(file) {
76                                               # Ignore warnings from misformed HTML documents
77                                               suppressWarnings(RISDoc <- parseHTML(file, stripWhiteSpace, toLower))
78                                               if (!is.null(RISDoc)) {
79                                                   l <- list()
80                                                   l[[length(l) + 1]] <- RISDoc
81                                                   l
82  }  }
83  setMethod("docs", "textdoccol", function(object) object@docs)                                         })
84                             tdcl <- new("textdoccol", .Data = tdl)
85                         })
86                  tdcl
87              })
88    
89    # Parse an Austrian RIS HTML document
90    parseHTML <- function(file, stripWhiteSpace = FALSE, toLower = FALSE) {
91        author <- ""
92        datetimestamp <- date()
93        description <- ""
94    
95        tree <- htmlTreeParse(file)
96        htmlElem <- unlist(tree$children$html$children)
97    
98        if (is.null(htmlElem))
99            stop(paste("Empty document", file, "cannot be processed."))
100    
101        textElem <- htmlElem[which(regexpr("text.value", names(htmlElem)) > 0)]
102        names(textElem) <- NULL
103    
104        corpus <- paste(textElem, collapse = " ")
105    
106        year <- substring(corpus, regexpr("..../../", corpus), regexpr("..../../", corpus) + 3)
107        senat <- substring(corpus, regexpr("..../../", corpus) + 5, regexpr("..../../", corpus) + 6)
108        number <- substring(corpus, regexpr("..../../", corpus) + 8, regexpr("..../../", corpus) + 11)
109    
110  setGeneric("textdoccol", function(docs) standardGeneric("textdoccol"))      id <- as.integer(paste(year, senat, number, sep = ""))
 # Read in XML text documents  
 # Reuters Corpus Volume 1 (RCV1)  
 setMethod("textdoccol", "character", function(docs) {  
     require(XML)  
111    
112      tree <- xmlTreeParse(docs)      if (is.na(id))
113      root <- xmlRoot(tree)          stop(paste("Cannot extract 'Geschaeftszahl' out of malformed document", file))
114        origin <- ""
115    
116      # TODO: At each loop node points to the current newsitem      if (stripWhiteSpace)
117      node <- root          corpus <- gsub("[[:space:]]+", " ", corpus)
118        if (toLower)
119            corpus <- tolower(corpus)
120    
121      # TODO: Implement lacking fields.      heading <- ""
122      # For this we need the full RCV1 XML set to know where to find those things  
123        new("textdocument", .Data = corpus, author = author, datetimestamp = datetimestamp,
124            description = description, id = id, origin = origin, heading = heading)
125    }
126    
127    # TODO: Implement lacking fields as soon I have access to the original RCV1
128    # Parse a <newsitem></newsitem> element from a well-formed RCV1 XML file
129    parseNewsItem <- function(node, stripWhiteSpace = FALSE, toLower = FALSE) {
130      author <- "Not yet implemented"      author <- "Not yet implemented"
131      timestamp <- xmlAttrs(node)[["date"]]      datetimestamp <- xmlAttrs(node)[["date"]]
132      description <- "Not yet implemented"      description <- "Not yet implemented"
133      id <- as.integer(xmlAttrs(node)[["itemid"]])      id <- as.integer(xmlAttrs(node)[["itemid"]])
134      origin <- "Not yet implemented"      origin <- "Reuters Corpus Volume 1 XML"
135      corpus <- unlist(xmlApply(node[["text"]], xmlValue), use.names = FALSE)      corpus <- unlist(xmlApply(node[["text"]], xmlValue), use.names = FALSE)
136    
137        if (stripWhiteSpace)
138            corpus <- gsub("[[:space:]]+", " ", corpus)
139        if (toLower)
140            corpus <- tolower(corpus)
141    
142      heading <- xmlValue(node[["title"]])      heading <- xmlValue(node[["title"]])
143    
144      doc <- new("textdocument", author = author, timestamp = timestamp, description = description,      new("textdocument", .Data = corpus, author = author, datetimestamp = datetimestamp,
145                 id = id, origin = origin, corpus = corpus, heading = heading)          description = description, id = id, origin = origin, heading = heading)
146    }
147    
148      new("textdoccol", docs = list(doc), tdm = matrix())  # Parse a <REUTERS></REUTERS> element from a well-formed Reuters-21578 XML file
149  })  parseReuters <- function(node, stripWhiteSpace = FALSE, toLower = FALSE) {
150        # The <AUTHOR></AUTHOR> tag is unfortunately NOT obligatory!
151        if (!is.null(node[["TEXT"]][["AUTHOR"]]))
152            author <- xmlValue(node[["TEXT"]][["AUTHOR"]])
153        else
154            author <- ""
155    
156        datetimestamp <- xmlValue(node[["DATE"]])
157        description <- ""
158        id <- as.integer(xmlAttrs(node)[["NEWID"]])
159    
160        origin <- "Reuters-21578 XML"
161    
162        # The <BODY></BODY> tag is unfortunately NOT obligatory!
163        if (!is.null(node[["TEXT"]][["BODY"]]))
164            corpus <- xmlValue(node[["TEXT"]][["BODY"]])
165        else
166            corpus <- ""
167    
168        if (stripWhiteSpace)
169            corpus <- gsub("[[:space:]]+", " ", corpus)
170        if (toLower)
171            corpus <- tolower(corpus)
172    
173        # The <TITLE></TITLE> tag is unfortunately NOT obligatory!
174        if (!is.null(node[["TEXT"]][["TITLE"]]))
175            heading <- xmlValue(node[["TEXT"]][["TITLE"]])
176        else
177            heading <- ""
178    
179        new("textdocument", .Data = corpus, author = author, datetimestamp = datetimestamp,
180            description = description, id = id, origin = origin, heading = heading)
181    }

Legend:
Removed from v.18  
changed lines
  Added in v.46

root@r-forge.r-project.org
ViewVC Help
Powered by ViewVC 1.0.0  
Thanks to:
Vienna University of Economics and Business Powered By FusionForge