显示列表中的每个单词在dataframe(文本)或dfm中出现的频率

x33g5p2x  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(83)

我有一个单词列表,我想计算一下,这些单词中的每一个出现在带有文本数据或dfm的 Dataframe 中的频率。到目前为止我所做的:
我的清单:

words <- dictionary(list(words = c("House", "Mountain", "Blue", "Night")))

我的dataframe(也有一个dfm从标题和文本):
| 身份证|标题|日期|正文|
| --------------|--------------|--------------|--------------|
| 1|布拉布拉|2023年7月22日|blablablabla蓝色blablabla|
| 2|布拉布拉|23.06.2023|蓝色blabla蓝色blabla蓝色|
输出应为:
| 身份证|标题|日期|正文|字|计数|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 1|布拉布拉|2023年7月22日|blablablabla蓝色blablabla|蓝色|1|
| 2|布拉布拉|23.06.2023|蓝色blabla蓝色blabla蓝色|蓝色|3|

5jdjgkvh

5jdjgkvh1#

我对输入数据做了一点编辑,以显示words向量中的多个单词存在于text列中的情况。
我用一个循环来处理它,并将它们分成多行。然而,我们也可以将这些汇总到一个列表中,并将count添加到一起:summarise(word = list(word), count = sum(count), .by = c(title, date, text))

read.table(text= "title     date    text
blablabla   22.07.2023  'blablablabla Blue blablabla'
blablabla   23.06.2023  'bala Blue blabla Blue Night Blue'", 
           header = T, stringsAsFactor = F) -> df1

words <- c("House", "Mountain", "Blue", "Night")
library(purrr)
library(dplyr)
library(stringr)

map_dfr(words, ~ df1 %>%  mutate(word = if_else(str_detect(text, .x), .x, NA))) %>% 
  na.omit() %>% 
  mutate(count = str_count(text, word))
#>       title       date                             text  word count
#> 5 blablabla 22.07.2023      blablablabla Blue blablabla  Blue     1
#> 6 blablabla 23.06.2023 bala Blue blabla Blue Night Blue  Blue     3
#> 8 blablabla 23.06.2023 bala Blue blabla Blue Night Blue Night     1

创建于2023-05-15带有reprex v2.0.2

wdebmtf2

wdebmtf22#

如果你只是想提取words并汇总计数,那就可以了:

library(dplyr)
df1 %>%
  mutate(
    # count number of keywords:
    count = str_count(text, str_c(words, collapse = "|")),
    # extract instances of keywords:
    keyword = str_extract_all(text, 
                                   str_c("(?i)\\b(", str_c(words, collapse = "|"), ")\\b")
  ))
      title       date                                  text count                      keyword
1 blablabla 22.07.2023           blablablabla Blue blablabla     1                         Blue
2 blablabla 23.06.2023      bala Blue blabla Blue Night Blue     4      Blue, Blue, Night, Blue
3 blablabla 23.08.2023 bala Mountain blabla House Night Blue     4 Mountain, House, Night, Blue

编辑

如果您不想对words进行概括性计数,而是想按类型计数,那么这是一项完全不同的任务。这可以像这样做(请参阅计数每个关键字在其自己的列中的数量):

library(dplyr)
library(tidyr)
df %>%
    mutate(tokens = strsplit(text, " ")) %>%
    unnest(tokens) %>%
    filter(tokens %in% words) %>%
    pivot_wider(
        names_from = tokens,
        values_from = tokens,
        values_fn = length,
        values_fill = 0
    ) %>%
    left_join(df)
# A tibble: 3 × 7
  title     date       text                                   Blue Night Mountain House
  <chr>     <chr>      <chr>                                 <int> <int>    <int> <int>
1 blablabla 22.07.2023 blablablabla Blue blablabla               1     0        0     0
2 blablabla 23.06.2023 bala Blue blabla Blue Night Blue          3     1        0     0
3 blablabla 23.08.2023 bala Mountain blabla House Night Blue     1     1        1     1

数据:

df1 <- read.table(text= "title     date    text
blablabla   22.07.2023  'blablablabla Blue blablabla'
blablabla   23.06.2023  'bala Blue blabla Blue Night Blue'
blablabla   23.08.2023  'bala Mountain blabla House Night Blue'", 
header = T, stringsAsFactor = F)
  
words <- c("House", "Mountain", "Blue", "Night")

相关问题