Переход от корпуса к отдельным файлам .txt в R's tm

У меня есть файл .csv с 6000 строк и 2 столбца. Я хотел бы записать каждую строку в виде отдельного текстового файла. Любые идеи относительно того, как это можно сделать в tm? Я попробовал writeCorpus(), но эта функция просто выдает 150 файлов .txt вместо 6000. Это проблема с памятью или я что-то не так делаю с кодом?

 library(tm)
 revs<-read.csv("dprpfinals.csv",header=TRUE)
 corp<-Corpus(VectorSource(revs$Review))
 writeCorpus(corp,path=".",filenames=paste(seq_along(revs),".txt",sep=""))

person monarque13    schedule 16.10.2014    source источник


Ответы (2)


Вот пример разделения текста на абзацы, удаления пустых строк и записи строк в текстовые файлы. Затем вам нужно будет обработать текстовые файлы.

txt="Argument split will be coerced to character, so you will see uses with split = NULL to mean split = character(0), including in the examples below.

Note that splitting into single characters can be done via split = character(0) ; the two are equivalent. The definition of 'character’ here depends on the locale: in a single-byte locale it is a byte, and in a multi-byte locale it is the unit represented by a ‘wide character’ (almost always a Unicode code point).

A missing value of split does not split the corresponding element(s) of x at all."

txt2<-data.frame(para = strsplit(txt, "\n")[[1]],stringsAsFactors=FALSE)
txt3<-txt2[txt2$para!="",]

npara = length(txt3)
for (ip in seq(1,npara)) {
  fname = paste("paragraph_",ip,".txt",sep="")
  fileConn<-file(fname)
  writeLines(txt3[ip], fileConn)
  close(fileConn)  
}
person Community    schedule 16.10.2014
comment
Спасибо. Это прекрасно работает, если я загружаю один текстовый файл, но как я могу заставить это работать со всем моим корпусом? Я получаю сообщение об ошибке Error in strsplit(txt, "\n") : non-character argument, когда пытаюсь сделать это через корпус - person monarque13; 16.10.2014
comment
Один из подходов к обработке корпуса состоит в том, чтобы модифицировать программу чтения для источника. Однако было бы проще следовать описанному выше подходу, а затем использовать DirSource для чтения всех файлов (абзацев). До команды corpus источник содержит содержимое, и его можно обрабатывать, как txt выше. - person ; 16.10.2014
comment
Я обновил свой код, чтобы увидеть, как я могу сделать то же самое с файлом csv. У меня есть файл csv с 6000 строками данных и двумя столбцами. столбец 1 имеет заголовок, а столбец 2 - полный текст. Но когда я пытаюсь запустить код в своем вопросе, он выдает только 150 файлов .txt вместо 6000. Есть идеи, что происходит? Ценится. - person monarque13; 17.10.2014

Для этого не нужно использовать tm, вот воспроизводимый пример, который создает файл CSV с 6000 строками и двумя столбцами, считывает его, а затем превращает в 6000 файлов txt.

Сначала подготовьте некоторые данные для примера...

# from http://hipsum.co/?paras=4&type=hipster-centric
txt <- "Brunch single-origin coffee photo booth, meggings fixie stumptown pickled mumblecore slow-carb aesthetic ennui Odd Future blog plaid Bushwick. Seitan keffiyeh hashtag Portland, kitsch irony authentic vegan post-ironic. Actually pop-up flexitarian kale chips ethical authentic, stumptown meggings. Photo booth Helvetica farm-to-table Neutra. Selfies blog swag, lomo viral meh chillwave distillery deep v Truffaut. Squid Cosby sweater irony, art party mustache Vice Wes Anderson Bushwick McSweeney's locavore roof party paleo. 3 wolf moon salvia gentrify, taxidermy street art banh mi Portland deep v small batch Truffaut."

# get n random samples of this paragraph
n <- 6000
txt_split <- unlist(strsplit(txt, split = " "))
txts <- sapply(1:n, function(i) paste(sample(txt_split, 10, replace = TRUE), 
                                             collapse  = " "))

# make dataframe then CSV file, two cols, n rows.
my_csv <- data.frame( col_one = 1:n,
                      col_two = txts)
write.csv(my_csv, "my_csv.csv", row.names = FALSE, quote = TRUE)

Теперь у нас есть файл CSV, который может быть похож на ваш, мы можем прочитать его в:

# Read in the CSV file...

x <- read.csv("my_csv.csv", header = TRUE, stringsAsFactors = FALSE)

И теперь мы можем записать каждую строку CSV-файла в отдельный текстовый файл (они появятся в вашем рабочем каталоге):

# Write each row of the CSV to a txt file
sapply(1:nrow(x), function(i) write.table(paste(x[i,], collapse = " "), 
                                          paste0("my_txt_", i, ".txt"), 
                                          col.names = FALSE, row.names = FALSE))

Если вы действительно хотите использовать tm, вы были на правильном пути, это отлично работает для меня:

# Read in the CSV file...
x <- read.csv("my_csv.csv", header = TRUE, stringsAsFactors = FALSE)
library(tm)
my_corpus <- Corpus(DataframeSource(x))
writeCorpus(my_corpus)

И ближе к вашему примеру у меня тоже отлично работает:

corp <- Corpus(VectorSource(x$col_one))
writeCorpus(corp)

Если это не работает для вас, это может быть что-то необычное в вашем CSV-файле, какие-то странные символы и так далее. Без более подробной информации о вашей конкретной проблеме трудно сказать.

person Ben    schedule 02.11.2014