R: Подсчет частоты слов из предопределенного словаря - PullRequest
1 голос
/ 07 августа 2020

У меня очень большой набор данных, который выглядит следующим образом: один столбец содержит имена, второй столбец содержит их соответствующие (очень длинные) тексты. У меня также есть предустановленный словарь, содержащий не менее 20 терминов. Как я могу подсчитать, сколько раз эти ключевые слова встречаются в каждой строке моего фрейма данных? Я пробовал str_detect, grep (l) и%>% like и перебирал каждую строку, но проблема, похоже, в том, что я хочу обнаружить слишком много терминов, и эти функции перестают работать, когда я использую 15+ терминов или около того .

Был бы ооочень счастлив, если бы кто-нибудь мог мне с этим помочь!

col1<- c("Henrik", "Joseph", "Lucy")
col2 <- c("I am going to get groceries", "He called me at six.", "No, he did not")
df <- data.frame(col1, col2)```
dict <- c("groceries", "going", "me") #but my actual dictionary is much larger 

Ответы [ 3 ]

1 голос
/ 07 августа 2020

Вот базовый вариант R с использованием gregexpr

dfout <- within(
  df,
  counts <- sapply(
    gregexpr(paste0(dict, collapse = "|"), col2),
    function(x) sum(x > 0)
  )
)

или

dfout <- within(
  df,
  counts <- sapply(
    regmatches(col2, gregexpr("\\w+", col2)),
    function(v) sum(v %in% dict)
  )
)

, что дает

> dfout
  col1                        col2 counts
1    1 I am going to get groceries      2
2    2        He called me at six.      1
3    3              No, he did not      0

Data

structure(list(col1 = 1:3, col2 = c("I am going to get groceries", 
"He called me at six.", "No, he did not")), class = "data.frame", row.names = c(NA, 
-3L))
1 голос
/ 07 августа 2020

Я думаю, что мое решение дает вам желаемый результат - то есть для каждого слова в вашем списке «dict» вы можете видеть, сколько раз оно встречается в каждом предложении. Каждая строка - это запись в df $ col2, т.е. предложение. «Dict» - это ваш вектор терминов, которым вы хотите соответствовать. Мы можем l oop по вектору и для каждой записи в векторе сопоставить, сколько раз эта запись появляется в каждой строке / предложении, используя stringr :: str_count. Обратите внимание на синтаксис для str_count: str_count (проверяемая строка, выражение, которое вы пытаетесь сопоставить)

str_count возвращает вектор, показывающий, сколько раз слово появляется в каждой строке. Я создаю фрейм данных из этих векторов, который будет содержать такое же количество строк, как и записей в векторе dict. Затем вы можете просто привязать «dict» к этому фрейму данных и увидеть, сколько раз каждое слово используется в каждом предложении. Я корректирую имена столбцов в самом конце, чтобы вы могли сопоставить слова с # в предложении. Обратите внимание: если вы хотите вычислить строку, это означает, что вам нужно выделить столбец «dict» в окончательном фрейме данных, потому что это символ.

 library(stringr)
 col1<- c("Henrik", "Joseph", "Lucy")
 col2 <- c("I am going to get groceries", "He called me at six.", "No, he    
 did not")
 df <- data.frame(col1, col2)
 dict <- c("groceries", "going", "me")

 word_matches <- data.frame()
 for (i in dict) {
 word_tot<-(str_count(df$col2, i))
 word_matches <- rbind(word_matches,word_tot)
 }
 word_matches
 colnames(word_matches) <- paste("Sentence", 1:ncol(word_matches))
 cbind(dict,word_matches)


        dict Sentence 1    Sentence 2    Sentence 3
 1 groceries        1           0           0
 2     going        1           0           0
 3        me        0           1           0
1 голос
/ 07 августа 2020

Создайте уникальный идентификатор для ваших строк. Разделите col2 на слова, по одному в каждой строке. Отфильтруйте только выбранные слова в вашем dict. Затем посчитайте по каждой строке. Наконец, объедините с исходным df и установите NA в Zeros для строк, в которых нет слов из вашего dict.

library(dplyr)

col1 <- c("A","B","A")
col2 <- c("I am going to get groceries", "He called me at six.", "No, he did not")
df <- data.frame(col1, col2, stringsAsFactors = FALSE)
dict <- c("groceries", "going", "me")

df <- df %>% mutate(row=row_number()) %>% select(row, everything())

counts <- df %>% tidyr::separate_rows(col2) %>% filter(col2 %in% dict) %>% group_by(row) %>% count(name = "counts")

final <- left_join(df, counts, by="row") %>% tidyr::replace_na(list(counts=0L))
final
#>   row col1                        col2 counts
#> 1   1    A I am going to get groceries      2
#> 2   2    B        He called me at six.      1
#> 3   3    A              No, he did not      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...