Как добыть несколько слов из заданного текста в R? - PullRequest
0 голосов
/ 25 мая 2020
library(tm)
library(stringr)
txt <- "Netherland Belgium UK Sweden France Russia Government and People"
words <- c("land", "Sweden", "Government and People", "Government", "People")
pattern <- str_c(words,collapse ="|")
cntry <- str_extract_all(txt, pattern)

Хотя land не встречается в моем тексте как отдельное слово, код взят из последней части Netherland. Как я могу заставить код строго искать только слова, включенные в words? Вывод для переменной cntry:

 "land"  "Sweden"  "Government and People"

Вывод, который мне нужен для cntry:

 "Sweden"  "Government and People"

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

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

В этом ответе я сосредоточусь на извлечении Netherland из шаблона land. Другой подобный пример - извлечение Sweden на основе шаблона den.

Вот функция для достижения этого с помощью regmatches и regexec:

FUNCTION

return_partials <- function(txt, problem_patterns){
  ret_vec <- sapply(problem_patterns, function(z){
    list_output <- regmatches(x = txt, 
                    m = regexec(pattern = paste('[[:space:]]{0,1}?(.*', z, ')', sep = ''), 
                                text = txt))
    return(list_output[[1]][2])
  })
  return(unname(ret_vec))
}

OUTPUT

> return_partials(txt = txt, problem_patterns = c('land', 'den'))
[1] "Netherland" "Sweden"

Вы можете объединить его с ответом Криса Рюлеманна:

words <- c("\\bland", "Sweden", "Government and People", "Government", "People")
pattern <- str_c(words,collapse = "|")
sol1 <- unlist(str_extract_all(txt, pattern))

sol2 <- return_partials(txt = txt, problem_patterns = c('land', 'den'))

> unique(c(sol1, sol2))
[1] "Sweden"                "Government and People" "Netherland" 
0 голосов
/ 25 мая 2020

Если задача действительно состоит только в том, чтобы предотвратить извлечение land из Netherlands, это может быть достигнуто путем добавления привязки \\b (для границы слова) к land в векторе words:

words <- c("\\bland", "Sweden", "Government and People", "Government", "People")
pattern <- str_c(words,collapse = "|")
str_extract_all(txt, pattern)
[[1]]
[1] "Sweden"                "Government and People"
...