为R中的不同特征分配权重
Assigning weights to different features in R
在 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,banana:3),这样 DFM mydfm 看起来像:
docs apple better banana
text1 5 1 3
我不这么认为,但是你之后可以轻松地做到这一点:
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
这表明需要为 dfm-class 的 weight
方法添加一个选项,以使其更容易,更重要的是不要从中删除 dfm 的 class稀疏矩阵。 dfm 在对象中还有一个 @weights
插槽,旨在记录其加权方式,因此此信息 could/should 也将被保留。
@lukeA 的解决方案使 dfm class 下降了两次(不是他或你的错,而是我的!!),一次在 %*%
中,一次在 <-
中。第一个可以通过使用列式回收和标准 *
而不是矩阵乘法 %*%
来避免,因为我认为没有为 dfm-class 编写方法%*%
(这就是它默认使用 sparseMatrix
方法的原因)。如果您重新分配子矩阵元素,目前无法避免第二种情况,但如果您简单地将一个 dfm-class object 对象替换为另一个对象,则可以避免这种情况。
要以保留 class 的方式创建新的 dfm-class 对象,这是可行的(在这里我通过添加第二个文档和另一个文档使问题稍微复杂一些功能):
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-class-specific 方法来提取诸如列名之类的东西,例如features(mydfm)
而不是 colnames(mydfm)
,尽管它们可能仍然相同。
在 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,banana:3),这样 DFM mydfm 看起来像:
docs apple better banana
text1 5 1 3
我不这么认为,但是你之后可以轻松地做到这一点:
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
这表明需要为 dfm-class 的 weight
方法添加一个选项,以使其更容易,更重要的是不要从中删除 dfm 的 class稀疏矩阵。 dfm 在对象中还有一个 @weights
插槽,旨在记录其加权方式,因此此信息 could/should 也将被保留。
@lukeA 的解决方案使 dfm class 下降了两次(不是他或你的错,而是我的!!),一次在 %*%
中,一次在 <-
中。第一个可以通过使用列式回收和标准 *
而不是矩阵乘法 %*%
来避免,因为我认为没有为 dfm-class 编写方法%*%
(这就是它默认使用 sparseMatrix
方法的原因)。如果您重新分配子矩阵元素,目前无法避免第二种情况,但如果您简单地将一个 dfm-class object 对象替换为另一个对象,则可以避免这种情况。
要以保留 class 的方式创建新的 dfm-class 对象,这是可行的(在这里我通过添加第二个文档和另一个文档使问题稍微复杂一些功能):
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-class-specific 方法来提取诸如列名之类的东西,例如features(mydfm)
而不是 colnames(mydfm)
,尽管它们可能仍然相同。