2016-03-24 3 views
0

Я использую R и пакет tm для выполнения некоторого текстового анализа. Я пытаюсь построить подмножество корпуса на основе того, найдено ли определенное выражение в содержимом отдельных текстовых файлов.Подмножество корпуса на основе содержимого текстового файла

создать корпус с 20 текстовых файлов (спасибо lukeA для данного примера):

reut21578 <- system.file("texts", "crude", package = "tm") 
corp <- VCorpus(DirSource(reut21578), list(reader = readReut21578XMLasPlain)) 

теперь я хотел бы, чтобы выбрать только те TextFiles, которые содержат строку «снижение цен», чтобы создать подмножество-корпус ,

Осмотрев первый текстовый файл документа, я знаю, что есть по крайней мере один текстовый файл, содержащий эту строку:

writeLines(as.character(corp[1])) 

Как бы мне лучше всего идти об этом?

ответ

1

Вот один из способов использования tm_filter:

library(tm) 
reut21578 <- system.file("texts", "crude", package = "tm") 
corp <- VCorpus(DirSource(reut21578), list(reader = readReut21578XMLasPlain)) 

(corp_sub <- tm_filter(corp, function(x) any(grep("price reduction", content(x), fixed=TRUE)))) 
# <<VCorpus>> 
# Metadata: corpus specific: 0, document level (indexed): 0 
# Content: documents: 1 

cat(content(corp_sub[[1]])) 
# Diamond Shamrock Corp said that 
# effective today it had cut its contract prices for crude oil by 
# 1.50 dlrs a barrel. 
#  The reduction brings its posted price for West Texas 
# Intermediate to 16.00 dlrs a barrel, the copany said. 
#  "The price reduction today was made in the light of falling # <===== 
# oil product prices and a weak crude oil market," a company 
# spokeswoman said. 
#  Diamond is the latest in a line of U.S. oil companies that 
# have cut its contract, or posted, prices over the last two days 
# citing weak oil markets. 
# Reuter 

Как туда добраться? Изучив packages' vignette, найдите подмножество, а затем посмотрите примеры для tm_filter (help: ?tm_filter), о котором говорится здесь. Также возможно посмотреть на ?grep, чтобы проверить параметры соответствия шаблонов.

0

@ Решение lukeA работает. Я хочу дать другое решение, которое я предпочитаю.

library(tm) 

     reut21578 <- system.file("texts", "crude", package = "tm") 
     corp <- VCorpus(DirSource(reut21578), list(reader = readReut21578XMLasPlain)) 

     corpTF <- lapply(corp, function(x) any(grep("price reduction", content(x), fixed=TRUE))) 

     for(i in 1:length(corp)) 
      corp[[i]]$meta["mySubset"] <- corpTF[i] 

     idx <- meta(corp, tag ="mySubset") == 'TRUE' 
     filtered <- corp[idx] 

     cat(content(filtered[[1]])) 

Преимущество этого решения с использованием мета-тегов, мы можем увидеть все Corpus элементы с выбора тега mySubset, значение «TRUE» для наших выбранных, и значение «FALSE» иначе ,

+0

Большое спасибо за это дополнение. Я согласен, это очень полезно! – tarti

0

Простейший способ использования пакета quanteda, а еще один соответствует способу повторного использования существующих методов, уже определенных для других объектов R. quanteda имеет метод subset для объектов corpus, который работает точно так же, как метод подмножества для data.frame, но выбирает логические векторы, включая переменные документа, определенные в корпусе. Ниже я извлек тексты из корпуса с помощью метода texts() для объектов corpus и использовал это в grep() для поиска вашей пары слов.

require(tm) 
data(crude) 

require(quanteda) 
# corpus constructor recognises tm Corpus objects 
(qcorpus <- corpus(crude)) 
## Corpus consisting of 20 documents. 
# use subset method 
(qcorpussub <- subset(qcorpus, grepl("price\\s+reduction", texts(qcorpus)))) 
## Corpus consisting of 1 document. 

# see the context 
## kwic(qcorpus, "price reduction") 
##      contextPre   keyword    contextPost 
## [127, 45:46] copany said." The [ price reduction ] today was made in the 

Примечание: Я разнесены ваше регулярное выражение с «\ S +», так как вы могли бы иметь некоторые вариации пробелов, табуляции или символы новой строки, а не только в одном пространстве.

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