2016-09-12 2 views
0

Je me demande comment obtenir le terme poids de fréquence dans tm packge qui est (tf = terme/termes totaux dans le document) `Comment puis-je configurer le poids des termes TF dans le corpus en utilisant le paquet 'tm' dans R

MyMatrix <- DocumentTermMatrix(a, control = list(weight= weightTf)) 

Après que j'utilise ce poids, il montre la fréquence du terme non TF poids comme celui-ci

Doc(1) 1 0 0 3 0 0 2 
Doc(2) 0 0 0 0 0 0 0 
Doc(3) 0 5 0 0 0 0 1 
Doc(4) 0 0 0 2 2 0 0 
Doc(5) 0 4 0 0 0 0 1 
Doc(6) 5 0 0 0 1 0 0 
Doc(7) 0 5 0 0 0 0 0 
Doc(8) 0 0 0 1 0 0 7 
+0

Je sais que ce n'est pas le paquetage tm, mais j'aime utiliser le paquetage tidytext. 'bind_tf_idf' est la fonction que vous pouvez utiliser. Le blog suivant de l'auteur donne un bon aperçu sur le paquet http://juliasilge.com/blog/Life-Changing-Magic/ – PhiSeu

+1

Vous utilisez l'option 'weighting' pas' weight' –

+1

Possible duplicate of [Essayer d'obtenir tf-idf pondération fonctionnant dans R] (http://stackoverflow.com/questions/14820590/trying-to-get-tf-idf-weighting-working-in-r) –

Répondre

0

par exemple

library(tm) 
corp <- Corpus(VectorSource(c(doc1="hello world", doc2="hello new world"))) 
myfun <- WeightFunction(function(m) { 
    cs <- slam::col_sums(m) 
    m$v <- m$v/cs[m$j] 
    return(m) 
}, "Term Frequency by Total Document Term Frequency", "termbytot") 
dtm <- DocumentTermMatrix(corp, control = list(weighting = myfun)) 
inspect(dtm) 
# <<DocumentTermMatrix (documents: 2, terms: 3)>> 
# Non-/sparse entries: 5/1 
# Sparsity   : 17% 
# Maximal term length: 5 
# 
#  Terms 
# Docs  hello  new  world 
# 1 0.5000000 0.0000000 0.5000000 
# 2 0.3333333 0.3333333 0.3333333 
0

Quelque chose comme myMatrix/rowSums (MaMatrice) devrait vous donner le résultat souhaité.

Mais si un document n'a pas termes (DTM a tous les zéros pour le document) ce qui précède entraînera une rangée de Nans comme suit (comme dans votre cas)

Doc(1) 0.1111111 0 0 0.5555556 0.1111111 0.2222222 0.0000000 
Doc(2) 0.0000000 1 0 0.0000000 0.0000000 0.0000000 0.0000000 
Doc(3)  NaN NaN NaN  NaN  NaN  NaN  NaN 
Doc(4) 1.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000 
Doc(5) 0.0000000 0 0 0.0000000 0.2857143 0.5714286 0.1428571 

Ainsi, une meilleure approche est :

t(apply(myMatrix, 1, function(x) if(sum(x) != 0) x/sum(x) else x)) 

avec le résultat souhaité:

Doc(1) 0.1111111 0 0 0.5555556 0.1111111 0.2222222 0.0000000 
Doc(2) 0.0000000 1 0 0.0000000 0.0000000 0.0000000 0.0000000 
Doc(3) 0.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000 
Doc(4) 1.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000 
Doc(5) 0.0000000 0 0 0.0000000 0.2857143 0.5714286 0.1428571 
+0

Veuillez fournir un exemple de code et expliquer comment cela aiderait –

+0

Cette approche causes ne peut pas allouer vecteur de taille 489 Kb – user3655888

+0

Je suppose que as.matrix (myMatrix) a le problème de mémoire: s'il vous plaît se référer à http://stackoverflow.com/questions/6860715/converting-a-document-term-matrix -into-a-matrix-avec-lots-de-données-provoque-survole et utilise maMatrice = as.big.matrix (x = as.matrix (myMatrix)). –