2016-04-23 14 views
1

RにDFMを作成する前に、異なるフィーチャにウェイトを割り当てることは可能ですか?Rの異なるフィーチャにウェイトを割り当てる

DFMのmydfmがどのように見えるR

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

でこの例を考えてみましょう:私はウェイト割り当てたい、

docs apple better banana 
text1 1  1  1 

しかし、(:5、バナナ:リンゴを3)事前に、なるようにDFM mydfmは次のようになります。

docs apple better banana 
text1 5  1  3 

答えて

1

私はそう思わないと思いますOそれは後で:

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

はい、動作します、ありがとう! もう1つの疑問... 1つの列にすべての機能があり、隣接する列にそれぞれの重みがある.csvファイルから重みをインポートしたかったのです。 'ft = data $ features' ' wt = data $ weights' ftおよびwtオブジェクトを使用して、このフォームのベクトルを生成することはできますか?weights < - c( "apple" = 5、 "banana" = 3) –

+0

ようこそ。あなたの質問に: 'weights < - setNames(wt、ft)' – lukeA

+0

'mydfm [、names(weight)]' '名前(重み)'が 'str < - 'の機能のサブセットである場合にのみ機能します。 "'それ以外の場合はエラーとなります。 同じ文字列で 'weights < - c(" apple "= 5、" banana "=" 3 "、" grapes "= 4)'しようとしましたが、このエラーが発生します 'intI(j、n = x @Dim [2]、dn [[2]、give.dn = FALSE): 無効な文字インデックス ' –

0

これは、DFM-クラスのweightメソッドにオプションを追加するには、このを容易にするために、より重要なのは疎行列からDFMのクラスを削除する必要はありませんを指します。 dfmには、重み付けされた方法の記録を保持するように設計されたオブジェクト内の@weightsスロットもあります。したがって、この情報は保持される必要があります。

@ lukeAのソリューションは、%*%<-に1回ずつ、dfmクラスを2回削除します(彼または自分の過失ではありませんが!!)。最初は、マトリックス乗算%*%の代わりに、列方向のリサイクルと標準*を使用することで避けることができます。これは、%*%の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 

クラスを維持する方法で、新しいDFMクラスのオブジェクトを作成するには、(第2の文書と別の機能を追加することで、ここで私はこの問題は、もう少し複雑になっている)、これはうまくいきます

もう1つ注意してください:列名のようなものを抽出するためにdfm-class固有のメソッドを使用することをお勧めします。 features(mydfm)ではなく、colnames(mydfm)となります。

関連する問題