2016-05-06 8 views
1

Hallo: Ich habe ein Wörterbuch von negativen Begriffen, die von anderen vorbereitet wurde. Ich bin nicht sicher, wie sie die Stemming gemacht haben, aber es sieht so aus, als hätten sie etwas anderes als den Porter Stemer benutzt. Das Wörterbuch hat ein Platzhalterzeichen (*), von dem ich denke, dass es eine Stemming-Funktion ermöglicht. Aber ich weiß nicht, wie ich das mit grep() oder dem tm-Paket im R-Kontext nutzen kann, also habe ich es ausgezogen, in der Hoffnung, einen Weg zu finden, die partielle Übereinstimmung zu grepsen. So sieht das ursprüngliche Wörterbuch wie dieseR: teilweise Übereinstimmung Wörterbuch Begriffe mit grep und tm-Paket

#load libraries 
library(tm) 
#sample dictionary terms for polarize and outlaw 
negative<-c('polariz*', 'outlaw*') 
#strip out wildcard 
negative<-gsub('*', '', negative) 
#test corpus 
test<-c('polarize', 'polarizing', 'polarized', 'polarizes', 'outlaw', 'outlawed', 'outlaws') 
#Here is how R's porter stemmer stems the text 
stemDocument(test) 

Also, wenn ich meinen Corpus Stemmer mit R aufgehalten, Begriffe wie ‚outlaw‘ im Wörterbuch gefunden würden, aber es wäre nicht Begriffe wie ‚polarisiert‘ entsprechen und so, weil sie anders als im Wörterbuch gefunden werden würden.

Also, was ich möchte, ist eine Möglichkeit, das tm-Paket nur exakte Teile jedes Wortes übereinstimmen zu lassen. Ohne meine Dokumente zu stempeln, möchte ich daher in der Lage sein, "Outlaws" und "Outlaws" als "Outlaw" herauszugreifen und "Polariz" in "Polarisiert", "Polarisiert" und "Polarisiert" herauszusuchen. Ist das möglich?

#Define corpus 
test.corp<-Corpus(VectorSource(test)) 
#make Document Term Matrix 
dtm<-documentTermMatrix(test.corp, control=list(dictionary=negative)) 
#inspect 
inspect(dtm) 

Antwort

1

Ich habe keine tm Antworten gesehen, hier ist also eine der quanteda Paket als Alternative verwenden. Es erlaubt Ihnen, "glob" Wildcard-Werte in Ihren Wörterbucheinträgen zu verwenden, die die Standard valuetype für quantecas Wörterbuchfunktionen sind. (Siehe ?dictionary.) Mit diesem Ansatz müssen Sie Ihren Text nicht eindämmen.

library(quanteda) 
packageVersion("quanteda") 
## [1] ‘0.9.6.2’ 

# create a quanteda dictionary, essentially a named list 
negative <- dictionary(list(polariz = 'polariz*', outlaw = 'outlaw*')) 
negative 
## Dictionary object with 2 key entries. 
## - polariz: polariz* 
## - outlaw: outlaw* 

test <- c('polarize', 'polarizing', 'polarized', 'polarizes', 'outlaw', 'outlawed', 'outlaws') 

dfm(test, dictionary = negative, valuetype = "glob", verbose = FALSE) 
## Document-feature matrix of: 7 documents, 2 features. 
## 7 x 2 sparse Matrix of class "dfmSparse" 
##  features 
## docs polariz outlaw 
## text1  1  0 
## text3  1  0 
## text2  1  0 
## text4  1  0 
## text5  0  1 
## text6  0  1 
## text7  0  1 
+0

Das funktioniert tatsächlich perfekt. Jetzt habe ich ein anderes Wörterbuch, obwohl es Einträge mit mehreren Wörtern gibt. – spindoctor