2016-08-18 3 views
0

Я предполагаю, что техника для этого похожа на прием первых N символов из любого кадра данных, независимо от того, является ли он корпусом или нет.Как взять первые 25 слов каждого корпуса (в R)?

Моя попытка:

create.greetings <- function(corpus, create_df = FALSE) { 
    for(i in length(Charlotte.corpus.raw)) { 
    Doc1<-Charlotte.corpus.raw[i] 
    Word1<-Doc1[1:25] 
    Greetings[i]<-Word1 
    } 
    return(VCorpus) 
} 

Где Greetings начинается как корпус с п = 6. Я не мог понять, как создать нулевой корпус или корпус достаточно больших символов. У меня есть 200 документов здесь (Charlotte.corpus.raw). В отличие от векторов (и по расширению, dataframes), похоже, нет простого способа создания пустых корпусов.

Часть проблемы заключается в том, что R, похоже, не распознает класс «документ». Он распознает только корпус. То есть, для R единичный документ является корпусом n = 1.

воспроизводимое Пример: Вы будете нуждаться в «тм» и «dplyr» и пакеты «NLP», а также более общие пакеты R

read.corpus <- function(directory, pattern = "", to.lower = TRUE) { 
corpus <- DirSource(directory = directory, pattern = pattern) %>% 
    VCorpus # Read files and create `VCorpus` object 
if(to.lower == TRUE) corpus <- # Lowercase text 
    tm_map(corpus, 
      content_transformer(tolower)) 
return(corpus) 
} 

Затем запустите функцию для любой директории, которую вы имеете с несколькими txt, тогда у вас есть корпус для работы. Затем замените Charlotte.corpus.raw сверху с тем, что вы называете своим корпусом.

+1

Вашего «корпус» по существу только вектор строк, каждые из которых приговоры/пункты с словами, разделенными пробелами? Просьба представить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), в частности небольшие, но репрезентативные образцы данных. – r2evans

+0

@ r2evans, как насчет того, что я только что редактировал? Я думаю, что вам больше удобнее использовать данные, которые уже хранятся на ваших компьютерах. – Antecedent

+0

Извините, я не могу установить 'tm' в этой системе (пакет' slam' недоступен для R-3.2.5/win), поэтому я не могу проверить ваш код. Если это невозможно сделать без 'tm_map', я уйду. – r2evans

ответ

0

Каждая строка приветствия будет содержать первые 25 слов каждого документа:

greetings <- c() 
for(i in 1:length(corpus)) { 
    row <- unlist(corpus[i])[1:25] 
    greetings <- rbind(greetings, row) 
} 
+0

Если 'corpus' - это просто список векторов символов, было бы проще сделать' lapply (corpus, head, n = 25) '? (BTW: начиная с пустого вектора и добавляя к нему плохую практику и абсолютно можно избежать, когда вы знаете нужный размер. Хотя он будет работать с небольшими числами, поймите, что с каждой итерацией цикла 'for' R делает полная копия 'greetings' со следующей строкой. Это становится дорогостоящим.) – r2evans

+0

Это сообщение помечено для цикла loop, поэтому я сделал бы это, как и было задано. Но, безусловно, хороший момент. – AidanGawronski

+0

Ваш вопрос об использовании цикла 'for' является примечательным, спасибо. Я много раз сталкивался с ГБ данных за раз, поэтому я начинаю сжимать код, который плохо масштабируется ... мой глаз начинает подергиваться :-) – r2evans

Смежные вопросы