Извлечение первой строки нескольких текстовых документов и сохранение в виде метаданных/вектора в R

Я новичок в R и в настоящее время работаю с пакетом Quanteda для анализа текста. Для тематических моделей с течением времени мне нужны метаданные в текстовых файлах, с которыми я работаю. Первая строка каждого из моих документов содержит дату, которую я хотел бы извлечь таким образом, чтобы она была связана с документом. Я могу извлечь дату из первой строки документа, которая имеет следующую структуру «дата: 23/04/1980», используя следующий код:

fileName <- "C:/Users/fischer/project/_Los_Angeles_Times_The_New_York_Times_The_Was2018-01-14_01-01.txt"
mytxt <- readChar(fileName, file.info(fileName)$size)
regmatches(extracted_texts, regexec("date:",extracted_texts))
date<-regmatches(extracted_texts, gregexpr(
  "date:[0-9]{2}/[0-9]{2}/[0-9]{4}", extracted_texts))

R возвращает "дата: 23.04.1980"

Чего я не могу добиться, так это применить это к нескольким документам в моем каталоге и сохранить вывод в виде переменной/вектора, что позволяет мне использовать его в качестве метаданных для функций пакета quenteda.


person Andreas K    schedule 04.08.2018    source источник


Ответы (1)


Вы можете найти один вариант сделать то, что вы хотите ниже. В зависимости от количества и размера ваших документов вам, возможно, придется обрабатывать документы последовательно, и вы не сможете сохранить их сразу в списке. Если приведенный ниже подход не работает для вас, я могу предоставить вам альтернативу.

# create some sample docs and write them in the working directory as txt files
docs = list(
  doc1 = c("abc2000", "def")
  ,doc2 = c("ghi2001", "jkl")
  ,doc3 = c("mno2002", "pqr")
)
for (i in names(docs)) {
  writeLines(docs[[i]], paste0(i, ".txt"))
}
# read the documents with the specified doc name into a list
# use list.files with a pattern for this, maybe with fullnames = TRUE in your case
# you can use the side effect of sapply/USE.NAMES, to generate a named list
# you might set n = 1 in readLines to only read the first line
# since you probably read in the full document at a certain point in your code
# here the full text example is read in
docs = sapply(list.files(pattern = "^doc\\d.txt$"), readLines, USE.NAMES = T, simplify = F)
# then access the first element of each list and apply your extraction function
# as an example I simply extract digits
lapply(docs, function(x) {
  first_line = x[1]
  gsub("\\D", "", first_line)
})
# $`doc1.txt`
# [1] "2000"
# 
# $doc2.txt
# [1] "2001"
# 
# $doc3.txt
# [1] "2002"
person Manuel Bickel    schedule 04.08.2018