2016-10-04 42 views
1

我是文本分析的新手,目前正在嘗試使用R中的#Quanteda包來滿足我的需求。我想爲一些特定的分配不同的數字權重並測試模型的準確性。我嘗試了在其他線程中提到的方法,通過保留dfm類 Assigning weights to different features in R但是無法獲得正確的輸出。任何幫助,將不勝感激。爲quanteda dfm中的不同項指定不同的數字權重

這裏是我試過

##install.packages("quanteda") 
require(quanteda) 
str <- c("apple is better than banana", "banana banana apple much 
better","much much better new banana") 

weights <- c(apple = 5, banana = 3, much = 0.5) 
myDfm <- dfm(str, remove = stopwords("english"), verbose = FALSE) 

#output 
##Document-feature matrix of: 3 documents, 5 features. 
##3 x 5 sparse Matrix of class "dfmSparse" 
## features 
##docs apple better banana much new 
##text1  1  1  1 0 0 
##text2  1  1  2 1 0 
##text3  0  1  1 2 1 

newweights <- weights[featnames(myDfm)] 
# reassign 1 to non-matched NAs 
newweights[is.na(newweights)] <- 1 

# this does not works for me - see the output 
myDfm * newweights 

##output 
##Document-feature matrix of: 3 documents, 5 features. 
##3 x 5 sparse Matrix of class "dfmSparse" 
## features 
##docs apple better banana much new 
##text1  5 0.5 1.0 0 0 
##text2  1 1.0 6.0 5 0 
##text3  0 5.0 0.5 2 1 

環境細節

平臺x86_64的-W64-mingw32的
拱x86_64的
OS的mingw32
系統x86_64的,mingw32的
狀態
大3
未成年人2.2
2015年
月08
日14
SVN轉69053
咒罵r
version.string [R版本3.2.2(2015年8月14日) 暱稱消防安全

+0

請在https://github.com/kbenoit/quanteda/issues上提出此問題。謝謝! –

回答

0

這顯然有什麼與dfm類所基於的Matrix包中的*運營商有關。這工作:

> matrix(1:6, nrow = 3) * c(2, 3) 
    [,1] [,2] 
[1,] 2 12 
[2,] 6 10 
[3,] 6 18 

但這並不:

> Matrix::Matrix(matrix(1:6, nrow = 3)) * c(2, 3) 
Error in Matrix(matrix(1:6, nrow = 3)) * c(2, 3) : 
    length of 2nd arg does not match dimension of first 

,直到我們得到這個固定的,這裏是一個解決辦法:使權重向量對應元素乘元素的DFM。

myDfm * rep(newweights, each = ndoc(myDfm)) 
## Document-feature matrix of: 3 documents, 5 features. 
## 3 x 5 sparse Matrix of class "dfmSparse" 
##  features 
## docs apple better banana much new 
## text1  5  1  3 0  0 
## text2  5  1  6 0.5 0 
## text3  0  1  3 1.0 1 

更新時間:

這不是一個錯誤,但一個功能,與如何矢量newweights被回收,以符合它正在與相乘的矩陣做。 ř回收使用列主順序此載體中,所以它是創建以下矩陣在本例中(雖然不如你希望它),其中該工作,以執行元件逐元素乘法:

matrix(rep(newweights, 3), nrow = 3) 
##  [,1] [,2] [,3] [,4] [,5] 
## [1,] 5 0.5 1.0 1 3.0 
## [2,] 1 1.0 3.0 5 0.5 
## [3,] 3 5.0 0.5 1 1.0 

如果您想使用您的原始策略,這將工作:

t(t(myDfm) * newweights) 
## Document-feature matrix of: 3 documents, 5 features (26.7% sparse). 
## 3 x 5 sparse Matrix of class "dfmSparse" 
##  features 
## docs apple better banana much new 
## text1  5  1  3 0  0 
## text2  5  1  6 0.5 0 
## text3  0  1  3 1.0 1 

因爲回收現在發生在功能上而不是通過文檔。

+0

太好了,謝謝。建議的解決方法有效。 – Sanjay

相關問題