2016-04-09 12 views
2

Ich arbeite gerade mit dem Quanteda-Paket in R, und ich würde gerne die Ngramme einer Reihe von Wortstämmen berechnen, um schnell abschätzen zu können, welche Inhaltswörter sich nahe beieinander befinden . Wenn ich es versuche:Wie man alle Wörter in einem ngram, mit quanteda eindrücken?

twitter.files <- textfile(files) 
twitter.docs <- corpus(twitter.files) 
twitter.semantic <- twitter.docs %>% 
    dfm(removeTwitter = TRUE, ignoredFeatures = stopwords("english"), 
     ngrams = 2, skip = 0:3, stem = TRUE) %>% 
    trim(minCount = 50, minDoc = 2) 

Es stammt nur das letzte Wort in den Bigrammen. wenn ich versuche, jedoch Einhalt zu gebieten zuerst:

twitter.files <- textfile(files) 
twitter.docs <- corpus(twitter.files) 
stemmed_no_stops <- twitter.docs %>% 
    toLower %>% 
    tokenize(removePunct = TRUE, removeTwitter = TRUE) %>% 
    removeFeatures(stopwords("english")) %>% 
    wordstem 

twitter.semantic <- stemmed_no_stops %>% 
    skipgrams(n = 2, skip = 0:2) %>% 
    dfm %>% 
    trim(minCount=25, minDoc = 2) 

Dann ist Quanteda nicht, wie mit der dämmt Liste zu arbeiten; Ich werde den Fehler:

assignment of an object of class “NULL” is not valid for @‘ngrams’ 
in an object of class “dfmSparse”; is(value, "integer") is not TRUE 

Gibt es einen Zwischenschritt ich ein DFM auf den dämmt Worte benutzen tun können, oder dfm zu sagen, zuerst Einhalt zu gebieten und zu tun ngrams Sekunde?

+0

Ich denke, dass Sie vielleicht anwenden Wortstamms auf die Texte dann skipgrams direkt, also nicht konvertieren zu corpus zuerst, gelten nur die Funktionen ein Vektor von Texten. – lmkirvan

+0

Ich kann das irgendwie zum Arbeiten bringen, indem ich Dateien mit readLines laden, sie in Token zerlegen, remoteFeatures und wordstem sie lösche und dann entweder die Ergebnisse als Stemmed-Dateien speichere oder sie in einen Korpus zur Verwendung bringe. Es funktioniert, und ich kann die Ergebnisse so zwischenspeichern, aber ich hoffe immer noch, einen Weg zu finden, '' Stem' und 'Ngrams' schön zusammen zu spielen. –

Antwort

2

Ich habe versucht, Ihr Beispiel mit den ersten Texten zu reproduzieren. Unter Verwendung eines reproduzierbaren Beispiel aus der Paketdaten, arbeitete Code für mich:

twitter.docs <- corpus(data_corpus_inaugural[1:5]) 
stemmed_no_stops <- twitter.docs %>% 
    tokens(remove_punct = TRUE, remove_twitter = TRUE) %>% 
    tokens_tolower() %>% 
    tokens_remove(stopwords("english")) %>% 
    tokens_wordstem() 
lapply(stemmed_no_stops, head) 
## $`1789-Washington` 
## [1] "fellow-citizen" "senat"   "hous"   "repres"   "among"   
## [6] "vicissitud"  
## 
## $`1793-Washington` 
## [1] "fellow" "citizen" "call" "upon" "voic" "countri" 
## 
## $`1797-Adams` 
## [1] "first" "perceiv" "earli" "time" "middl" "cours" 
## 
## $`1801-Jefferson` 
## [1] "friend" "fellow" "citizen" "call"  "upon"  "undertak" 
## 
## $`1805-Jefferson` 
## [1] "proceed" "fellow" "citizen" "qualif" "constitut" "requir" 

twitter.semantic <- stemmed_no_stops %>% 
    tokens_skipgrams(n = 2, skip = 0:2) %>% 
    dfm %>% 
    dfm_trim(min_count = 5, min_doc = 2) 
twitter.semantic[1:5, 1:4] 
# Document-feature matrix of: 5 documents, 4 features. 
# 5 x 4 sparse Matrix of class "dfmSparse" 
#     features 
# docs    fellow_citizen let_u unit_state foreign_nation 
# 1789-Washington    2  0   2    0 
# 1793-Washington    1  0   0    0 
# 1797-Adams     0  0   3    5 
# 1801-Jefferson    5  5   0    0 
# 1805-Jefferson    8  2   1    1 
+1

Ok, habe es jetzt funktioniert. Vielen Dank! –

Verwandte Themen