我有大量文檔,並且想使用text2vec和LDA(Gibbs Sampling)進行主題建模。使用text2vec包進行文本預處理和主題建模
步驟我需要的是爲(按順序):
從文本中刪除數字和符號
library(stringr) docs$text <- stringr::str_replace_all(docs$text,"[^[:alpha:]]", " ") docs$text <- stringr::str_replace_all(docs$text,"\\s+", " ")
移除停止字
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)
通過替換同義詞條款
我有一個excel文件,其中第一列是主詞,同義詞列在第二,第三和...列中。我想用主詞(第1列)替換所有的同義詞。每個術語可以有不同數量的同義詞。下面是使用「TM」包的代碼的一個例子(但我對到所述一箇中text2vec包):
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)
轉換爲文檔詞矩陣
dtm <- create_dtm(it, vectorizer)
應用LDA模型上的文檔詞矩陣
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)
步驟3中的MyCorpurs是使用「tm」包獲得的語料庫。步驟2和步驟3不一起工作,因爲步驟2的輸出是詞彙表,但步驟3的輸入是「tm」語料庫。
我的第一個問題是,我怎麼能使用text2vec包(和兼容包)來做所有的步驟,因爲我發現它非常高效;感謝Dmitriy Selivanov。
第二:如何在步驟5中設置LDA中參數的最優值?是否可以根據數據自動設置它們?
感謝曼努埃爾比克爾在我的文章更正。
感謝, 山姆
非常感謝您的回答。其實我有大量的拼寫錯誤和縮寫的數據,也是同一個詞的不同縮寫。主詞只是一個詞,但同義詞可以是諸如「熱水」之類的詞組。我需要先刪除停用詞(我的問題中的第2步),然後用主詞替換多個同義詞。我如何按順序完成這兩個步驟,即先刪除停用詞,然後替換同義詞?我做了所有使用「tm」和「topicmodels」包的工作,但它們非常慢,我想切換到text2vec。 –
我意識到你的問題的一部分已經在其他地方得到了回答。我已經相應地更新了我的答案,幷包含了該答案的鏈接。 –
感謝Manuel的更新。在ngram之前刪除一些停用詞讓我更容易關注重要的ngrams /短語。例如,「返回工作」,「返回工作」,「返回工作」全部被替換爲返工。我有很多這種類型的短語。 –