Как посчитать CAPSLOCK в строке с помощью R

В src$Review каждая строка заполняется текстом на русском языке. Я хочу подсчитать CAPSLOCK в каждой строке. Например, в «Мое яблоко ЗЕЛЕНОЕ» я хочу посчитать не просто количество заглавных букв, а количество ЗАГЛАВНЫХ БУКВ (без «Мое», только «ЗЕЛЕНОЕ»). Таким образом, это работает, только если хотя бы два символа представлены в верхнем регистре.

Теперь у меня есть следующий код в моем скрипте:

capscount <- str_count(src$Review, "[А-Я]")

Подсчитывается только общее количество заглавных букв. Мне нужно только общее количество символов, которые находятся в CAPSLOCK, что означает, что эти символы учитываются только в том случае, если отображаются как минимум 2 следующие буквы в слове (например, «GR» в «ЗЕЛЕНЫЙ»).

Заранее спасибо.


person Ruslan Seletskiy    schedule 18.10.2015    source источник


Ответы (3)


Шаблон, который вы ищете, это "\\b[A-Z]{2,}\\b". Он будет соответствовать двум или более заглавным буквам подряд, которые имеют границы \\b с каждой стороны. Это общая структура, где нужно заполнить русским алфавитом.

#test string. A correct count should be 1 0 2
x <- c("My GREEN", "My Green", "MY GREEN")

library(stringr)
str_count(x, "\\b[A-Z]{2,}\\b")
#[1] 1 0 2

library(stringi)
stri_count(x, regex="\\b[A-Z]{2,}\\b")
#[1] 1 0 2

#base R
sapply(gregexpr("\\b[A-Z]{2,}\\b", x), function(x) length(c(x[x > 0])))
#[1] 1 0 2

Обновить

Если вы хотите количество символов:

sapply(str_match_all(x, "\\b[A-Z]{2,}\\b"), nchar)
person Pierre L    schedule 18.10.2015

Используйте регулярное выражение Пьера с nchar и str_extract_all. Используйте simplify = TRUE и paste0 для объединения всех экземпляров.

library(stringr)

string <- c("My applie is GREEN and Her Majesty's apricot is ORANGE", "I have a LARGE sword", "My baby is sick")

nchar(
  paste0(
    str_extract_all(string = string, pattern = "\\b[A-Z]{2,}\\b", simplify = TRUE), 
    collapse = "")
  )
person Hugh    schedule 18.10.2015

В пакете qdapRegex, который я поддерживаю, есть регулярное выражение для этого, которое совпадает с регулярным выражением @Hugh, но IMO приятно иметь много общих регулярных выражений, хранящихся в библиотеке, которую я могу просто взять. qdapRegex использует stringi в качестве серверной части, поэтому он должен быть доступен, если вы установили qdapRegex.

В строке @Pierre Lafortune:

x <- c("My GREEN", "My Green", "MY GREEN")

library(qdapRegex)
stringi::stri_count_regex(x, grab("@rm_caps"))

## [1] 1 0 2

Давайте посмотрим на регулярное выражение:

grab("@rm_caps")

## "(\\b[A-Z]{2,}\\b)"

В строке @Hugh:

x2 <- c("My applie is GREEN and Her Majesty's apricot is ORANGE", "I have a LARGE sword", "My baby is sick")
stringi::stri_count_regex(x2, grab("@rm_caps"))

## [1] 2 1 0
person Tyler Rinker    schedule 18.10.2015