代码之家  ›  专栏  ›  技术社区  ›  Rahul Chawla

为R中的不同特征指定权重

  •  3
  • Rahul Chawla  · 技术社区  · 10 年前

    在R中制定DFM之前,是否可以将权重分配给不同的特征?

    考虑R中的这个例子

    str="apple is better than banana" mydfm=dfm(str, ignoredFeatures = stopwords("english"), verbose = FALSE)

    DFM mydfm看起来像:

    docs apple better banana
    text1  1      1     1
    

    但是,我想预先指定权重(苹果:5,香蕉:3),这样DFM mydfm看起来像:

    docs apple better banana
    text1  5      1     3
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   lukeA    10 年前

    我不这么认为,不过事后你可以轻松做到:

    library(quanteda)
    str <- "apple is better than banana"
    mydfm <- dfm(str, ignoredFeatures = stopwords("english"), verbose = FALSE)
    idx <- which(names(weights) %in% colnames(mydfm))
    mydfm[, names(weights)[idx]] <-  mydfm[, names(weights)[idx]] %*% diag(weights[idx])
    mydfm
    # 1 x 3 sparse Matrix of class "dgCMatrix"
    #        features
    # docs    apple better banana
    #   text1     5      1      3
    
        2
  •  0
  •   Ken Benoit    10 年前

    这表明需要向 weight 方法,使其更容易,更重要的是不从稀疏矩阵中剥离dfm类。dfm还具有 @weights 对象中的插槽,用于记录其加权方式,因此该信息也可以/应该保留。

    @lukeA的解决方案两次删除dfm类(不是他或你的错,而是我的错!!),一次在 %*% 再次在 <- 通过使用柱状循环和标准 * 而不是矩阵乘法 %*% ,因为我认为没有为dfm类编写方法 %*% (这就是为什么它默认为 sparseMatrix 方法)。如果重新分配子矩阵元素,第二种情况目前无法避免,但如果简单地将一个dfm类对象对象替换为另一个,则可以避免。

    要以保留类的方式创建新的dfm类对象,这是可行的(在这里,我通过添加第二个文档和另一个特性使问题稍微复杂一些):

    str <- c("apple is better than banana", "banana banana apple much better")
    weights <- c(apple = 5, banana = 3, much = 0.5)
    mydfm <- dfm(str, ignoredFeatures = stopwords("english"), verbose = FALSE)
    
    # use name matching for indexing, sorts too, returns NA where no match is found
    newweights <- weights[features(mydfm)]
    # reassign 1 to non-matched NAs
    newweights[is.na(newweights)] <- 1
    
    # works because of column-wise recycling of the vector
    mydfm * newweights
    ## Document-feature matrix of: 2 documents, 4 features.
    ## 2 x 4 sparse Matrix of class "dfmSparse"
    ##        features
    ## docs    apple better banana much
    ##   text1     5    3.0      5  0  
    ##   text2     1    0.5      2  0.5
    

    还有一个注意事项:我鼓励使用dfm类特定的方法来提取列名等内容,例如。 features(mydfm) 而不是 colnames(mydfm) ,尽管这些可能仍然相同。