R: Можно ли извлечь группы слов из каждого предложения (строк)? и создать фрейм данных (или матрицу)? - PullRequest
1 голос
/ 27 мая 2020

Я создал списки для каждого слова, чтобы извлечь слова из предложений, например, вот так

hello<- NULL
for (i in 1:length(text)){
hello[i]<-as.character(regmatches(text[i], gregexpr("[H|h]ello?", text[i])))
}

Но у меня есть список из более чем 25 слов, который нужно извлечь, это очень длинный код. Можно ли извлечь группу символов (слов) из текстовых данных?

Ниже приведен только псевдо-набор.

words<-c("[H|h]ello","you","so","tea","egg")

text=c("Hello! How's you and how did saturday go?",  
       "hello, I was just texting to see if you'd decided to do anything later",
       "U dun say so early.",
       "WINNER!! As a valued network customer you have been selected" ,
       "Lol you're always so convincing.",
       "Did you catch the bus ? Are you frying an egg ? ",
       "Did you make a tea and egg?"
)

subsets<-NULL
for ( i in 1:length(text)){
.....???
   }

Ожидаемый результат, как показано ниже

[1] Hello you
[2] hello you
[3] you
[4] you so
[5] you you egg
[6] you tea egg

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

в базе R вы можете сделать:

regmatches(text,gregexpr(sprintf("\\b(%s)\\b",paste0(words,collapse = "|")),text))
[[1]]
[1] "Hello" "you"  

[[2]]
[1] "hello" "you"  

[[3]]
[1] "so"

[[4]]
[1] "you"

[[5]]
[1] "you" "so" 

[[6]]
[1] "you" "you" "egg"

[[7]]
[1] "you" "tea" "egg"

в зависимости от того, как вы хотите получить результаты:

trimws(gsub(sprintf(".*?\\b(%s).*?|.*$",paste0(words,collapse = "|")),"\\1 ",text))
[1] "Hello you"   "hello you"   "so"          "you"         "you so"      "you you egg"
[7] "you tea egg"
2 голосов
/ 27 мая 2020

Вы говорите, что у вас есть длинный список наборов слов. Вот способ превратить каждый набор слов в регулярное выражение, применить его к корпусу (списку предложений) и извлечь совпадения как векторы-символы. Он нечувствителен к регистру и проверяет границы слов, поэтому вы не извлекаете возраст из агента или ярости .

wordsets <- c(
  "oak dogs cheese age",
  "fire open jail",
  "act speed three product"
)

library(tidyverse)
harvSent <- read_table("SENTENCE
    Oak is strong and also gives shade.
    Cats and dogs each hate the other.
    The pipe began to rust while new.
    Open the crate but don't break the glass.
    Add the sum to the product of these three.
    Thieves who rob friends deserve jail.
    The ripe taste of cheese improves with age.
    Act on these orders with great speed.
    The hog crawled under the high fence.
    Move the vat over the hot fire.") %>% 
  pull(SENTENCE)

aWset строит регулярные выражения из наборов слов и применяет их к предложениям

aWset <- function(harvSent, wordsets){
  # Turn out a vector of regex like "(?ix) \\b (oak|dogs|cheese) \\b"
  regexS <- paste0("(?ix) \\b (",
              str_replace_all(wordsets, " ", "|" ),
               ") \\b")
  # Apply each regex to the sentences
  map(regexS,
      ~  str_extract_all(harvSent, .x, simplify = TRUE) %>% 
         # str_extract_all return a character matrix of hits.  Paste it together by row.
        apply( MARGIN = 1, 
               FUN = function(x){
                    str_trim(paste(x, collapse = " "))}))
}

давая нам

aWset(harvSent , wordsets)
[[1]]
 [1] "Oak"        "dogs"       ""           ""           ""           ""           "cheese age" ""          
 [9] ""           ""          

[[2]]
 [1] ""     ""     ""     "Open" ""     "jail" ""     ""     ""     "fire"

[[3]]
 [1] ""              ""              ""              ""              "product three" ""              ""             
...