为R中的不同要素指定权重

时间:2016-04-23 20:17:46

标签: r text-mining tm quanteda

在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

但是,我想事先指定权重(apple:5,banana:3),以便DFM mydfm看起来像:

docs apple better banana
text1  5      1     3

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

这指出需要为dfm-class的weight方法添加一个选项,以使这更容易,更重要的是不要从稀疏矩阵中去除dfm类。 dfm在对象中还有一个@weights槽,用于记录加权的方式,因此可以/应该保留这些信息。

@ lukeA的解决方案两次丢弃dfm类(不是他或你的错,而是我的!!),一次放在%*%中,再放在<-中。第一个可以通过使用列式回收和标准*而不是矩阵乘法%*%来避免,因为我认为没有为{{1}的dfm-class编写方法}(这就是为什么它默认为%*%方法)。如果重新分配子矩阵元素,则目前无法避免第二个,但如果只是将一个dfm-class对象替换为另一个,则可以避免使用。

要以保留类的方式创建新的dfm-class对象,这将起作用(这里我通过添加第二个文档和另一个功能使问题稍微复杂一些):

sparseMatrix

还有一点需要注意:我鼓励使用特定于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 而非features(mydfm),即使这些可能仍然相同。