首页 > 解决方案 > 使用关键字频率对共现进行加权

问题描述

我在 R 中有两个数据框。第一个列出了一定数量的关键字及其频率(在文本中检测到的次数)。第二个数据框显示了关键词的共现(例如,当两个关键词出现在同一章节中时)。我想为我的数据创建一个附加列,然后将其用作权重。第三列(“w”)将基于 w_(x1,x2) = co-occurrences /(x1 被列为关键字的次数 + x2 被列为关键字的次数)。知道我应该怎么做吗?

Key words    Frequency
art          5
risk         3
trade        1

X1    X2    w_(x1,x2)
art   risk  0.125
art   trade 0.1666667

得到了这个代码但不起作用,我仍然是一个业余爱好者。也许有更简单的事情?

e <- df[,"keywords"]$`keywords`%>% 
str_split("\r\r\n") %>% 
lapply(function(x){expand.grid(x, x, w = (1 / length(x) + length(x)), stringsAsFactors = FALSE)}) %>% 
bind_rows 

e <- apply(e[, -3], 1, str_sort) %>% 
t %>% 
data.frame(stringsAsFactors = FALSE) %>% 
mutate(w = e$w)

标签: r

解决方案


您的计算可以使用流行的tidyverse包来执行。根据您的评论,问题很简单。

    word_freq <- read.table(header = TRUE, stringsAsFactors =  FALSE,
                  text =    "Key_words    Frequency
                              art          5
                              risk         3
                              trade        1")

    co_occur <-   read.table(header = TRUE, stringsAsFactors =  FALSE,
              text ="X1    X2         w
                    art  risk 0.1250000
                    art trade 0.1666667")
    library(tidyverse)
#
#  Get the frequencies for each of X1 and X2, sum, and then compute the new weight
#   
    chapt_occur <- co_occur %>% left_join(word_freq, by = c(X1 = "Key_words")) %>% 
                                left_join(word_freq, c(X2 = "Key_words"), suffix = c(".X1", ".X2"))  %>%
                                mutate(comb_freq = Frequency.X1+Frequency.X2,
                                      w_X1X2 = w/comb_freq)

这给出了结果

chapt_occur
  X1    X2         w Frequency.X1 Frequency.X2 comb_freq     w_X1X2
 art  risk 0.1250000            5            3         8 0.01562500
 art trade 0.1666667            5            1         6 0.02777778

可以使用删除包含中间计算的列

 chapt_occur <- chapt_occur %>% select( -c(Frequency.X1, Frequency.X2, comb_freq))

这仅使用基本的 tidyverse 函数。您可以在许多地方了解更多信息,tidyverse包括几位开发人员R for Data Science的在线书籍


推荐阅读