【问题标题】:What's the correct way to extract tf-idf topfeatures by document?按文档提取 tf-idf topfeatures 的正确方法是什么?
【发布时间】:2019-12-03 00:27:32
【问题描述】:

假设我们有一个来自 10K 个相当小的文档的语料库的 tf-idf 加权 dfm。

quanteda 提取顶部特征的方法是什么,即文档的最大 tf-idf 值? 在计算 tf-idf 时,我确实希望整个语料库成为参考。类似于

topfeatures(some_dfm_tf_idf, n =3, decreasing = TRUE, groups ="id")

返回一个合适的列表。然而,在这一点上基本上已经整理出来的东西需要相当长的时间。鉴于 quanteda 在我迄今为止所做的一切中都表现得如此出色,我怀疑我在这里可能做错了什么。

也许这与 github (https://github.com/quanteda/quanteda/issues/1646) 上的讨论和@Astelix 显示的示例解决方法有些相关。

【问题讨论】:

    标签: r quanteda


    【解决方案1】:

    topfeatures() 有点慢,因为它对每个特征进行排序,然后返回最高值。获取每个文档中最有价值的特征的更有效方法是使用max.col。这是方法和比较(将返回值放在与topfeatures() 答案格式相同的列表中)。

    library("quanteda")
    ## Package version: 1.5.2
    
    data(data_corpus_sotu, package = "quanteda.corpora")
    dfmat <- dfm(data_corpus_sotu) %>%
      dfm_tfidf()
    
    # alternative using max.col
    get_top_feature <- function(x) {
      topfeature_index <- max.col(x, "first")
      result <- mapply(function(a, b) {
        l <- as.numeric(x[a, b])
        names(l) <- featnames(x)[b]
        l
      },
      seq_len(ndoc(x)), topfeature_index,
      SIMPLIFY = FALSE
      )
      names(result) <- docnames(x)
      result
    }
    
    microbenchmark::microbenchmark(
      topfeatures = topfeatures(dfmat, n = 1, groups = docnames(dfmat)),
      maxcol = get_top_feature(dfmat),
      times = 20, unit = "relative"
    )
    ## Unit: relative
    ##         expr      min       lq     mean   median       uq      max neval
    ##  topfeatures 2.085184 2.113136 2.069444 2.104166 2.032536 1.987218    20
    ##       maxcol 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000    20
    

    【讨论】:

      【解决方案2】:

      topfeatures() 正是要走的路。我不确定您为什么说它“需要相当长的时间”,或者您的“id”docvar 是什么,但以下是获取 dfm 中得分最高的功能列表的正确且最有效的方法(无论权重如何)。

      结果是一个命名列表,其中名称是文档名,每个元素是一个命名数字向量,其中元素名称是特征标签。

      library("quanteda")
      ## Package version: 1.5.2
      
      some_dfm_tf_idf <- dfm(data_corpus_irishbudget2010)[1:5, ] %>%
        dfm_tfidf()
      
      topfeatures(some_dfm_tf_idf, n = 1, groups = docnames(some_dfm_tf_idf))
      ## $`Lenihan, Brian (FF)`
      ## details 
      ## 5.57116 
      ## 
      ## $`Bruton, Richard (FG)`
      ## confront 
      ##  5.59176 
      ## 
      ## $`Burton, Joan (LAB)`
      ## lenihan 
      ## 4.19382 
      ## 
      ## $`Morgan, Arthur (SF)`
      ##    sinn 
      ## 5.59176 
      ## 
      ## $`Cowen, Brian (FF)`
      ## dividend 
      ##  4.19382
      

      【讨论】:

      • 谢谢。这就是我希望的确认类型。我得到了 12K 的文档,其中包含大约 30K 的特征。 dfm_tfidf() 非常快,然后不知为什么 topfeatures() 花了几分钟,尽管分数已经计算过了,这应该是 sort(score) 的问题。也许这只是错误的期望/本地问题。顺便说一句:这确实是我没有立即看到 /w {quanteda} 的少数情况之一。方法和文档就是那么好。对我来说,这是最近在 R 世界中出现的最好的生态系统之一。
      • 谢谢!!我意识到为什么这种方法这么慢,所以添加了另一个答案。我很高兴有人能找到更快的方法!
      • 这正是我想要的。但是,当我尝试运行它时,我总是会收到以下错误:不会对加权 dfm 进行分组;使用 force = TRUE 覆盖。当我尝试这个时,我得到的输出是 force = TRUE 是一个不受支持的参数。你知道问题出在哪里吗?
      • 没关系,Astelix 在 Github 上描述的解决方案对我有用:github.com/quanteda/quanteda/issues/1646#issuecomment-472733219 无论如何谢谢!
      • 下面的第二种方法get_top_feature()没有这个问题。但无论如何,我已经为这个警告提出了一个修复方案。 github.com/quanteda/quanteda/pull/2033
      【解决方案3】:

      除了 Ken 的 get_top_feature(),您可能不仅对“顶级”术语感兴趣,而且对 tfidf-dtm 中权重第二高的术语感兴趣。我花了一些时间才弄明白,所以我认为它总体上可能会有所帮助。

      get_scnd_feature <- function(x) {
      topfeature_index <- max.col(x, 'first')
      scndfeature_index <- max.col(replace(x, cbind(seq_len(nrow(x)), topfeature_index), -Inf), 'first')
        result <- mapply(function(a, b) {
          l <- as.numeric(x[a, b])
          names(l) <- featnames(x)[b]
          l
        },
        seq_len(ndoc(x)), scndfeature_index,
        SIMPLIFY = FALSE
        )
        names(result) <- docnames(x)
        result
      }
      scndterm_tfidf <- get_scnd_feature(dtmtfidf)
      

      您可以通过比较权重来检查结果:

      maxn <- function(n) function(x) order(x, decreasing = TRUE)[n]
      scndtermcount <- apply(dtmtfidf, 1, function(x)x[maxn(2)(x)])
      

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 2019-10-18
        • 2013-03-01
        • 1970-01-01
        • 2017-07-01
        • 2023-03-08
        • 2018-05-27
        • 2020-09-27
        • 2011-02-24
        相关资源
        最近更新 更多