Ich habe eine große Anzahl von Dokumenten und ich möchte Thema Modellierung mit Text2Vec und LDA (Gibbs Sampling) tun.Text Vorverarbeitung und Topic-Modellierung mit text2vec Paket
Schritte ich brauche sind (in der Reihenfolge):
Zahlen und Symbole aus dem Text entfernen
library(stringr) docs$text <- stringr::str_replace_all(docs$text,"[^[:alpha:]]", " ") docs$text <- stringr::str_replace_all(docs$text,"\\s+", " ")
Entfernen Stoppwörter
library(text2vec) library(tm) stopwords <- c(tm::stopwords("english"),custom_stopwords) prep_fun <- tolower tok_fun <- word_tokenizer tok_fun <- word_tokenizer tokens <- docs$text%>% prep_fun %>% tok_fun it <- itoken(tokens, ids = docs$id, progressbar = FALSE) v <- create_vocabulary(it, stopwords = stopwords) %>% prune_vocabulary(term_count_min = 10) vectorizer <- vocab_vectorizer(v)
Ersetzen Synonyme durch Begriffe
Ich habe eine Excel-Datei, in der erste Spalte ist das Hauptwort und Synonyme sind in der zweiten, dritten und ... Spalten aufgeführt. Ich möchte alle Synonyme durch Hauptwörter ersetzen (Spalte # 1). Jeder Begriff kann eine unterschiedliche Anzahl von Synonymen haben. Hier ist ein Beispiel für Code "tm" Paket mit (aber ich bin interessiert an den in text2vec Paket):
replaceSynonyms <- content_transformer(function(x, syn=NULL)
{Reduce(function(a,b) {
gsub(paste0("\\b(", paste(b$syns, collapse="|"),")\\b"), b$word, a, perl = TRUE)}, syn, x) })
l <- lapply(as.data.frame(t(Synonyms), stringsAsFactors = FALSE), #
function(x) {
x <- unname(x)
list(word = x[1], syns = x[-1])
})
names(l) <- paste0("list", Synonyms[, 1])
list2env(l, envir = .GlobalEnv)
synonyms <- list()
for (i in 1:length(names(l))) synonyms[i] = l[i]
MyCorpus <- tm_map(MyCorpus, replaceSynonyms, synonyms)
Convert Begriff Matrix zu dokumentieren
dtm <- create_dtm(it, vectorizer)
Nehmen LDA-Modell auf Dokument Begriff Matrix
doc_topic_prior <- 0.1 # can be chosen based on data? lda_model <- LDA$new(n_topics = 10, doc_topic_prior = doc_topic_prior, topic_word_prior = 0.01) doc_topic_distr <- lda_model$fit_transform(dtm, n_iter = 1000, convergence_tol <- 0.01, check_convergence_every_n = 10)
MyCorpurs in Schritt 3 ist der Korpus, der unter Verwendung des "tm" -Pakets erhalten wurde. Schritt 2 und Schritt 3 arbeiten nicht zusammen, da die Ausgabe von Schritt 2 vocab ist, aber die Eingabe für Schritt 3 ist ein "tm" -Korpus.
Meine erste Frage, hier ist, wie kann ich alle Schritte mit Text2vec-Paket (und kompatible Pakete) tun, wie ich es sehr effizient fand; Danke an Dmitri Selivanow.
Zweitens: Wie stellen wir optimale Werte für Parameter in LDA in Schritt 5 ein? Ist es möglich, sie automatisch anhand von Daten zu setzen?
Dank Manuel Bickel für Korrekturen in meinem Beitrag.
Danke, Sam
Vielen Dank für Ihre Antwort. Tatsächlich habe ich große Daten mit vielen Rechtschreibfehlern und Abkürzungen; auch verschiedene Abkürzungen für das gleiche Wort. Das Hauptwort ist nur ein Wort, aber Synonyme können Sätze wie "heißes Wasser" sein. Ich muss zuerst Stoppwörter entfernen (Schritt 2 in meiner Frage) und dann mehrere Synonyme durch das Hauptwort ersetzen. Wie kann ich diese zwei Schritte der Reihe nach durchführen, d. H. Zuerst Stopwörter entfernen und dann Synonyme ersetzen? Ich habe all meine Arbeit mit den Paketen "tm" und "topicmodels" gemacht, aber sie sind sehr langsam und ich möchte zu text2vec wechseln. –
Ich erkannte, dass ein Teil Ihrer Frage bereits an anderer Stelle beantwortet wurde. Ich habe meine Antwort entsprechend aktualisiert und einen Link zu dieser Antwort eingefügt. –
Danke Manuel für das Update. Das Entfernen einiger Stoppwörter vor dem Ngramm erleichtert es mir, mich auf wichtige Ngramme/Phrasen zu konzentrieren. Zum Beispiel werden "zur Arbeit zurückkehren", "am Arbeitsplatz zurückkehren", "Arbeit zurückgeben" alle durch Rückgabe ersetzt. Ich habe viele dieser Art von Phrasen. –