R: извлечение биграмм с головами нулевой ширины
Я хочу извлечь биграммы из предложений, используя описанное здесь регулярное выражение, и сохранить результаты в новом столбце, который ссылается на оригинал.
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 ответ
Как предложил @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
это просто, чтобы избежать предупреждений, поступающих из строк привязки.