2016-01-07 4 views
3

У меня есть 4000 текстовых документов в корпусе. Я хочу удалить строки (строки), содержащие конкретное слово из каждого документа, как часть очистки данных.Удаление строк из корпуса с несколькими документами

Например:

library(tm) 
doc.corpus<- VCorpus(DirSource("C:\\TextMining\\Prototype",pattern="*.txt",encoding= "UTF8",mode = "text"),readerControl=list(language="en")) 

doc.corpus<- tm_map(doc.corpus, PlainTextDocument) 

doc.corpus[[1]] 

#PlainTextDocument 
Metadata: 7 
Content: chars: 16542 

    as.character(doc.corpus)[[1]] 


$content 


"Quick to deploy, easy to use, and offering complete investment 
protection, our product is clearly differentiated from all 
competitive offerings by its common, modular platform, seamless 
integration, broad range of support to heterogeneous products from 
Microsoft,Apple, Oracle and unequalled scalability, support for 
industry standards, and business application-to-storage system 
correlation capabilities." 
"Microsoft is U.S. registered trademarks of Microsoft Corporation, Oracle is a U.S. registered trademarks of Oracle Corporation and Apple 
is a U.S. registered trademarks of Apple Corporation." 

Моя проблема заключается в удалении 2-й строки, содержащей слово «товарный знак» от этого и всех других документов. В настоящее время я использовал grepl() для идентификации строк и попытался исключить те строки, используя подход, который обычно используется при работе с кадром данных, которые не работают:

corpus.copy<-corpus.doc 
corpus.doc[[1]]<-corpus.copy[[1]][!grepl("trademark",as.character(corpus.copy[[1]]),ignore.case = TRUE),] 

Пока он работает для первого документ, я мог бы легко использовать «для цикла» для реализации во всех документах в Корпусе.

Любые советы/решения оцениваются. Я мог бы легко использовать альтернативный маршрут, преобразовывая Corpus в фрейм данных, чтобы удалить нежелательные строки и снова вернуться к Corpus. Благодарю.

System.info: 
[1] "x86_64-w64-mingw32"; 
[1] "R version 3.1.0 (2014-04-10)" 
[1] tm_0.6-2 
+0

Стратегия: Добавьте слово «товарный знак» (и другие слова, чтобы удалить) к вектору игнорируемых слов, а затем запустить tm_map (mycorpus, removeStopwords) с этими пользовательскими векторами стоп-слов. – knb

+0

Вопрос: Является ли первый элемент символа «строкой» или означает, что символы новой строки означают, что он должен быть 7 строк? Я спрашиваю, потому что второй элемент символьного вектора не имеет новых строк, но первый делает. –

+0

Каждая строка символьного символа определяется «текстом внутри двойной кавычки». В исходном примере у нас есть две строки в этом документе. – user2662753

ответ

1

Нет необходимости для цикла - хотя это давно было разочарование особенностью tm, что трудно получить доступ текстов, когда они находятся в объекте корпуса.

Я интерпретировал то, что вы подразумеваете под «строкой» в качестве документа, поэтому приведенный выше пример представляет собой две «строки». Если это не так, этот ответ должен быть (но может быть легко отрегулирован).

Попробуйте это:

txt <- c("Quick to deploy, easy to use, and offering complete investment 
protection, our product is clearly differentiated from all 
competitive offerings by its common, modular platform, seamless 
integration, broad range of support to heterogeneous products from 
Microsoft,Apple, Oracle and unequalled scalability, support for 
industry standards, and business application-to-storage system 
correlation capabilities.", 
"Microsoft is U.S. registered trademarks of Microsoft Corporation, Oracle is a U.S. registered trademarks of Oracle Corporation and Apple 
is a U.S. registered trademarks of Apple Corporation.") 

require(tm) 
corp <- VCorpus(VectorSource(txt)) 
textVector <- sapply(corp, as.character) 
newCorp <- VCorpus(VectorSource(textVector[-grep("trademark", textVector, 
                ignore.case = TRUE)])) 

newCorp в настоящее время исключает документы, содержащие "товарный знак". Обратите внимание, что если вам не нужен множественном этого (например, «товарный знак»)

0
Thank you Ken. Below is the small modification I made for my successful implementation. 

    require(tm) 
    corp <- VCorpus(VectorSource(txt)) 
    textVector <- sapply(corp, as.character) 
    for(j in seq(textVector)) { 
    newCorp<-textVector 
    newCorp[[j]] <- textVector[[j]][-grep("trademarks|trademark", textVector[[j]], ignore.case = TRUE)] 
    } 

It seems 'textVector' contains a 'list' of documents. 'for' loop is still needed. 
Смежные вопросы