【问题标题】:chunking txt files in R在R中分块txt文件
【发布时间】:2017-03-06 21:58:20
【问题描述】:

所有,

我正在编写 Matthew Jockers 在他的“使用 R 进行文本分析为文学学生”一书中的代码。

在其中,他提供了从 XML 文档中提取所有 <p> 标记的代码,将内容分成 1000 个单词的块并应用一堆数据按摩技巧。完成后,他将该分块函数插入到一个循环中,该循环生成一个可以在 mallet 中使用的数据矩阵。请看下面的代码。

我的问题是,我如何对 .txt 文件做同样的事情?显然,文本文件没有像<p> 这样的属性可以使用。我不是一个有经验的程序员,所以请放轻松!!!


chunk.size <- 1000 #number of words per chunk
makeFlexTextChunks <- function(doc.object, chunk.size=1000,  percentage=TRUE){

paras <- getNodeSet(doc.object,
                  "/d:TEI/d:text/d:body//d:p",
                  c(d = "http://www.tei-c.org/ns/1.0"))
words <- paste(sapply(paras,xmlValue), collapse=" ")
words.lower <- tolower(words)
words.lower <- gsub("[^[:alnum:][:space:]']", " ", words.lower)
words.l <- strsplit(words.lower, "\\s+")
word.v <- unlist(words.l)
x <- seq_along(word.v)
if(percentage){
max.length <- length(word.v)/chunk.size
chunks.l <- split(word.v, ceiling(x/max.length))
  } else {
chunks.l <- split(word.v, ceiling(x/chunk.size))
#deal with small chunks at the end
if(length(chunks.l[[length(chunks.l)]]) <=
   length(chunks.l[[length(chunks.l)]])/2){
  chunks.l[[length(chunks.l)-1]] <-
    c(chunks.l[[length(chunks.l)-1]],
      chunks.l[[length(chunks.l)]])
  chunks.l[[length(chunks.l)]] <- NULL
}
}
chunks.l <- lapply(chunks.l, paste, collapse=" ")
chunks.df <- do.call(rbind, chunks.l)
return(chunks.df)
}


topic.m <- NULL
for(i in 1:length(files.v)){
doc.object <- xmlTreeParse(file.path(input.dir, files.v[i]),
                         useInternalNodes=TRUE)
chunk.m <- makeFlexTextChunks(doc.object, chunk.size,
                            percentage=FALSE)
textname <- gsub("\\..*","", files.v[i])
segments.m <- cbind(paste(textname,
                        segment=1:nrow(chunk.m), sep="_"), chunk.m)
topic.m <- rbind(topic.m, segments.m)
}

【问题讨论】:

    标签: r text topic-modeling


    【解决方案1】:

    感谢大家的帮助。我想我经过多次试验和错误找到了答案!关键是在循环而不是函数中使用 scan(paste(input.dir, files.v[i], sep="/") 拉取 txt 文件。请在此处查看我的代码:

    input.dir <- "data/plainText"
    files.v <- dir(input.dir, ".*txt")
    chunk.size <- 100 #number of words per chunk
    makeFlexTextChunks <- function(doc.object, chunk.size=100,  percentage=TRUE){
    words.lower <- tolower(paste(doc.object, collapse=" "))
    words.lower <- gsub("[^[:alnum:][:space:]']", " ", words.lower)
    words.l <- strsplit(words.lower, "\\s+")
    word.v <- unlist(words.l)
    x <- seq_along(word.v)
    
    if(percentage){
    max.length <- length(word.v)/chunk.size
    chunks.l <- split(word.v, ceiling(x/max.length))
    }  
    else {
    chunks.l <- split(word.v, ceiling(x/chunk.size))
    #deal with small chunks at the end
    if(length(chunks.l[[length(chunks.l)]]) <=
       length(chunks.l[[length(chunks.l)]])/2){
      chunks.l[[length(chunks.l)-1]] <-
        c(chunks.l[[length(chunks.l)-1]],
          chunks.l[[length(chunks.l)]])
      chunks.l[[length(chunks.l)]] <- NULL
     }
    }
    chunks.l <- lapply(chunks.l, paste, collapse=" ")
    chunks.df <- do.call(rbind, chunks.l)
    return(chunks.df)
    }
    
    topic.m <- NULL
    for(i in 1:length(files.v)){
    doc.object <- scan(paste(input.dir, files.v[i], sep="/"), what="character", sep="\n")
    chunk.m <- makeFlexTextChunks(doc.object, chunk.size, percentage=FALSE)
    textname <- gsub("\\..*","", files.v[i])
    segments.m <- cbind(paste(textname, segment=1:nrow(chunk.m), sep="_"), chunk.m)
    topic.m <- rbind(topic.m, segments.m)
    }
    

    【讨论】:

      【解决方案2】:

      也许这可以为您指明正确的方向。以下代码读取一个 txt 文件 a 将单词拆分为向量的元素。

      library(readr)
      library(stringr)
      
      url <- "http://www.gutenberg.org/files/98/98-0.txt"
      mystring <- read_file(url)
      res <- str_split(mystring, "\\s+")
      

      然后你可以把它分成 1000 个单词的块并施展你的魔法?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        相关资源
        最近更新 更多