Ошибка «подписи вне границ» в str_extract_all - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь извлечь информацию о дате из нескольких текстовых файлов, используя str_extract_all.Если я делаю один файл, он работает нормально.Но когда я вставляю его в цикл for, он выдает мне эту ошибку.

Я уже пробовал «в любое время», и это не работает, и ни один из других основных инструментов извлечения времени не работает.

Вот часть кода, которая доставляет мне неприятности:

file.names <- list.files(path = "C:/Users/jwils/Documents/R/win-library/3.6/CNN_files/AC360",  pattern = "txt$")

for(i in 1:length(file.names)){

named <- read.table(file.names[i], header=FALSE, sep="", fill = TRUE)

renamed <- corpus(file.names[i])

date <- str_extract_all(texts(renamed)
                        , "(\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Oct(?:ober)?|Dec(?:ember)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|(\\b(?:JAN(?:UARY)?|FEB(?:RUARY)?|MAR(?:CH)?|APR(?:IL)?|MAY|JUN(?:E)?|JUL(?:Y)?|AUG(?:UST)?|SEP(?:TEMBER)?|NOV(?:EMBER)?|OCT(?:OBER)?|DEC(?:EMBER)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\\s+\\d{1,2},\\s+\\d{4})|(\\b(JAN(UARY)?|FEB(RUARY)?|MAR(CH)?|APR(IL)?|MAY|JUN(E)?|JUL(Y)?|AUG(UST)?|SEP(TEMBER)?|OCT(OBER)?|NOV(EMBER)?|DEC(EMBER)?)\\s+\\d{1,2},\\s+\\d{4})"
                        , simplify = TRUE)[,1]
}

Я ожидаю, что этот код извлечет дату из серии текстовых файлов, которые выглядят как

"Дата Передача 12 декабря 2018 года в текстовом виде - набор текста из стенограммы"

То, что я получаю, это сообщение об ошибке "индекс за пределами границ".Я не знаю, что это значит.Как я уже сказал, он работает с одним файлом, но не в цикле.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 10 июля 2019

Это связано с тем, что вы не получили ожидаемый результат с помощью операции индекса [, 1].Если один из файлов не содержит совпадения, то в цикле он вернет пустой скаляр, который не может быть проиндексирован таким образом.

Вот более простой способ: используйте readtext для вводафайлы.

library("quanteda")
library("stringr")

corp <- readtext::readtext("C:/Users/jwils/Documents/R/win-library/3.6/CNN_files/AC360/*.txt") %>%
    corpus()

docvars(corp, "date") <- 
    str_extract_all(texts(corp),
                    "(\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Oct(?:ober)?|Dec(?:ember)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|(\\b(?:JAN(?:UARY)?|FEB(?:RUARY)?|MAR(?:CH)?|APR(?:IL)?|MAY|JUN(?:E)?|JUL(?:Y)?|AUG(?:UST)?|SEP(?:TEMBER)?|NOV(?:EMBER)?|OCT(?:OBER)?|DEC(?:EMBER)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\\s+\\d{1,2},\\s+\\d{4})|(\\b(JAN(UARY)?|FEB(RUARY)?|MAR(CH)?|APR(IL)?|MAY|JUN(E)?|JUL(Y)?|AUG(UST)?|SEP(TEMBER)?|OCT(OBER)?|NOV(EMBER)?|DEC(EMBER)?)\\s+\\d{1,2},\\s+\\d{4})"
                    simplify = TRUE)[, 1]

# to verify
summary(corp)

Это назначает даты вашему корпусу как новую переменную документа.Вы также можете назначить их только на вектор (например, date), если хотите.

У меня нет ни одного из ваших исходных файлов, и поэтому я не могу гарантировать, что это будет работать, но я пока выимейте даты в ваших текстовых файлах, и вызов readtext() находит их, это должно работать.

...