2016-04-23 89 views
1

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

考虑中的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 

回答

1

我不这么认为,但是您可以轻松地d ·其算账:

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 
+0

是的,它的工作原理,谢谢! 一个额外的疑问... 我想从一个.csv文件导入权重,其中一列具有所有功能,而相邻列具有各自的权重。我可以使用ft和wt对象来生成这种形式的'weight < - c(“apple”= 5,“banana”= 3)''的向量。 –

+0

不客气。对你的问题:'weight < - setNames(wt,ft)' – lukeA

+0

'mydfm [,names(weights)]'只有当'names(权重)'是'str < - “中的特征的子集时才有效苹果比香蕉好“',否则会出错。 我试着用'weight < - c(“apple”= 5,“banana”= 3,“grapes”= 4)'在同一个字符串上,并给出了这个错误 intI(j,n = x @Dim [2],dn [[2]],give.dn = FALSE): 无效字符索引' –

0

这指向需要的选项添加到weight方法DFM级,使这个更容易,更重要的是不能从稀疏矩阵剥离类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),尽管这些可能会保持等效。