R: извлечение биграмм с головами нулевой ширины - PullRequest
0 голосов
/ 22 января 2019

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

enter image description here

library(dplyr)
library(stringr)
library(splitstackshape)

df  <- data.frame(a =c("apple orange plum"))

# Single Words - Successful
df %>%
  # Base R
  mutate(b =  sapply(regmatches(a,gregexpr("\\w+\\b", a, perl = TRUE)),
                     paste, collapse=";")) %>%
  # Duplicate with Stringr
  mutate(c =  sapply(str_extract_all(a,"\\w+\\b"),paste, collapse=";")) %>%
  cSplit(., c(2,3), sep = ";", direction = "long")

Первоначально я думал, что проблема, похоже, связана с движком регулярных выражений, но ни stringr::str_extract_all (ICU), ни base::regmatches (PCRE) не работают.

# Bigrams - Fails
df %>%
  # Base R
  mutate(b =  sapply(regmatches(a,gregexpr("(?=(\\b\\w+\\s+\\w+))", a, perl = TRUE)),
                     paste, collapse=";")) %>%
  # Duplicate with Stringr
  mutate(c =  sapply(str_extract_all(a,"(?=(\\b\\w+\\s+\\w+))"),paste, collapse=";")) %>%
  cSplit(., c(2,3), sep = ";", direction = "long")

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

1 Ответ

0 голосов
/ 24 января 2019

Как предложил @ WiktorStribiżew, использование str_extract_all помогает здесь.Вот как применить его к нескольким строкам во фрейме данных.Пусть

(df <- data.frame(a = c("one two three", "four five six")))
#               a
# 1 one two three
# 2 four five six

Тогда мы можем сделать

df %>% rowwise() %>% 
  do(data.frame(., b = str_match_all(.$a, "(?=(\\b\\w+\\s+\\w+))")[[1]][, 2], stringsAsFactors = FALSE))
# Source: local data frame [4 x 2]
# Groups: <by row>
#
# A tibble: 4 x 2
#   a             b        
# * <fct>         <chr>    
# 1 one two three one two  
# 2 one two three two three
# 3 four five six four five
# 4 four five six five six

, где stringsAsFactors = FALSE только для того, чтобы избежать предупреждений, приходящих из строк привязок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...