2013-06-07 12 views
6

Ho un corpus di 26 file di testo semplice, ciascuno compreso tra 12 e 148kb, per un totale di 1,2 Mb. Sto usando R su un laptop Windows 7.Dimensione massima ragionevole per stemCompletamento in tm?

Ho eseguito tutte le normali operazioni di pulizia (stopword, stopword personalizzate, lettere minuscole, numeri) e voglio eseguire il completamento dello stelo. Sto usando il corpus originale come dizionario, come mostrato negli esempi. Ho provato un paio di semplici vettori per assicurarmi che avrebbe funzionato del tutto (con circa 5 termini) e lo ha fatto e molto rapidamente.

exchanger <- function(x) stemCompletion(x, budget.orig) 
budget <- tm_map(budget, exchanger) 

Funziona da ieri alle 16:00! In R Studio in diagnostica, il registro delle richieste mostra nuove richieste con diversi numeri di richiesta. Task Manager lo mostra usando un po 'di memoria, ma non una quantità pazzesca. Non voglio fermarlo, perché se è quasi arrivato? Qualche altra idea su come controllare i progressi - sfortunatamente è un corpus volatile? Idee su quanto dovrebbe durare? Ho pensato di usare il vettore dei nomi dtm come dizionario, tagliato al più frequente (o alto tf-idf), ma sono riluttante ad uccidere questo processo.

Questo è un normale computer portatile Windows 7 con molte altre funzionalità in esecuzione.

Questo corpus è troppo grande per stemCompletion? A parte il passaggio a Python, c'è un modo migliore per eseguire stemCompletion o lemmatize vice stem - la mia ricerca sul web non ha dato alcuna risposta.

risposta

1

non posso dare una risposta definitiva senza dati che riproduce il tuo problema, ma direi il collo di bottiglia proviene dalla linea folllowing dal codice sorgente di stemCompletion:

possibleCompletions <- lapply(x, function(w) grep(sprintf("^%s", w), dictionary, value = TRUE)) 

Dopo di che, è dato' ve mantenuto l'euristica di completamento sul default di "prevalente", questo accade:

possibleCompletions <- lapply(possibleCompletions, function(x) sort(table(x), decreasing = TRUE)) 
structure(names(sapply(possibleCompletions, "[", 1)), names = x) 

Quella prima linea loop attraverso ogni parola nel corpus e la confronta con il dizionario per possibili completamenti. Immagino che tu abbia molte parole che appaiono molte volte nel tuo corpus. Ciò significa che la funzione viene chiamata più volte solo per dare la stessa risposta. Una versione forse più veloce (a seconda di come molte parole erano ripete e la frequenza con cui sono state ripetute) sarebbe simile a questa:

y <- unique(x) 

possibleCompletions <- lapply(y, function(w) grep(sprintf("^%s", w), dictionary, value = TRUE)) 

possibleCompletions <- lapply(possibleCompletions, function(x) sort(table(x), decreasing = TRUE)) 

z <- structure(names(sapply(possibleCompletions, "[", 1)), names = y) 

z[match(x, names(z))] 

Quindi loop solo attraverso i valori unici di x piuttosto che ogni valore di x. Per creare questa versione rivista del codice, è necessario scaricare l'origine da CRAN e modificare la funzione (l'ho trovata nel completamento.R nella cartella R).

Oppure potresti semplicemente voler usare Python per questo.

+0

grazie per questa risposta - non è comodo con i problemi con la fonte ... ma potrei inserire questi comandi in uno script nella finestra di script di RStudio? Immagino solo se inserisco l'intero sorgente, che è essenzialmente come modificare la sorgente e salvare? – ChristinaP

+0

Hai esattamente ragione. Copia la funzione completa dall'origine in uno script separato e quindi apporta le tue modifiche. Ogni volta che è necessario utilizzarlo, caricare il pacchetto, quindi caricare la funzione personalizzata per sostituire ciò che è stato caricato dal pacchetto. – SchaunW

0

Cristina, seguendo Schaun ti consiglio di usare solo parole univoche per applicare il completamento del gambo. Voglio dire, è facile per il tuo PC completare le tue parole uniche che eseguono il completamento in tutti i tuoi corpus (con tutte le ripetizioni).

  1. Prima di tutto, prendi le parole uniche del tuo corpo.Per Esempio:

    unico $ testo < - unico (di bilancio)

  2. loro, è possibile ottenere le parole uniche dal testo originale

    unique_budget.orig < - unico (budget.orig)

  3. Ora, è possibile applicare la stemcomplection per le vostre parole unieque

    unico $ completition < - budget%>% stemCompletion (dizionario = Unique_ budget.orig)

  4. Ora hai un oggetto con tutte le parole del tuo corpo e il loro completamento. devi solo applicare un join tra il tuo corpus e l'oggetto unico. Assicurati che entrambi gli oggetti abbiano lo stesso nome di variabile per le parole senza il completamento: questa gonne è la chiave.

Questo ridurrà il numero di operazioni che il PC deve fare.

Problemi correlati