Мне интересно, как получить уникальное количество символов из текстовой строки. Допустим, я ищу количество повторений слов яблоки, бананы, ананасы, виноград в этой строке.
A<- c('I have a lot of pineapples, apples and grapes. One day the pineapples person gave the apples person two baskets of grapes')
df<- data.frame(A)
Допустим, я хочу получить все уникальные количества фруктов, перечисленных в тексте.
library(stringr)
df$fruituniquecount<- str_count(df$A, "apples|pineapples|grapes|bananas")
Я пробовал это, но я получаю по всему счету. Я хотел бы ответить как «3». Пожалуйста, предлагайте свои идеи.





Не совсем элегантно, но вы могли бы использовать str_detect вот так.
sum(str_detect(df$A, "apples"),
str_detect(df$A, "pineapples"),
str_detect(df$A, "grapes"),
str_detect(df$A, "bananas"))
Или, основываясь на комментариях ниже, если вы поместите все эти термины в их собственный вектор, вы можете использовать функцию применения:
fruits <- c("apples", "pineapples", "grapes", "bananas")
sum(sapply(fruits, function(x) str_detect(df$A, x)))
Я получаю странную ошибку, когда пробую это в своем наборе данных и создаю столбец с именем df$fruitcount. У меня много строк, и счетчик всегда указывается как очень большое число. Не могли бы вы предложить, если я что-то упустил?
Это можно было бы сократить до sum(sapply(fruits, function(x) str_detect(df$A, x))) с fruits <- c("apples", "pineapples", "grapes", "bananas").
Вы можете использовать str_extract_all, а затем вычислить длину уникальных элементов.
Вход:
A <- c('I have a lot of pineapples, apples and grapes. One day the pineapples person gave the apples person two baskets of grapes')
fruits <- "apples|pineapples|grapes|bananas"
Результат
length(unique(c(stringr::str_extract_all(A, fruits, simplify = TRUE))))
# [1] 3
Я получаю странную ошибку, когда пробую это в своем наборе данных и создаю столбец с именем df$fruitcount. У меня много строк, и счетчик всегда равен 5. Не могли бы вы подсказать, если я что-то упустил?
Пожалуйста, поделитесь выводом dput(head(your_dataframe)) в конце вашего вопроса.
Да, я добавил данные в вопрос и ожидаемый результат
@ user3570187 Мне кажется, это другая история. Поскольку вы получили довольно много ответов, я предлагаю вам задать еще один с данными, которые вы только что опубликовали, и принять / проголосовать за ответы, которые решили эту проблему.
Согласитесь с @markus, что ваши правки должны быть другим вопросом.
Спасибо за помощь! Я разместил еще один вопрос.
Возможно, лучший способ сделать это — сначала разбить слова, а затем получить счет.
library(tokenizers)
library(magrittr)
df$fruituniquecount <- tokenize_words(A) %>% unlist(.) %>% unique(.) %>%
stringr::str_count(., "apples|pineapples|grapes|bananas") %>% sum(.)
Одной из базовых возможностей может быть:
length(unique(unlist(regmatches(A, gregexpr("apples|pineapples|grapes|bananas", A, perl = TRUE)))))
[1] 3
Можно также сделать:
A <- c('I have a lot of pineapples, apples and grapes. One day the pineapples person gave the apples person two baskets of grapes')
df <- data.frame(A)
fruits <- c("apples", "pineapples", "grapes", "bananas")
df$count <- sum(tolower(unique(unlist(strsplit(as.character(df$A), "\\.|,| ")))) %in% fruits)
Вывод:
[1] 3
Ну, вот также базовое решение R без регулярных выражений,
sum(unique(strsplit(A, ' ')[[1]]) %in% c('apples', 'pineapples', 'grapes', 'bananas'))
#[1] 3
Мы можем использовать комбинацию stringr и stringi:
target<-"apples|pineapples|grapes|bananas"#inspired by @markus ' solution
length(stringi::stri_unique(stringr::str_extract_all(A,target,simplify=TRUE)))
#[1] 3
Зачем изобретать велосипед? Для этого создан пакет квантэда.
Определите вектор ваших фруктов, который в качестве бонуса я использовал с типом сопоставления шаблона шарик (по умолчанию), чтобы улавливать формы как единственного, так и множественного числа.
A <- c("I have a lot of pineapples, apples and grapes. One day the pineapples person gave the apples person two baskets of grapes")
fruits <- c("apple*", "pineapple*", "grape*", "banana*")
library("quanteda", warn.conflicts = FALSE)
## Package version: 1.4.2
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
Затем, когда вы токенизировали это в слова с помощью tokens(), вы можете отправить результат в tokens_select(), используя свой вектор fruits, чтобы выбрать только эти типы.
toks <- tokens(A) %>%
tokens_select(pattern = fruits)
toks
## tokens from 1 document.
## text1 :
## [1] "pineapples" "apples" "grapes" "pineapples" "apples"
## [6] "grapes"
Наконец, ntype() сообщит вам количество слов типы (уникальных слов), которое является желаемым результатом 3.
ntype(toks)
## text1
## 3
В качестве альтернативы вы могли бы подсчитать неуникальные вхождения, известные как жетоны.
ntoken(toks)
## text1
## 6
Обе функции векторизованы, чтобы возвращать именованный целочисленный вектор, где имя элемента будет именем вашего документа (здесь квантэда по умолчанию "text1" для одного документа), так что это также легко и эффективно работает на большом корпусе.
Преимущества? Проще (и читабельнее), чем регулярные выражения, плюс у вас есть доступ к дополнительной функции для токенов. Например, предположим, что вы хотите рассматривать образцы фруктов в единственном и множественном числе как эквивалентные. Вы можете сделать это двумя способами в квантэда: заменив шаблон канонической формой вручную, используя tokens_replace(), или объединив названия фруктов, используя tokens_wordstem().
Использование tokens_replace():
B <- "one apple, two apples, one grape two grapes, three pineapples."
toksrepl <- tokens(B) %>%
tokens_select(pattern = fruits) %>%
tokens_replace(
pattern = fruits,
replacement = c("apple", "pineapple", "grape", "banana")
)
toksrepl
## tokens from 1 document.
## text1 :
## [1] "apple" "apple" "grape" "grape" "pineapple"
ntype(toksrepl)
## text1
## 3
Использование tokens_wordstem():
toksstem <- tokens(B) %>%
tokens_select(pattern = fruits) %>%
tokens_wordstem()
toksstem
## tokens from 1 document.
## text1 :
## [1] "appl" "appl" "grape" "grape" "pineappl"
ntype(toksstem)
## text1
## 3
Я думаю, вам нужно посмотреть на пакет
tidytext. Вот онлайн-книга: ссылка на сайт