2017-08-18 2 views
1

Est-ce que quelqu'un a réussi à créer une énorme fonction de recherche/remplacement/extrait de code de travail qui échange des bigrams connus dans une base de données?Comment faire un remplacement/tokenization à grande échelle dans R tm_map gsub à partir d'une liste?

Voici un exemple. Je suis capable de faire des remplacements de pseudos-twosies mais je veux vraiment tirer parti d'un lexique connu d'environ 800 termes que je veux trouver-remplacer pour les transformer en unités de mots avant la génération de DTM. Par exemple, je souhaite transformer "Google Analytics" en "google-analytics".

Je sais que c'est théoriquement possible; Essentiellement, une liste de mots de passe personnalisés fait presque la même chose, sauf sans le remplacement. Et il semble stupide d'avoir juste 800 gsubs.

Voici mon code actuel. Toute aide/pointeur/URL/RTFM serait grandement appréciée.

mystopwords <- read.csv(stopwords.file, header = FALSE) 
mystopwords <- as.character(mystopwords$V1) 
mystopwords <- c(mystopwords, stopwords()) 

# load the file 

df <- readLines(file.name) 

# transform to corpus 

doc.vec <- VectorSource(df) 
doc.corpus <- Corpus(doc.vec) 
# summary(doc.corpus) 

## Hit known phrases 

docs <- tm_map(doc.corpus, content_transformer(gsub), pattern = "Google Analytics", replacement = "google-analytics") 

## Clean up and fix text - note, no stemming 

doc.corpus <- tm_map(doc.corpus, content_transformer(tolower)) 
doc.corpus <- tm_map(doc.corpus, removePunctuation,preserve_intra_word_dashes = TRUE) 
doc.corpus <- tm_map(doc.corpus, removeNumbers) 
doc.corpus <- tm_map(doc.corpus, removeWords, c(stopwords("english"),mystopwords)) 
doc.corpus <- tm_map(doc.corpus, stripWhitespace) 

Répondre

1

La bibliothèque corpus vous permet de combiner des phrases de plusieurs mots en jetons simples. Quand il y a plusieurs correspondances, il choisit la plus longue:

library(corpus) 
text_tokens("I live in New York City, New York", 
      combine = c("new york city", "new york")) 

# [[1]] 
# [1] "i"    "live"   "in"   "new_york_city" 
# [5] ","    "new_york" 

Par défaut, le connecteur est le caractère underscore (_), mais vous pouvez spécifier un connecteur alternatif à l'aide du connector argument`.

Dans votre exemple, vous pouvez faire ce qui suit pour obtenir une matrice document par terme:

mycombine <- c("google analytics", "amazon echo") # etc. 
term_matrix(doc.corpus, combine = mycombine, 
      drop_punct = TRUE, drop_number = TRUE, 
      drop = c(stopwords_en, mystopwords)) 

Notez également que corpus conserve des traits d'union intra-mot, il n'y a donc pas besoin d'une option preserve_intra_word_dashes .

Il peut être fastidieux de spécifier les options de prétraitement dans chaque appel de fonction. Si vous le souhaitez, vous pouvez convertir votre corps à un corpus_frame (un data.frame avec un spécial texte colonne), puis définissez les options de pré-traitement (le text_filter):

corpus <- as_corpus_frame(doc.corpus) 
text_filter(corpus) <- text_filter(combine = mycombine, 
            drop_punct = TRUE, 
            drop_number = TRUE, 
            drop = c(stopwords_en, mystopwords)) 

Après , vous pouvez simplement appeler

term_matrix(corpus) 

Il y a beaucoup plus d'informations sur corpus, y compris une vignette d'introduction, à http://corpustext.com