是否有更快的替代R quanteda :: tokens_lookup()?
我在' quanteda'中使用了令牌()。 R包用2000文档标记数据框。每个文件是50 - 600字。这在我的PC上需要几秒钟(Microsoft R Open 3.4.1,Intel MKL(使用2个内核))。
我有一个字典对象,由近60万字(TERMS)的数据框及其对应的引理(PARENT)构成。有8万个不同的引理。
我使用tokens_lookup()通过字典中找到的词条替换token-list中的元素。但这需要至少1.5小时。 这个功能对我的问题来说太慢了。有没有更快的方法,还有一个令牌列表?
我想直接转换令牌列表,在使用字典后制作ngrams。如果我只想要onegrams,我可以通过将文档特征矩阵与字典连接起来轻松完成。
我怎样才能更快地完成这项工作?将令牌列表转换为数据帧,与字典连接,转换回有序令牌列表?
以下是示例代码:
library(quanteda)
myText <- c("the man runs home", "our men ran to work")
myDF <- data.frame(myText)
myDF$myText <- as.character(myDF$myText)
tokens <- tokens(myDF$myText, what = "word",
remove_numbers = TRUE, remove_punct = TRUE,
remove_symbols = TRUE, remove_hyphens = TRUE)
tokens
# tokens from 2 documents.
# text1 :
# [1] "the" "man" "runs" "home"
#
# text2 :
# [1] "our" "men" "ran" "to" "work"
term <- c("man", "men", "woman", "women", "run", "runs", "ran")
lemma <- c("human", "human", "human", "humen", "run", "run", "run")
dict_df <- data.frame(TERM=term, LEMMA=lemma)
dict_df
# TERM LEMMA
# 1 man human
# 2 men human
# 3 woman human
# 4 women humen
# 5 run run
# 6 runs run
# 7 ran run
dict_list <- list( "human" = c("man", "men", "woman", "women") , "run" = c("run", "runs", "ran"))
dict <- quanteda::dictionary(dict_list)
dict
# Dictionary object with 2 key entries.
# - human:
# - man, men, woman, women
# - run:
# - run, runs, ran
tokens_lemma <- tokens_lookup(tokens, dictionary=dict, exclusive = FALSE, capkeys = FALSE)
tokens_lemma
#tokens from 2 documents.
# text1 :
# [1] "the" "human" "run" "home"
#
# text2 :
# [1] "our" "human" "run" "to" "work"
tokens_ngrams <- tokens_ngrams(tokens_lemma, n = 1:2)
tokens_ngrams
#tokens from 2 documents.
# text1 :
# [1] "the" "human" "run" "home" "the_human" "human_run" "run_home"
#
# text2 :
# [1] "our" "human" "run" "to" "work" "our_human" "human_run" "run_to" "to_work"
答案 0 :(得分:1)
我没有引用自己的引理列表,但这是隐藏令牌类型的最快方法。请尝试告诉我需要多长时间(应该在几秒钟内完成)。
tokens_convert <- function(x, from, to) {
type <- attr(x, 'types')
type_new <- to[match(type, from)]
type_new <- ifelse(is.na(type_new), type, type_new)
attr(x, 'types') <- type_new
quanteda:::tokens_recompile(x)
}
tokens_convert(tokens, dict_df$TERM, dict_df$LEMMA)
答案 1 :(得分:0)
我使用quanteda和udpipe的组合来对我的语料库进行标记化和词形还原。不知道与其他方法相比它有多快。请参阅以下示例:
library(udpipe)
library(quanteda)
dl <- udpipe_download_model(language = "dutch")
udmodel_dutch <- udpipe_load_model(file = "dutch-ud-2.0-170801.udpipe")
txt <- c("Ik ging op reis en ik nam mee: mijn laptop, mijn zonnebril en goed humeur.", "Deze zin is een andere test.")
x <- tokens(txt, what = "sentence", remove_numbers = T, remove_punct = T, remove_url = T, remove_symbols = T)
x <- udpipe_annotate(udmodel_dutch, unlist(x))
x <- as.data.frame(x)
x <- document_term_frequencies(x[, c("doc_id", "lemma")])
dtm <- document_term_matrix(x)
答案 2 :(得分:0)
其中lemmas是一个包含$ word和$ lemma列的超过100k行的data.table。 txttokens平均每个1000字的10k文本:
txttokens <- tokens_replace(txttokens,lemmas$word,lemmas$lemma)
执行时间不到5秒