Оставить только текст метки - PullRequest
2 голосов
/ 04 августа 2020

В тексте, который имеет метки форматирования, такие как

data.frame(id = c(1, 2), text = c("something here <h1>my text</h1> also <h1>Keep it</h1>", "<h1>title</h1> another here"))

Как кто-то может сохранить с помощью опции, разделенной запятыми, только текст внутри <h1> </h1>:

data.frame(text = c("my text, Keep it", "title"), id = c(1, 2))

Ответы [ 3 ]

3 голосов
/ 04 августа 2020

Вы можете использовать навык очистки веб-страниц.

library(rvest)

sapply(df$text, function(x) {
  read_html(x) %>% html_nodes(css = "h1") %>% html_text %>% toString
}, USE.NAMES = F)

# [1] "my text, Keep it"
# [2] "title"
3 голосов
/ 04 августа 2020

Мы можем использовать str_extract_all. Используя поиск по регулярному выражению, получите символы после тега, затем l oop поверх вывода list и paste извлеченных строк

library(stringr)
data.frame(text = sapply(str_extract_all(df1$text, "(?<=<h1>)[^<]+"), 
      paste, collapse=", "), id = df1$id)
#               text id
#1 my text, Keep it  1
#2            title  2
1 голос
/ 11 августа 2020

Если вы хотите использовать для этого quanteda , вы можете преобразовать его в корпус, а затем обработать его двумя вызовами corpus_segment(), один для получения текста раньше, а второй - затем. просто выделите текст после. Затем вы можете повторно сгруппировать текст, используя texts(x, groups = docid()), указав spacer = ", ".

Вот как с желаемым результатом:

library("quanteda")
## Package version: 2.1.1

df <- data.frame(
  id = c(1, 2),
  text = c("something here <h1>my text</h1> also <h1>Keep it</h1>", "<h1>title</h1> another here")
)

charvec <- corpus(df, docid_field = "id") %>%
  corpus_segment("</h1>", pattern_position = "after") %>%
  corpus_segment("<h1>", pattern_position = "before") %>%
  texts(groups = docid(.), spacer = ", ")

Затем, чтобы преобразовать это в data.frame что хотите:

data.frame(text = charvec, id = names(charvec))
##               text id
## 1 my text, Keep it  1
## 2            title  2
...