提问人:MfM 提问时间:8/15/2023 最后编辑:Gregor ThomasMfM 更新时间:8/15/2023 访问量:43
1500 个 ID 中最常见的二元组计数,而不在一个 ID 中重复计数
Count of most commonly occurring bigram in 1500 IDs without repeating the count within an ID
问:
我正在尝试计算 1500 个 IDS 中最常见的二元组(每行 1 个 ID,有 1 个事件),而不计算每个 ID(行)中超过 1 倍的二元组。例如,如果我有以下 ID,我只想在每个 ID 中计算 1 次“工作日”。在我的分析中,“工作日”应该出现的次数摘要应该是 2。一旦“工作日”被计入 ID,我就不希望它再次被计算在内。
ID Text
1 "The work day was horrible. On this particular work day, I made 5 mistakes....."
2 "This long work day was the best for me. I miss a long work day, because I get into a rhythm....."
这是我的代码。它给出了 40 个最常出现的二元组的总数,作为显示 2 个单词二元组和计数的直方图。我不确定它是否将上面列出的每个 ID 的 bigram 的出现次数计算为 1 倍以上,尽管我确实相信它只是获取所有“事件”并计算 2 个单词 bigram 发生的次数,而不管 ID 如何。
Sum1 %>%
unnest_tokens(word, "Event", token = "ngrams", n = 2) %>%
separate(word, c("word1", "word2"), sep = " ") %>%
filter(!word1 %in% stop_words$word) %>%
filter(!word2 %in% stop_words$word) %>%
unite(word,word1, word2, sep = " ") %>%
count(word, sort = TRUE) %>%
slice(1:40) %>%
ggplot() + geom_bar(aes(x=reorder(word,n), y=n), stat = "identity", fill = "#de5833") +
theme_minimal() +
coord_flip()
答:
0赞
I_O
8/15/2023
#1
像这样的东西?
library(tidytext)
library(dplyr)
d <- data.frame(ID = 1:2,
txt = c('a particular word',
'a particular word a phrase and a particular word')
)
## > d
ID txt
1 1 a particular word
2 2 a particular word a phrase and a particular word
使用基础 R 并从原始文本中过滤掉停用词,最后仅保留每个 ID 的唯一二元组:strsplit
Filter
distinct
d |>
rowwise() |>
mutate(txt = strsplit(txt, split = '\\s')[[1]] |>
Filter(f = \(x) !(x %in% get_stopwords()$word)) |>
paste(collapse = ' ')
) |>
unnest_tokens(input = txt, output = 'tokens',
token = 'ngrams', n = 2) |>
distinct(ID, tokens)
(strsplit
返回一个列表,该列表的单个项目(单词 vector)必须在 ing 之前摘取)[[1]]
Filter
输出:
+ # A tibble: 4 x 2
# Rowwise:
ID tokens
<int> <chr>
1 1 particular word
2 2 particular word
3 2 word phrase
4 2 phrase particular
最后,二元组是这样的:count
## earlier steps (see above)
## ... |>
count(tokens)
+ # A tibble: 3 x 2
# Rowwise:
tokens n
<chr> <int>
1 particular word 2
2 phrase particular 1
3 word phrase 1
评论
0赞
MfM
8/15/2023
最终输出应具有 'particular word' = 2,ID 1 为 1x,ID 2 为 1x,“word phrase”= 1,“phrase particular”= 1。这样,如果 ID 重复了相同的短语,则最终计数不会过度膨胀。
0赞
I_O
8/15/2023
对不起,错过了那个。请参阅编辑。
0赞
MfM
8/15/2023
@I_O谢谢。|> 是否表示 %>% 的管道?
0赞
MfM
8/15/2023
另外,我是否需要过滤掉标点符号并删除所有大写字母?如果是这样,我是否需要在 mutate 函数中执行此操作?
0赞
I_O
8/15/2023
是的,是 tidyverse 管道之后的原生 R 管道。不过,您肯定可以使用后者。|>
%>%
评论