Как случайным образом выбрать абзацы из корпуса, исключив из рандомизации те абзацы, которые включают определенный c список слов? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть корпус. Из этого корпуса я бы хотел случайным образом извлечь абзацы. Тем не менее, рандомизация должна быть такой, чтобы абзацы с конкретным c словами не могли быть выбраны.

Это пример:

txt <- c("PAGE 1. A single sentence.  Short sentence. Three word sentence. \n\n Quarentine is hard",
         "PAGE 2. Very short! Shorter.\n\n quarantine is very very hard",
         "Very long sentence, with three parts, separated by commas.  PAGE 3.\n\n quarantine it's good tough to focus on paper.",
         "Fiscal policy is a bad thing. \n\n SO is a great place where skilled people solve coding problems.",
         "Fiscal policy is not as good as people may think",
         "Economics is fun. \n\n I prefer Macro.")
corp <- corpus(txt, docvars = data.frame(serial = 1:6))

Это прямо вперед сделайте это без каких-либо ограничений:

reshape = corpus_reshape(corp, "paragraphs")
sample = corpus_sample(reshape, 4)

# Result

[1] "Economics is fun."                                "Fiscal policy is not as good as people may think"
[3] "Fiscal policy is a bad thing."                    "Quarentine is hard"

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

Могу ли я удалить предложения, связанные с этими словами, в исходном наборе данных перед выполнением выборки? Как бы вы это сделали?

Обратите внимание, что в реальном наборе данных мне нужно будет исключить предложения с более чем одним или двумя ключевыми словами. Поэтому, пожалуйста, предложите что-то, что может быть легко расширено до нескольких слов.

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Если вы хотите исключить параграфов / предложений , которые содержат «фискальную политику», вам необходимо сначала преобразовать текст в абзацы, а затем отфильтровать термины, содержащие фразу исключения, и только затем .

Если вы отфильтруете текст до создания корпуса, вы исключите абзацы нефильтрованной фразы из входного текста, который также содержит фильтрующую фразу (фразы).

library("quanteda")
## Package version: 2.0.1
set.seed(10)

txt <- c(
  "PAGE 1. A single sentence.  Short sentence. Three word sentence. \n\n Quarentine is hard",
  "PAGE 2. Very short! Shorter.\n\n quarantine is very very hard",
  "Very long sentence, with three parts, separated by commas.  PAGE 3.\n\n quarantine it's good tough to focus on paper.",
  "Fiscal policy is a bad thing. \n\n SO is a great place where skilled people solve coding problems.",
  "Fiscal policy is not as good as people may think",
  "Economics is fun. \n\n I prefer Macro."
)

corp <- corpus(txt, docvars = data.frame(serial = 1:6)) %>%
  corpus_reshape(to = "paragraphs")
tail(corp)
## Corpus consisting of 6 documents and 1 docvar.
## text3.2 :
## "quarantine it's good tough to focus on paper."
## 
## text4.1 :
## "Fiscal policy is a bad thing."
## 
## text4.2 :
## "SO is a great place where skilled people solve coding proble..."
## 
## text5.1 :
## "Fiscal policy is not as good as people may think"
## 
## text6.1 :
## "Economics is fun."
## 
## text6.2 :
## "I prefer Macro."

Теперь мы можем подмножество на основе сопоставления с образцом.

corp2 <- corpus_subset(corp, !grepl("fiscal policy", corp, ignore.case = TRUE))
tail(corp2)
## Corpus consisting of 6 documents and 1 docvar.
## text2.2 :
## "quarantine is very very hard"
## 
## text3.1 :
## "Very long sentence, with three parts, separated by commas.  ..."
## 
## text3.2 :
## "quarantine it's good tough to focus on paper."
## 
## text4.2 :
## "SO is a great place where skilled people solve coding proble..."
## 
## text6.1 :
## "Economics is fun."
## 
## text6.2 :
## "I prefer Macro."

corpus_sample(corp2, size = 4)
## Corpus consisting of 4 documents and 1 docvar.
## text6.2 :
## "I prefer Macro."
## 
## text1.2 :
## "Quarentine is hard"
## 
## text2.2 :
## "quarantine is very very hard"
## 
## text3.2 :
## "quarantine it's good tough to focus on paper."

Абзацы, содержащие «фискальную политику», пропали.

Обратите внимание, что здесь я использовал grepl(), но Всеобъемлющая превосходящая замена - str_detect() из stringi (или эквивалентные stringr оболочки). Это также дает вам больший контроль над возможностью использовать более быстрое фиксированное сопоставление и одновременно контролировать соответствие регистров.

all.equal(
  grepl("fiscal policy", txt, ignore.case = TRUE),
  stringi::stri_detect_fixed(txt, "fiscal policy", case_insensitive = TRUE),
  stringr::str_detect(txt, fixed("fiscal policy"), case_insensitive = TRUE)
)
## [1] TRUE
1 голос
/ 02 мая 2020

Если у вас есть текст, вы можете использовать поднаборы с grepl, чтобы опустить «фискальную политику» (или любое другое слово) перед созданием корпуса.

txt2 <- txt[!grepl("fiscal policy|I am groot", tolower(txt))]
txt2

[1] "PAGE 1. A single sentence.  Short sentence. Three word sentence. \n\n Quarentine is hard"                             
[2] "PAGE 2. Very short! Shorter.\n\n quarantine is very very hard"                                                        
[3] "Very long sentence, with three parts, separated by commas.  PAGE 3.\n\n quarantine it's good tough to focus on paper."
[4] "Economics is fun. \n\n I prefer Macro."

Пункты 4 и 5 не были выбраны Теперь сделайте выборку.

Если у вас есть только корпус, извлеките текст и используйте приведенный выше код.

txt <- texts(corp)
...